TScrollPagerTool问题

时间:2013-08-19 06:28:17

标签: delphi teechart

我在购买之前尝试使用TeeChart软件,并从他们的网站直接到这里寻求支持。 我试图使用TScrollPagerTool来解决这个问题,因为它似乎非常适合我想要实现的目标,但是在调整大小时我遇到了性能问题。 在图表的resize事件中,如果您使用此滚动工具,建议添加以下行:

ScrollPagerTool.Series := Chart1.Series[0];

我不知道为什么你必须重新分配系列,但如果没有它,图表将不会调整大小。此外,该行有效地再次添加了Series,这意味着我现在有两倍的系列,下一次调整大小,系列的3倍等等,因此在调整几次后滚动会出现性能问题。

有人可以告诉我,我这样做是对吗还是替代方法吗?

如果需要,我可以发布更多代码。

1 个答案:

答案 0 :(得分:0)

首先请注意,TScrollPagerTool使用TSubChartTool并在其中包含主系列的克隆。这就是分配Series时设置SubChart的原因,因为没有系列就没有意义。

在某些TeeChart版本中,当您为工具指定系列时,SubChart需要已绘制主图表,以便计算每个图表应使用的空间(ChartRect s)。这就是为什么我们在OnResize事件中分配系列,但我在TeeChart VCL中看到你可以在创建时完成所有这些:

uses Series, TeeScrollPagerTool;

procedure TForm1.FormCreate(Sender: TObject);
begin        
  Chart1.AddSeries(TLineSeries).FillSampleValues;
  (Chart1.Tools.Add(TScrollPagerTool) as TScrollPagerTool).Series:=Chart1[0];
end;

<强> BUG:

我已经看到实际上有一个错误,正如你所说。在OnResize事件中分配系列以使图表和子图表随表单一起调整大小,它使源系列一次又一次地被克隆:

uses Series, TeeScrollPagerTool;

var scrollPager1: TScrollPagerTool;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Chart1.Align:=alClient;

  scrollPager1:=Chart1.Tools.Add(TScrollPagerTool) as TScrollPagerTool;

  Chart1.AddSeries(TLineSeries).FillSampleValues;
  scrollPager1.Series:=Chart1[0];
end;

procedure TForm1.Chart1Resize(Sender: TObject);
begin
  scrollPager1.Series:=Chart1[0];
end;

我做了一些修改来修复它:

在下一个版本中,Series属性将删除子图中的所有系列,并将克隆分配的系列。所以多次调用它不会导致越来越多的克隆。它还会调用SetUpScrollPager来计算主图表和子图表的ChartRect

我还公开了SetUpScrollPager,因此我们可以在OnResize事件中调用ChartRect来调整procedure TForm1.Chart1Resize(Sender: TObject); begin scrollPager1.SetUpScrollPager; end; ,而无需添加或删除系列。

OnResize

解决方法:

同时,对于实际版本,您仍然可以删除SubChart中的所有系列,并使用Series属性克隆源系列,所有这些都在procedure TForm1.Chart1Resize(Sender: TObject); begin scrollPager1.SubChartTChart.RemoveAllSeries; scrollPager1.Series:=Chart1[0]; end; 事件中:

SubChartTChart

相关功能:

如何在ScollPager中拥有多个系列?您可以使用Series属性访问子图表,并向其添加/删除任何系列。但是你仍然需要uses Series, TeeScrollPagerTool; var scrollPager1: TScrollPagerTool; procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin Chart1.Align:=alClient; scrollPager1:=Chart1.Tools.Add(TScrollPagerTool) as TScrollPagerTool; for i:=0 to 4 do begin Chart1.AddSeries(TLineSeries).FillSampleValues; if scrollPager1.Series=nil then scrollPager1.Series:=Chart1[i] else scrollPager1.SubChartTChart.AddSeries(CloneChartSeries(Chart1[i])); end; end; 属性中的一个系列。所以它有点棘手:

AddSeries(const Value: TChartSeries)

这就是为什么我还添加了一个新的 for i:=0 to 4 do begin Chart1.AddSeries(TLineSeries).FillSampleValues; scrollPager1.AddSeries(Chart1[i]); end; 方法。使用它向ScrollPager添加几个系列:

{{1}}