Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2017, 12:37   #1
URQq
Пользователь
 
Регистрация: 31.05.2016
Сообщений: 11
По умолчанию Трудности с построением кривых Chart в реальном времени

Здравствуйте.
Помогите, пожалуйста, разобраться с кодом отображения кривых в Chart`е.

Имеем: С прибора, раз в секунду, получаю данные и заношу их в ClientDataSet. После этого пытаюсь вывести их в Chart.
Chart`ов может быть до 5 шт., кривых в каждом до 13 шт. Область видимости автоматически прокручивается (min, max у Chart`ов) при получении данных, LeftAxis - время, TopAxis - значения. Первая колонка в таблице - дата и время полученных данных, в Chart не выводится.

На форме у меня только один Chart, а все остальные создаются динамически как его копии, в ScrollBox`е.
Код:
  PageControlSelf := TPageControl.Create(Self);
  PageControlSelf.Parent := Form1.ScrollBox1;
  PageControlSelf.Align := alLeft;
  PageControlSelf.Name := 'PageControlCol' + IntToStr(ColNam + 1);
  ...
  TabSheetSelf := TTabSheet.Create(Self);
  TWinControl(TabSheetSelf).Parent := PageControlSelf;
  TabSheetSelf.PageControl := PageControlSelf;
  TabSheetSelf.Name := 'TabSheetCol' + IntToStr(ColNam + 1);
  ...
  ChartColSelf := TChart.Create(Self);
  TWinControl(ChartColSelf).Parent := TabSheetSelf;
  ChartColSelf.Name := 'ChartCol' + IntToStr(ColNam + 1);
  ...
Проблема: Кривые выводятся, но с ошибками. Ниже код, который при скроллинге Chart`а мышкой, периодически сыпет ошибки доступа к (пустым) областям памяти(рис.1). Причём выскакивают эти ошибки, только, если активный Chart растянут на всю видимую область ScrollBox`а. Если же прокрутить ScrollBox так, что будет видна ещё и часть соседнего Chart`а (рис.2), то программа нормально скроллит активный Chart(без этих ошибок с памятью).

Ошибки эти связаны с процедурой:
procedure TWinControl.PaintHandler(var Message: TWMPaint);

Вопросы: Что за чудеса? Что я делаю не так?

Дополнение:
1) Каждую секунду добавляю данные в ClientDataSet и прокручиваю все активные Chart`ы(чтобы они соответствовали реальному времени):
Код:
    Form1.ScrollBar1.Position := Form1.ScrollBar1.Max;
    Form1.ClientDataSet4.DisableControls;
      Form1.ClientDataSet4.RecNo := Form1.ScrollBar1.Position + 1;
      DminCB4 := Form1.ClientDataSet4.Fields[0].Value;
    Form1.ClientDataSet4.EnableControls;
    if sInt = 60 then DmaxCB4 := DminCB4 + (12 * EncodeTime(0, 1, 0, 0))
    else DmaxCB4 := DminCB4 + (12 * EncodeTime(0, 0, sInt, 0));
    Form1.Chart1.LeftAxis.SetMinMax(DminCB4, DmaxCB4);
    Form1.Chart1.Refresh;
    for iCB4 := 1 to ColNam do
    begin
      ChartColSelfiCB4 := Form1.FindComponent('ChartCol' + IntToStr(iCB4)) as TChart;
      ChartColSelfiCB4.LeftAxis.SetMinMax(Form1.Chart1.LeftAxis.Minimum, Form1.Chart1.LeftAxis.Maximum);
      ChartColSelfiCB4.Refresh;
    end;
    GrafBuild;
2) GrafBuild - процедура постройки кривых в Chart`ах, выглядит так:
Код:
  for jGrB := 1 to ColNam do
  begin
    ChartColSelfGrB := Form1.FindComponent('ChartCol' + IntToStr(jGrB)) as TChart;
    ChartColSelfGrB.AutoRepaint := false;
    ChartColSelfGrB.SeriesList.ClearValues;
    for iGrB := 0 to ChartColSelfGrB.SeriesCount - 1 do
    begin
      Form1.ClientDataSet3.DisableControls;
      ChartColSelfGrB.Series[iGrB].BeginUpdate;
      for mGrB := 1 to Form1.ClientDataSet3.RecordCount do
      begin
        Form1.ClientDataSet3.RecNo := mGrB;
        if Form1.ClientDataSet3.Fields[iGrB + 1].Value <> Null then
          ChartColSelfGrB.Series[iGrB].AddXY(Form1.ClientDataSet3.Fields[iGrB + 1].Value, Form1.ClientDataSet3.Fields[0].Value, '');
      end;
      ChartColSelfGrB.Series[iGrB].EndUpdate;
      Form1.ClientDataSet3.EnableControls;
   end;
    ChartColSelfGrB.AutoRepaint := true;
    ChartColSelfGrB.Refresh;
Извините за много текста. Заранее спасибо.
Изображения
Тип файла: jpg 1.jpg (57.9 Кб, 119 просмотров)
Тип файла: jpg 2.jpg (60.5 Кб, 123 просмотров)
URQq вне форума Ответить с цитированием
Старый 23.10.2017, 19:48   #2
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
получаю данные и заношу их в ClientDataSet. После этого пытаюсь вывести их в Chart
А вы в курсе, что есть еще DBChart?
kropotkina-alice вне форума Ответить с цитированием
Старый 24.10.2017, 06:36   #3
URQq
Пользователь
 
Регистрация: 31.05.2016
Сообщений: 11
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
А вы в курсе, что есть еще DBChart?
Конечно в курсе, но программа не такая простая, чтоб его использовать. =)
Например: 1) есть чекбокс, который позволяет "открепить" каждую кривую от общего масштаба. В этом случае надо будет пересчитывать координаты точек только этой кривой на общем графике. 2) прибор может работать и 10 часов, тогда придётся вводить фильтрацию БД, чтобы не отображались все точки ... и т.д. и т.п.
В общем и там и тут есть свои плюсы и минусы, но тут я, хотя бы, сам контролирую процесс.

По поводу моей проблемы: Ночь мучений и ... вроде есть результат. Код моей процедуры GrafBuild, описанный выше, работает с ошибками.
Проблема в этом:
Код:
ChartColSelfGrB.SeriesList.ClearValues;
Пришлось изобретать велосипед и прикручивать костыли.
Переписал её в таком виде и пока проблем нет:
Код:
  for jGrB := 1 to ColNam do
  begin
    ChartColSelfGrB := Form1.FindComponent('ChartCol' + IntToStr(jGrB)) as TChart;
    ChartColSelfGrB.SeriesList.ClearValues;    
  end;

  for jGrB := 1 to ColNam do
  begin
    ChartColSelfGrB := Form1.FindComponent('ChartCol' + IntToStr(jGrB)) as TChart;
    ChartColSelfGrB.AutoRepaint := false;
    for iGrB := 0 to ChartColSelfGrB.SeriesCount - 1 do
    begin
      Form1.ClientDataSet3.DisableControls;
      ChartColSelfGrB.Series[iGrB].BeginUpdate;
      for mGrB := 1 to Form1.ClientDataSet3.RecordCount do
      begin
        Form1.ClientDataSet3.RecNo := mGrB;
        if Form1.ClientDataSet3.Fields[iGrB + 1].Value <> Null then
          ChartColSelfGrB.Series[iGrB].AddXY(Form1.ClientDataSet3.Fields[iGrB + 1].Value, Form1.ClientDataSet3.Fields[0].Value, '');
      end;
      ChartColSelfGrB.Series[iGrB].EndUpdate;
      Form1.ClientDataSet3.EnableControls;
   end;
    ChartColSelfGrB.AutoRepaint := true;
    ChartColSelfGrB.Refresh;
У меня вопрос: Это уличная магия? =)
URQq вне форума Ответить с цитированием
Старый 24.10.2017, 07:25   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Похоже что проблемы у вас вот в этом:
Цитата:
Сообщение от URQq Посмотреть сообщение
На форме у меня только один Chart, а все остальные создаются динамически как его копии, в ScrollBox`е.
Лучше не копировать, а конструировать заново.
Цитата:
Сообщение от URQq Посмотреть сообщение
ChartColSelfGrB.Refresh;
У вас Lazarus?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 24.10.2017, 07:44   #5
URQq
Пользователь
 
Регистрация: 31.05.2016
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Лучше не копировать, а конструировать заново.
Я тоже сначала именно в эту сторону копал, но всё впустую. Я уже начинаю сомневаться в своих способностях ...
Дайте, пожалуйста, примерчик с кодом. Буду смотреть, что я не так делаю.

У меня: CodeGear 2007
URQq вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MVVM EF обновление БД в реальном времени Notan1310 WPF, UWP, WinRT, XAML 6 10.10.2015 16:20
Подсчет набранных символов в реальном времени. Zerdone Microsoft Office Word 1 04.10.2013 01:11
сложение ячеек в реальном времени Nenado БД в Delphi 4 03.02.2012 10:16
Обработка в реальном времени aferistz PHP 3 25.10.2011 18:03