【问题标题】:Copy XValues from one TChartSeries to another将 XValues 从一个 TChartSeries 复制到另一个
【发布时间】:2011-11-23 14:18:01
【问题描述】:

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

非常感谢任何帮助。

【问题讨论】:

    标签: delphi memory-leaks teechart


    【解决方案1】:

    我能想到两个选择:

    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;
      
    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] 中的 第一个示例中的 Repaint 调用。或者你可以尝试这样的事情:

      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;
      

    【讨论】:

    • 感谢您的快速回复。我忘了提到我使用的是 Delphi7 和 TeeChart 4.04,所以我似乎无法使用语法:Value := Chart1.Series[0].XValues.Value. 我也无法使用 CloneChartSeries,因为我想保留 YValues。
    • @DavidHeffernan 我也这样做了。列表中的代码格式似乎与平时有点不同......
    • 我在Value := ...语法上得到[Error] '[' expected but := found
    • @Truls 好的,我为 TeeChart 4.04 添加了第三个解决方案选项。那怎么办?
    • 解决方案 3:只要 Series.XValues 的长度相同,就可以完美运行,但它们(通常)不同。因此,如果我使用这种方法,我将不得不删除 XValues-array 的其余部分。
    猜你喜欢
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多