我有一个应用程序记录数据并使用fastLine系列在TeeChart中连续显示,时间为x轴使用...
Chart1.Axes.Bottom.DateTimeFormat:='hh:mm:ss';
数据以每秒约一点的速度添加,但我希望将显示的点数限制为添加的最后一个MaxPoints(MaxPoints是一个整数变量,可以随时由用户输入更新)。显示MaxPoints后,数据应在添加时滚动到scrteen,如条带图中所示。
我尝试了以下内容,其中TheTime是Frac(现在)......
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;
但是当我午夜过夜时,这是一个可怕的'kludge'
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;
有效,但午夜之前的点数在午夜“丢失”,因为图表在清除后会慢慢重新填充,这也是不太理想的。
最简单的“解决方案”是轴的最小值和最大值可以越过午夜边界,但似乎不可能将轴最大值设置为小于最小值。
我很想知道任何其他解决方案 其他任何人都可能遇到过“午夜穿越”问题。