|
Вопрос # 6 600/ вопрос решён / |
|
Здравствуйте!
Вообщем возникла такая проблема. надо построить график без задачи шага.В голове вроде как схема простроилась как это сделать,а вот реализовать на коде не получается. Вот то до чего до пер:
Программа рисует один раз график и дальше зависает. подскажите где ошибка(и)
p.s Delphi XE7
Приложение: Переключить в обычный режим- //==============================================
- function f1( x : real ): real;
- begin
- f1:= sin(x)
- end;
- //==============================================
-
- procedure TForm2.Button1Click(Sender: TObject);
- var x,
-
-
-
- :real;
-
- //f: TextFile;
- Prom : string;
-
- begin
-
-
-
-
-
- i:=1;
- x:=x1;
- dx:=5;
-
-
- StringGrid1.Cells[0,0]:=' i'; //
-
- StringGrid1.Cells[2,0]:=' X'; //
- series1.Clear;
-
-
- //Rewrite(f);
- while dx<>0 do begin
- series1.Clear;
- while x<= xk do
- begin
-
-
- //Writeln(f,i,x:10:3,f1(x):10:3);
-
-
-
-
- x:=x+dx;
- i:=i+1;
- end;
- Gauge1.Progress:=100;
- // CloseFile(f);
-
-
-
- dx:=dx/2;
-
-
- end;
-
- end;
-
- end.
-
|
Вопрос задал: 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 (статус: Студент), 3 октября 2015, 16:50 [#1]:
1. Учись дебажить программы. Breakpoints, watches, F8, F7 тебе в помощь.
2. Деля real пополам, ты через сколько лет думаешь дождаться, когда он станет равен 0? Вообще проверять типы данных с плавающей точкой на равенство нулю жутко опасная вещь (подучи матчасть). В результате схема сомнительна. Для чего нужен такой бесконечный цикл построения графиков? Ну и подведя итог это всё работает так: начинается цикл - очищается график - во вложенном строится график - вложенный цикл заканчивается по условию x<= xk - график сохраняется в файл и буфер - dx/2 - новая итерация цикла - очищается график - вложенный цикл построения графика пропускается (т.к. значение x не изменилось) - график сохраняется в файл и буфер - dx/2 - новая итерация цикла - и так почти до бесконечности.
"Digital Networked Knight"
|
|
kartoshkka (статус: Посетитель), 4 октября 2015, 07:37 [#2]:
Спасибо за пояснения.
Мне и надо чтоб цикл не остановился, а график постоянно рисовал все плавнее и плавнее.
"вложенный цикл построения графика пропускается (т.к. значение x не изменилось) - график сохраняется в файл и буфер - dx/2 - новая итерация цикла - и так почти до бесконечности."
Как тогда сделать чтоб во вложенный цикл она заходила снова? потом хотел дописать кнопку выхода из цикла,чтоб можно было по принуждению остановить программу, когда посчитаю что график нарисован так как мне надо.
|
|
DNK (статус: Студент), 4 октября 2015, 13:00 [#3]:
Элементарно! Изменить x перед вложенным циклом.
"Digital Networked Knight"
|
|
kartoshkka (статус: Посетитель), 5 октября 2015, 12:54 [#4]:
все всем спасибо. уже сам сообразил. программа написана
|
9 октября 2015, 13:23: Статус вопроса изменён на решённый (изменил модератор DNK)
|
zvygin1964 (статус: Посетитель), 9 октября 2015, 19:39 [#5]:
Покажите.
|
|
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 (статус: Посетитель), 14 октября 2015, 16:00 [#7]:
Ребят, чтоб не заводить новую тему. программу дальше дорабатываю. добавил mainmenu. как сделать чтобы она не закрывалась при нажатии одной кнопки. ну т.е. я делаю в этом меню галочки на просчет доп функций у графика. и мне не надо чтобы менющка постоянно закрывалась.
|
|
DNK (статус: Студент), 15 октября 2015, 09:48 [#8]:
Если у бабушки будут половые признаки дедушки, то...
"Digital Networked Knight"
|
|
kartoshkka (статус: Посетитель), 15 октября 2015, 14:58 [#9]:
хорошо попробую еще раз. mainmenu. поставил активность checked. Но если я нажимаю один раз на галочку то меню закрывается. а мне надо сначала выбрать несколько пунктов и тока потом закрыть меню
|
|
DNK (статус: Студент), 15 октября 2015, 15:51 [#10]:
Тоже ещё раз. Указанный сценарий использования не подходит под определение меню. Сделай пункт меню "Доп. функции...", открывающее окно с православными CheckBox'ами. Окно можно сделать bsToolWindow, fsStayOnTop.
"Digital Networked Knight"
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|