Программирование для Android и работа с датчиками в среде Delphi 11 - страница 20
Рис. 29. Построение графиков из элементов Rectangle по данным таблицы.
Для линейногографика можно использовать компонент Path: TPath, рисующий полилинию, а также компонент PlotGrid, представляющий собой просто сетку. Чтобы координата Y шла вверх (а отсчет Y ведется от левого верхнего угла вниз), и находилась в пределах PlotGrid, можно координату Y задавать как:
y1:= Form1.Height – (Form1.Height – PlotGrid1.Height) – y;
var
p: TPointF;
i: Integer;
x,y,kX, kY, x1,x2,y1,y2:Double;
s: String;
begin
//Коэффициенты Х и Y
kX:= StrToFloat (Edit1.Text);
kY:= StrToFloat (Edit2.Text);
//Оси задаются
x:= 1; // Ось Y
y:= 1;
p.X:= x;
p.Y:= y;
Path1.Data.MoveTo (p);
x:= 1;
y:= 360;
p.X:= x;
p.Y:= y;
Path1.Data.LineTo (p);
x:= 1; // Ось Х
y:= 360;
p.X:= x;
p.Y:= y;
Path1.Data.MoveTo (p);
x:= 360;
y:= 360;
p.X:= x;
p.Y:= y;
Path1.Data.LineTo (p);
//Проверка наличия данных
if Memo1.Lines [0] = «» then
begin
ShowMessage («Введете данные X;Y!»);
Exit;
end;
//График
s:= Memo1.Lines [0];
s:= Copy (s,1,Pos (» -», s) -1); // Выделение Х из строки
x:= StrToFloat (s);
s:= Memo1.Lines [0]; // Выделение Y из строки
s:= Copy (s, Pos (» -», s) +1,100);
y:= StrToFloat (s);
x1:= kX*x; // Учет коэффициентов для данных
y1:= Form1.Height – (Form1.Height – PlotGrid1.Height) – kY*y;
p.X:= x1;
p.Y:= y1;
Path1.Data.MoveTo (p); //Начало графика
//График
for i:= 1 to Memo1.Lines.Count-1 do
begin
s:= Memo1.Lines [i];
s:= Copy (s,1,Pos (» -», s) -1);
x:= StrToFloat (s);
s:= Memo1.Lines [i];
s:= Copy (s, Pos (» -», s) +1,100);
y:= StrToFloat (s);
x1:= kX*x;
y1:= Form1.Height – (Form1.Height – PlotGrid1.Height) – kY*y;
p.X:= x1;
p.Y:= y1;
Path1.Data.LineTo (p); // Очередная линия графика
end;
Надо заметить, что компонент рисует график сразу, причем самостоятельно масштабирует его во всю свою длину и ширину, так что можно просто наложить по размеру компонент на PlotGrid. Повторные графики рисуются с сохранением предыдущих, причем большие графики изменяют масштаб предыдущих, а меньшие рисуются в пределах существующего.
Рис. 30. Построение графиков с помощью компонента Path1 на фоне компонента PlotGrid.
Ранее заданные оси координат (синия линии по Х оси) автоматически увеличены под новый график.
«Стереть» линии можно просто с помощью Path1.Data.Clear.
Чтобы график не выходил за заданные масштабы и компонент не навязывал свой масштаб, данные для графика должны быть в пределах координатных заданных осей X и Y. Для того, чтобы задать масштаб компоненту нужно нарисовать вначале линии координат. Вводить данные можно из Memo.
Для масштабирования графика можно задать вводимый масштаб для данных через компоненты Edit:
kX:= StrToFloat (Edit1.Text);
kY:= StrToFloat (Edit2.Text);
Компонент Path можно использовать и для вывода данных в реальном времени, когда работа с данными периодически дополняет график, для этого достаточно добавлять данные в Memo и использовать его свойство onChage для перерисовки графика (очищаем график с помощью Path1.Data.Clear и рисуем заново с новыми данными).
Из простого графика можно получить полноценный прибор – регистратор сигнала. Регстратор позволяет задавать время дискретизации, коэффициент усиления сигнала, отображать текущие данные и их счет, листинг данных в Memo, копировать данные в буфер. Выбросы за пределы экрана не отображаются (прерывистый график). Дополнительный коэффициент позволяет преобразовать данные в единицы измерения (в нашем случае в температуру). При этом код получается очень компактным: