仅将当前数据加载到TChart中



我使用的是带有TChart、TPointSeries、水平滚动的Delphi 10,目前从PostgreSQL数据库加载的数据太多(100条曲线,每条曲线包含数千个点)。

  • 是否可以从数据库(使用LIMIT和OFFSET)仅加载需要在TChart的当前滚动"窗口"中显示的数据
  • 当我滚动到没有数据的区域时,是否有一些"需要数据"事件触发
  • 是否可以在不加载所有这些点的情况下通知TChart我有多少点
  • 只有当我选中图例中相应的复选框时,才能将图例中所有曲线的描述加载到图表中吗?我不希望"图表"显示数据库中所有可用的系列,但希望它在图例中显示所有可用系列。当用户点击图例中的特定系列时,相应的系列数据将被加载并表示为曲线
  • 是否可以从数据库(使用LIMIT和OFFSET)仅加载需要在TChart的当前滚动"窗口"中显示的数据

您可以手动循环数据并调用Add()/AddXY()函数
然后,在OnScroll事件中,您可以删除轴范围外/远处的点,并将这些点添加到轴范围内/旁边。

  • 当我滚动到没有数据的区域时,是否有一些"需要数据"事件触发

否。您应该使用OnScroll事件并自己检查它。

更新

下面提供了可以做什么的示例:

constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
chart.OnScroll := chartScroll;
chart.OnZoom := chartZoom;
end;
procedure TForm1.displayRange();
var startDate, endDate: TDateTime;
begin
startDate := TDateTime(chart.BottomAxis.Minimum);
endDate   := TDateTime(chart.BottomAxis.Maximum);
Log(Format('start=%d, end=%d', [
FindClosestIndex(startDate, chart.Series[0].XValues),
FindClosestIndex(endDate, chart.Series[0].XValues)
]));
end;
procedure TForm1.chartScroll(Sender: TObject);
begin
displayRange();
end;
procedure TForm1.chartZoom(Sender: TObject);
begin
displayRange();
end;

这里可以举一个FindClosestIndex的例子。

更新结束

  • 是否可以在不加载所有这些点的情况下通知TChart我有多少点

没有,但你可以维护变量来做这件事。

  • 只有当我选中图例中相应的复选框时,才能在图例中包含所有曲线的描述并将实际数据加载到图表中吗?我不希望"图表"显示数据库中所有可用的系列,但希望它在图例中显示所有可用系列。当用户点击图例中的特定系列时,相应的系列数据将被加载并表示为曲线

您可以使用OnCLickLegend事件并循环您的系列。此时,该系列的Active属性是最新的,因此您可以将Clear(属于not Active的属性)和Add/AddXY(指向属于Active的属性)相加。

相关内容

  • 没有找到相关文章

最新更新