У меня есть приложение, которое записывает данные и непрерывно отображает их в 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;
работает, но предполуночные точки «теряются» в полночь, так как график медленно заполняется заново после очистки, что также нежелательно.
Простейшим «решением» было бы, если бы минимальная и максимальная оси могли пересекать полуночную границу, но кажется невозможным установить максимум оси меньше минимума.
Мне было бы интересно услышать о любых альтернативных решениях, с которыми кто-либо еще мог столкнуться для решения проблемы «пересечения полуночи».