Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 600

/ вопрос решён /

Здравствуйте!
Вообщем возникла такая проблема. надо построить график без задачи шага.В голове вроде как схема простроилась как это сделать,а вот реализовать на коде не получается. Вот то до чего до пер:

Программа рисует один раз график и дальше зависает. подскажите где ошибка(и)
p.s Delphi XE7

Приложение:
  1. //==============================================
  2. function f1( x : real ): real;
  3. begin
  4. f1:= sin(x)
  5. end;
  6. //==============================================
  7.  
  8. procedure TForm2.Button1Click(Sender: TObject);
  9. var x,
  10.  
  11.  
  12.  
  13. :real;
  14.  
  15. //f: TextFile;
  16. Prom : string;
  17.  
  18. begin
  19.  
  20.  
  21.  
  22.  
  23.  
  24. i:=1;
  25. x:=x1;
  26. dx:=5;
  27.  
  28.  
  29. StringGrid1.Cells[0,0]:=' i'; //
  30.  
  31. StringGrid1.Cells[2,0]:=' X'; //
  32. series1.Clear;
  33.  
  34.  
  35. //Rewrite(f);
  36. while dx<>0 do begin
  37. series1.Clear;
  38. while x<= xk do
  39. begin
  40.  
  41.  
  42. //Writeln(f,i,x:10:3,f1(x):10:3);
  43.  
  44.  
  45.  
  46.  
  47. x:=x+dx;
  48. i:=i+1;
  49. end;
  50. Gauge1.Progress:=100;
  51. // CloseFile(f);
  52.  
  53.  
  54.  
  55. dx:=dx/2;
  56.  
  57.  
  58. end;
  59.  
  60. end;
  61.  
  62. end.
  63.  


kartoshkka Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: kartoshkka (статус: Посетитель)
Вопрос отправлен: 3 октября 2015, 16:15
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: DNK

Здравствуйте, kartoshkka!
1. Учись дебажить программы. Breakpoints, watches, F8, F7 тебе в помощь.
2. Деля real пополам, ты через сколько лет думаешь дождаться, когда он станет равен 0? Вообще проверять типы данных с плавающей точкой на равенство нулю жутко опасная вещь (подучи матчасть). В результате схема сомнительна. Для чего нужен такой бесконечный цикл построения графиков? Ну и подведя итог это всё работает так: начинается цикл - очищается график - во вложенном строится график - вложенный цикл заканчивается по условию x<= xk - график сохраняется в файл и буфер - dx/2 - новая итерация цикла - очищается график - вложенный цикл построения графика пропускается (т.к. значение x не изменилось) - график сохраняется в файл и буфер - dx/2 - новая итерация цикла - и так почти до бесконечности.

>> Как тогда сделать чтоб во вложенный цикл она заходила снова?

Элементарно! Изменить x перед вложенным циклом.

Ответ отправил: DNK (статус: Студент)
Время отправки: 6 октября 2015, 10:06


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 15 октября 2015, 15:51; участников в обсуждении: 3.
DNK

