只将当前数据加载到TChart

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

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

  • 是否可以从数据库(使用LIMIT和OFFSET)加载仅在TChart的当前滚动“窗口”中需要显示的数据?
  • 您可以手动循环数据并调用Add() / AddXY()函数。
    然后,在OnScroll事件中,您可以移除超出/远离轴范围的点,并将其添加到轴范围内/旁边。

  • 当我滚动到没有数据的区域时,是否有一些“数据需要”事件触发?
  • OnScroll 。您应该使用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 / AddXYAddActive

    链接地址: http://www.djcxy.com/p/35043.html

    上一篇: Load only current data into TChart

    下一篇: Different Node Representation