IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Быстрое рисование графиков в TChart, Возможно ли?
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Проблема в следующем:

С АЦП с большой скоростью поступают числовые значения. Необходимо выводить все эти значения на график. Пробовал использовать компонент TChart, но рисование выполняется очень медленно(использовал метод LineTo), вследствие чего переполняется буфер со значениями АЦП и программа закрывается. Возможно ли использовать для таких целей TChart?

Также пробовал использовать канву, график вроде как успевает рисоваться. Но возникает проблема с прокруткой изображения. Я помещал PaintBox на ScrollBox. Если изменять свойство Position у ScrollBox'a при выводе каждой точки, то график опять начинает рисоваться очень медленно.

Подскажите возможно ли мне использовать TChart? Если все же придется использовать канву, то как сделать автоматическую прокрутку изображения при рисовании графика?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
Я стал рисовать на канве. Все точки успевают выводиться. Но есть проблема. Выводится часть точек и затем точки начинают выводиться не на канве, а в произвольном месте формы (началом координат становится левый верхний угол экрана). Заметил, что начинается это часто после движения мышки или перемещения формы. Из-за чего такое может быть?
Также я решил отказаться от прокрутки.Как только отображение доходит до правого края канвы, содержимое канвы очищается и вывод продолжается с левого края.
Не знаю уж, как ты рисовал на канве, что у тебя программа так себя ведет.

Я бы и от прокрутки не отказывался. Положил я на форму 2 кнопки (btnStart + btnStop) и PaintBox, и сделал так:

const
MaxValue = 7000;
Fresh = 10;

Function GetValue() : Integer;
begin
result := Random(MaxValue);
end;

procedure TForm1.DrawIt;
var
CurrX, CurrY, PrevY : Integer;
SrcR, DstR, FillR: TRect;
begin
CurrX := 0;
PaintBox1.Canvas.Pen.Color := clRed;
PaintBox1.Canvas.Brush.Color := clBtnFace;

SrcR := Rect(Fresh, 0, PaintBox1.Width, PaintBox1.Height);
DstR := Rect(0, 0, PaintBox1.Width - Fresh, PaintBox1.Height);
FillR := Rect(PaintBox1.Width - Fresh, 0, PaintBox1.Width, PaintBox1.Height);

PaintBox1.Canvas.MoveTo(CurrX, PaintBox1.Height);
while Draw_Graph do
begin
if CurrX + Fresh >= PaintBox1.Width then
begin
PaintBox1.Canvas.CopyRect(DstR, PaintBox1.Canvas, SrcR);
PaintBox1.Canvas.FillRect(FillR);
PaintBox1.Canvas.MoveTo(CurrX - Fresh, PaintBox1.Height - PrevY);
end
else
begin
Inc(CurrX, Fresh);
end;
CurrY := GetValue() * PaintBox1.Height div MaxValue;
PaintBox1.Canvas.LineTo(CurrX, PaintBox1.Height - CurrY);
PrevY := CurrY;

Sleep(100); // Для теста, тестировалось вплоть до Sleep(1)
Application.ProcessMessages; // Чтоб нажатие на btnStop отловить, да и другие сообщения
end;
end;

procedure TForm1.btnStartClick(Sender: TObject);
begin
if not Draw_Graph then
begin
Randomize;
Draw_Graph := True;
DrawIt;
end;
end;

procedure TForm1.btnStopClick(Sender: TObject);
begin
Draw_Graph := False;
end;
, прокручивается, рисует график. Что я не так делаю?
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.05.2024 3:49
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name