DNK (статус: Студент), 3 октября 2015, 16:50 [#1]:

1. Учись дебажить программы. Breakpoints, watches, F8, F7 тебе в помощь.
2. Деля real пополам, ты через сколько лет думаешь дождаться, когда он станет равен 0? Вообще проверять типы данных с плавающей точкой на равенство нулю жутко опасная вещь (подучи матчасть). В результате схема сомнительна. Для чего нужен такой бесконечный цикл построения графиков? Ну и подведя итог это всё работает так: начинается цикл - очищается график - во вложенном строится график - вложенный цикл заканчивается по условию x<= xk - график сохраняется в файл и буфер - dx/2 - новая итерация цикла - очищается график - вложенный цикл построения графика пропускается (т.к. значение x не изменилось) - график сохраняется в файл и буфер - dx/2 - новая итерация цикла - и так почти до бесконечности.
"Digital Networked Knight"
kartoshkka

kartoshkka (статус: Посетитель), 4 октября 2015, 07:37 [#2]:

Спасибо за пояснения.
Мне и надо чтоб цикл не остановился, а график постоянно рисовал все плавнее и плавнее.
"вложенный цикл построения графика пропускается (т.к. значение x не изменилось) - график сохраняется в файл и буфер - dx/2 - новая итерация цикла - и так почти до бесконечности."
Как тогда сделать чтоб во вложенный цикл она заходила снова? потом хотел дописать кнопку выхода из цикла,чтоб можно было по принуждению остановить программу, когда посчитаю что график нарисован так как мне надо.
DNK

DNK (статус: Студент), 4 октября 2015, 13:00 [#3]:

Элементарно! Изменить x перед вложенным циклом.
"Digital Networked Knight"
kartoshkka

kartoshkka (статус: Посетитель), 5 октября 2015, 12:54 [#4]:

все всем спасибо. уже сам сообразил. программа написана

9 октября 2015, 13:23: Статус вопроса изменён на решённый (изменил модератор DNK)

zvygin1964

zvygin1964 (статус: Посетитель), 9 октября 2015, 19:39 [#5]:

Покажите.
kartoshkka

kartoshkka (статус: Посетитель), 14 октября 2015, 07:36 [#6]:

если кому то еще интересно)
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VclTee.TeeGDIPlus, VCLTee.TeEngine,
  VCLTee.Series, Vcl.ExtCtrls, VCLTee.TeeProcs, VCLTee.Chart, Vcl.StdCtrls,
  Vcl.Grids;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Chart1: TChart;
    Series1: TLineSeries;
    Button2: TButton;
    StringGrid1: TStringGrid;
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    x1: TLabel;
    Label3: TLabel;
    procedure button1clik(Sender: TObject);
    procedure button2clik(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;  NeedStop: integer;
 
implementation
 
{$R *.dfm}
  function f1( x : real ): real;
  begin
    f1:=sin(x);
  end;
procedure TForm1.button2clik(Sender: TObject);    //
  begin                                           // кнопка выхода из цикла.
    NeedStop := 1;                                //
  end;                                            //
 
procedure TForm1.button1clik(Sender: TObject);
var
  x,
  dx,// шаг изменения шага
  x1,//начальная граница графика
  xk //конечная граница графика
  :real;
  i: integer;//счетчик
  f: TextFile;
  Prom : string;
  begin
    NeedStop := 0;
    x1:=StrToFloat(Edit1.Text); // приравниваем начальное значение
                                // к значению из первого окна
    xk:=StrToFloat(Edit2.Text); // приравниваем конечное значение
                                // к значению из второго окна
    dx:=8;
 
    while NeedStop = 0  do
      begin
        AssignFile(f,'C:Usersпрограмированиетаблица значений x и у.txt');
        Rewrite(f);
        i:=1;
        StringGrid1.rowCount:=1;
        StringGrid1.Cells[0,0]:=' i'; //
        StringGrid1.Cells[1,0]:=' Y'; // Делаем шапку таблицы
        StringGrid1.Cells[2,0]:=' X'; //
        x:=x1;
        series1.Clear;                //очищаем график
        label1.Caption:='dx= '+ FloatToStrF(dx, ffFixed,10,4); //выводим текущее dx
        while x<= xk do
          begin
            application.ProcessMessages;  //процесс плавного отображение процесса
            Writeln(f,i,x:10:3,f1(x):10:3); // запись данных в файл
            StringGrid1.RowCount:=StringGrid1.RowCount + 1;// добавляем строку для таблицы
            stringgrid1.Cells[2,i]:=FloatToStrF(x, ffFixed,10,4); //значение Х
            StringGrid1.Cells[0,i]:=intToStr(i); // номер строки
            StringGrid1.Cells[1,i]:=FloatToStrF(f1( x ), ffFixed,10,4);// значение у
            Series1.AddXY(x, f1(x));// рисование графика
            x:=x+dx;
            i:=i+1;
          end;
        dx:=(dx/1.5);
        sleep(1000);  // задержка процесса
        CloseFile(f); // закрытие файла со значениями
        Prom:='график'; // Имя графического файла рисунка
        Chart1.SaveToBitmapFile('C:UsersпрограмированиеGRAFIK.jpg'); // Создание графического файла рисунка
        Chart1.CopyToClipboardBitmap; // Копирование рисунка в буфер
      end;
 
  end;
 
 
end.
kartoshkka

kartoshkka (статус: Посетитель), 14 октября 2015, 16:00 [#7]:

Ребят, чтоб не заводить новую тему. программу дальше дорабатываю. добавил mainmenu. как сделать чтобы она не закрывалась при нажатии одной кнопки. ну т.е. я делаю в этом меню галочки на просчет доп функций у графика. и мне не надо чтобы менющка постоянно закрывалась.
DNK

DNK (статус: Студент), 15 октября 2015, 09:48 [#8]:

Если у бабушки будут половые признаки дедушки, то...
"Digital Networked Knight"
kartoshkka

kartoshkka (статус: Посетитель), 15 октября 2015, 14:58 [#9]:

хорошо попробую еще раз. mainmenu. поставил активность checked. Но если я нажимаю один раз на галочку то меню закрывается. а мне надо сначала выбрать несколько пунктов и тока потом закрыть меню
DNK

DNK (статус: Студент), 15 октября 2015, 15:51 [#10]:

Тоже ещё раз. Указанный сценарий использования не подходит под определение меню. Сделай пункт меню "Доп. функции...", открывающее окно с православными CheckBox'ами. Окно можно сделать bsToolWindow, fsStayOnTop.
"Digital Networked Knight"

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 16 ноября 2024, 15:42
Выполнено за 0.03 сек.