仅将当前数据加载到TChart中

时间:2017-01-12 12:30:32

标签: postgresql delphi scroll teechart

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

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

1 个答案:

答案 0 :(得分:1)

  
      
  • 是否可以从数据库(使用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的示例here

更新结束

  
      
  • 在没有加载所有这些要点的情况下,是否可以告知TChart我有多少积分?
  •   

不,但你可以保留变量。

  
      
  • 只有在检查图例中相应的复选框时,是否可以将图例中的所有曲线描述加载到图表中?我不希望图表显示数据库中可用的所有系列,但希望它在图例中显示所有可用的系列。当用户单击图例中的特定系列时,将加载相应的系列数据并将其表示为曲线。
  •   

您可以使用OnCLickLegend事件并循环播放您的系列。目前,该系列的Active属性是最新的,因此您可以Clear not Active那些Add / AddXY指向那些这是Active