Копировать XValues ​​из одной TChartSeries в другую - PullRequest
2 голосов
/ 23 сентября 2011

Кто-нибудь знает, как скопировать XValues ​​из одной TChartSeries в другую в Delphi7 (и TeeChart 4.04)? 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.XValues, на которые ссылается CopySeries.XValues.

Любая помощь очень ценится.

1 Ответ

6 голосов
/ 23 сентября 2011

Я могу представить себе два варианта:

  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.Серия [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;
    
...