1

データをログに記録し、fastLineシリーズを使用してTeeChartに継続的に表示し、x軸として時間を使用するアプリケーションがあります...

Chart1.Axes.Bottom.DateTimeFormat:='hh:mm:ss';

データは毎秒約1ポイントで追加されますが、表示されるポイントの数を最後に追加された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