1

我有一个应用程序,它记录数据并使用 fastLine 系列在 TeeChart 中连续显示,时间作为 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;

但这是一个可怕的“混乱”,因为当我经过午夜时 a) x 轴扩展以显示完整的 24 小时 b) 在最新点(靠近图表的最左侧)和午夜之前添加的最旧的剩余点(靠近图表的最右侧)。

替补...

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;

有效,但午夜前的点在午夜“丢失”,因为图表在清除后缓慢重新填充,这也不太理想。

最简单的“解决方案”是轴最小值和最大值是否可以跨越午夜边界,但似乎不可能将轴最大值设置为小于最小值。

我很想听听其他人可能遇到的任何替代解决方案来处理“午夜穿越”问题。

4

0 回答 0