我使用的是带有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
的属性)相加。