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

Tru*_*uls 2 delphi memory-leaks teechart

有没有人知道如何在Delphi7(和TeeChart 4.04)中将XValues从一个TChartSeries复制到另一个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;
Run Code Online (Sandbox Code Playgroud)

但是我得到了内存泄漏,因为我无法销毁Dummy,因为它也会删除CopySeries.XValues引用的Dummy.XValues.

任何帮助是极大的赞赏.

Nar*_*vet 6

我可以想到两个选择:

  1. 像在Real-time Charting文章中一样将ValueList数组直接分配给系列,例如:

    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;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 克隆系列:

    uses Series;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       Chart1.AddSeries(TLineSeries.Create(Self)).FillSampleValues;
       Chart1.AddSeries(CloneChartSeries(Chart1[0]));
    end;
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    
    Run Code Online (Sandbox Code Playgroud)