TeeChart中的午夜交叉,轴边界和数据存储顺序

时间:2012-07-10 03:45:30

标签: delphi teechart

我有一个应用程序记录数据并使用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;

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

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

我很想知道任何其他解决方案 其他任何人都可能遇到过“午夜穿越”问题。

0 个答案:

没有答案