Пересечение полуночи, границы осей и порядок хранения данных в TeeChart

У меня есть приложение, которое записывает данные и непрерывно отображает их в TeeChart, используя серию fastLine со временем в качестве оси X, используя...

Chart1.Axes.Bottom.DateTimeFormat:='hh:mm:ss';

Данные добавляются примерно с одной точкой в ​​секунду, но я хочу ограничить количество отображаемых точек последним добавленным значением MaxPoints (MaxPoints — это целочисленная переменная, которая может быть обновлена ​​пользователем в любое время). После отображения MaxPoints данные должны прокручиваться по экрану по мере их добавления, как на ленточной диаграмме.

Я попробовал следующее, где TheTime - Frac (Now)...

procedure TGraphForm.AddPoints(TheTime,TheData : real);
begin
  Chart1.Series[0].AddXY(TheTime,TheData);
  while (Chart1.Series[0].Count > MaxPoints) do
    Chart1.Series[0].Delete(0);
end;

Это работает отлично до полуночи, когда дисплей зависает. Я понимаю, что проблема в том, что данные сортируются по мере их добавления, поэтому Series[0].Delete(0) удаляет данные с наименьшим значением x (т.е. самый новый фрагмент данных, добавленный в полночь, а не самый старый часть данных, добавленных в серию.

Я попытался спасти вещи, добавив внешний

var 
  DeleteIndex : integer 

и изменить процедуру на...

procedure TGraphForm.AddPoints(TheTime,TheData : real);
begin
  if TheTime >= Chart1.Series[0].MaxXValue then
    DeleteIndex := 0
  else
    inc(DeleteIndex);
  Chart1.Series[0].AddXY(TheTime,TheData);
  while (Chart1.Series[0].Count > MaxPoints) do
    Chart1.Series[0].Delete(DeleteIndex);
  end;
end;

но это ужасный «кладж», как тогда, когда я прохожу полночь а) ось X расширяется, чтобы показать полные 24 часа и б) есть линия, проведенная между самой новой точкой (около крайней левой точки графика) и самая старая оставшаяся точка из тех, что были добавлены до полуночи (в крайнем правом углу графика).

Альтернативный...

procedure TGraphForm.AddPoints(TheTime,TheData : real);
begin
  if TheTime < Chart1.Series[0].MaxXValue then
    Chart1.Series[0].Clear;
  Chart1.Series[0].AddXY(TheTime,TheData);
  while (Chart1.Series[0].Count > MaxPoints) do
    Chart1.Series[0].Delete(0);
end;

работает, но предполуночные точки «теряются» в полночь, так как график медленно заполняется заново после очистки, что также нежелательно.

Простейшим «решением» было бы, если бы минимальная и максимальная оси могли пересекать полуночную границу, но кажется невозможным установить максимум оси меньше минимума.

Мне было бы интересно услышать о любых альтернативных решениях, с которыми кто-либо еще мог столкнуться для решения проблемы «пересечения полуночи».


person Penguino    schedule 10.07.2012    source источник
comment
К сожалению, TeeChart намного умнее меня. Если я просто придерживаюсь первой процедуры, но устанавливаю для TheTime значение Now, а не Frac(Now), все работает отлично.   -  person Penguino    schedule 10.07.2012
comment
Это из-за формата TDateTime в Delphi. Переменные этого типа являются двойными. Целая часть представляет дату, а дробная часть представляет время дня, как описано здесь: stackoverflow.com/questions/1760929/   -  person Narcís Calvet    schedule 10.07.2012
comment
@ user1511037, вы должны добавить свой комментарий в качестве ответа для лучшей видимости. Это приемлемо и поощряется в SO.   -  person LU RD    schedule 10.07.2012