我有一个应用程序,它记录数据并使用 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;
有效,但午夜前的点在午夜“丢失”,因为图表在清除后缓慢重新填充,这也不太理想。
最简单的“解决方案”是轴最小值和最大值是否可以跨越午夜边界,但似乎不可能将轴最大值设置为小于最小值。
我很想听听其他人可能遇到的任何替代解决方案来处理“午夜穿越”问题。