2

有谁知道如何在 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。

任何帮助是极大的赞赏。

4

1 回答 1

6

我可以想到两个选择:

  1. 如实时图表文章中所述,将 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;
    
  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]之类的系列,而不是第一个示例中的Repaint调用中的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;
    
于 2011-09-23T11:30:32.457 回答