将XValues从一个TChartSeries复制到另一个TChartSeries

时间:2011-09-23 11:15:48

标签: delphi memory-leaks teechart

有没有人知道如何在Delphi7(和TeeChart 4.04)中将XValues从一个TChartSeries复制到另一个? TChartSeries.ReplaceList(CopySeries.XValues, OriginalSeries.XValues)不起作用,因为它似乎替换了引用,所以当更改OriginalSeries时,CopySeries也是如此。 CopySeries的长度等于或大于OriginalSeries。我想保留CopySeries.YValues。

我的解决方法是创建临时列表

Dummy := TChartSeries.Create(nil);
Dummy.AssignValues(OriginalSeries);
CopySeries.ReplaceList(CopySeries.XValues, Dummy.XValues);
Dummy.YValues.Destroy;

但由于我无法销毁Dummy,因此我得到了内存泄漏,因为这也删除了CopySeries.XValues引用的Dummy.XValues。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

我可以想到两个选择:

  1. 将ValueList数组直接分配给该系列,如Real-time Charting文章中所述,例如:

    uses Series;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Chart1.AddSeries(TLineSeries.Create(Self)).FillSampleValues;
      Chart1.AddSeries(TLineSeries.Create(Self));
    
      { set our X array }
      Chart1[1].XValues.Value:=Chart1[0].XValues.Value;  { <-- the array }
      Chart1[1].XValues.Count:=Chart1[0].Count;          { <-- number of points }
      Chart1[1].XValues.Modified:=True;                  { <-- recalculate min and max }
    
      { set our Y array }
      Chart1[1].YValues.Value:=Chart1[0].YValues.Value;
      Chart1[1].YValues.Count:=Chart1[0].Count;
      Chart1[1].YValues.Modified:=True;
    
      { Show data }
      Chart1.Series[1].Repaint;
    end;
    
  2. 克隆系列:

    uses Series;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       Chart1.AddSeries(TLineSeries.Create(Self)).FillSampleValues;
       Chart1.AddSeries(CloneChartSeries(Chart1[0]));
    end;
    
  3. 如果您使用的是TeeChart 4.04,您可能需要处理 Chart1.Series [0] 等系列,而不是 Chart1 [0] 。第一个示例中的重绘调用。或者你可以尝试这样的事情:

    uses Series, Math;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var i, MinNumValues, MaxNumValues: Integer;
    begin
      Chart1.AddSeries(TLineSeries.Create(Self)).FillSampleValues(15);
      Chart1.AddSeries(TLineSeries.Create(Self)).FillSampleValues(25);
    
      MinNumValues:=Min(Chart1.Series[0].Count, Chart1.Series[1].Count);
      MaxNumValues:=Max(Chart1.Series[0].Count, Chart1.Series[1].Count);
    
      for i:=0 to MinNumValues -1 do
        Chart1.Series[1].XValue[i]:=Chart1.Series[0].XValue[i];
    
      for i:=MinNumValues to MaxNumValues-1 do
        Chart1.Series[1].ValueColor[i] := clNone;
    end;