2

XValues を Delphi7 (および TeeChart 4.04) である 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;

しかし、CopySeries.XValues によって参照される Dummy.XValues も削除されるため、ダミーを破棄できないため、メモリ リークが発生します。

どんな助けでも大歓迎です。

4

1 に答える 1

6

次の 2 つのオプションが考えられます。

  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 を使用している場合は、最初の例のRepaint呼び出しのように、Chart1[0]ではなく、Chart1.Series[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 に答える