From dddd7c85cd820d4e9536995cf7377ee11154e37f Mon Sep 17 00:00:00 2001 From: wp_xyz Date: Sat, 11 Feb 2023 18:01:52 +0100 Subject: [PATCH] TAChart: Fix TListChartSource.CopyFrom not copying additional x and y values. --- components/tachart/tacustomsource.pas | 15 ++++++++++++++- components/tachart/tasources.pas | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/components/tachart/tacustomsource.pas b/components/tachart/tacustomsource.pas index 47de2e48d1..553ff177a5 100644 --- a/components/tachart/tacustomsource.pas +++ b/components/tachart/tacustomsource.pas @@ -86,6 +86,7 @@ type TChartValueTextArray = array of TChartValueText; + PChartDataItem = ^TChartDataItem; TChartDataItem = packed record public X, Y: Double; @@ -93,6 +94,7 @@ type Text: String; XList: TDoubleDynArray; YList: TDoubleDynArray; + procedure CopyFrom(AItem: PChartDataItem); function GetX(AIndex: Integer): Double; function GetY(AIndex: Integer): Double; procedure SetX(AIndex: Integer; const AValue: Double); @@ -103,7 +105,6 @@ type function Point: TDoublePoint; inline; procedure MakeUnique; end; - PChartDataItem = ^TChartDataItem; TGraphToImageFunc = function (AX: Double): Integer of object; TIntegerTransformFunc = function (AX: Integer): Integer of object; @@ -536,6 +537,18 @@ end; { TChartDataItem } +procedure TChartDataItem.CopyFrom(AItem: PChartDataItem); +var + i: Integer; +begin + X := AItem^.X; + Y := AItem^.Y; + SetLength(XList, Length(AItem^.XList)); + for i := 0 to High(AItem^.XList) do XList[i] := AItem^.XList[i]; + SetLength(YList, Length(AItem^.YList)); + for i := 0 to High(AItem^.YList) do YList[i] := AItem^.YList[i]; +end; + function TChartDataItem.GetX(AIndex: Integer): Double; begin AIndex := EnsureRange(AIndex, 0, Length(XList)); diff --git a/components/tachart/tasources.pas b/components/tachart/tasources.pas index a7e098e65b..a343f7e03f 100644 --- a/components/tachart/tasources.pas +++ b/components/tachart/tasources.pas @@ -717,7 +717,7 @@ begin try // optimization: don't execute try..except..end in a loop for i := 0 to ASource.Count - 1 do begin pcd := NewItem; - pcd^ := ASource[i]^; + pcd^.CopyFrom(ASource[i]); FData.Add(pcd); // don't use ItemAdd() here pcd := nil; end;