diff --git a/components/tachart/tasources.pas b/components/tachart/tasources.pas index 7f5fb9084f..f7eadf0e90 100644 --- a/components/tachart/tasources.pas +++ b/components/tachart/tasources.pas @@ -1082,14 +1082,24 @@ begin end; procedure TCalculatedChartSource.ExtractItem(AIndex: Integer); + + function YByOrder(AOrderIndex: Integer): Double; + begin + if AOrderIndex = 0 then + Result := FItem.Y + else + Result := FItem.YList[AOrderIndex - 1]; + end; + var t: TDoubleDynArray; i: Integer; begin FItem := Origin[AIndex]^; - SetLength(t, Length(FYOrder)); - for i := 0 to High(FYOrder) do - t[i] := FItem.YList[FYOrder[i]]; + SetLength(t, High(FYOrder)); + for i := 1 to High(FYOrder) do + t[i - 1] := YByOrder(FYOrder[i]); + FItem.Y := YByOrder(FYOrder[0]); FItem.YList := t; end; @@ -1211,8 +1221,7 @@ begin FOriginYCount := FOrigin.YCount; if ReorderYList = '' then begin - FYCount := FOrigin.YCount; - SetLength(FYOrder, Max(FYCount - 1, 0)); + SetLength(FYOrder, FOriginYCount); for i := 0 to High(FYOrder) do FYOrder[i] := i; end @@ -1222,15 +1231,14 @@ begin order.CommaText := ReorderYList; SetLength(FYOrder, order.Count); for i := 0 to High(FYOrder) do - FYOrder[i] := - EnsureRange(StrToIntDef(order[i], 0), 0, FOrigin.YCount - 2); - FYCount := Length(FYOrder) + 1; + FYOrder[i] := EnsureRange(StrToIntDef(order[i], 0), 0, FOriginYCount - 1); finally order.Free; end; end; + FYCount := Length(FYOrder); - SetLength(FItem.YList, Length(FYOrder)); + SetLength(FItem.YList, Max(High(FYOrder), 0)); Changed(nil); end; diff --git a/components/tachart/test/SourcesTest.pas b/components/tachart/test/SourcesTest.pas index 3b91e9e91b..4e522bc8a7 100644 --- a/components/tachart/test/SourcesTest.pas +++ b/components/tachart/test/SourcesTest.pas @@ -200,23 +200,27 @@ end; procedure TCalculatedSourceTest.Reorder; var - i, j: Integer; + i: Integer; begin AssertEquals(3, FSource.YCount); FSource.ReorderYList := '2'; + AssertEquals(1, FSource.YCount); + AssertEquals(104, FSource[0]^.Y); + AssertEquals(204, FSource[1]^.Y); + FSource.ReorderYList := '0,2'; AssertEquals(2, FSource.YCount); + AssertEquals(102, FSource[0]^.Y); AssertEquals(104, FSource[0]^.YList[0]); + AssertEquals(202, FSource[1]^.Y); AssertEquals(204, FSource[1]^.YList[0]); - FSource.ReorderYList := '0,0,0'; - AssertEquals(4, FSource.YCount); - AssertEquals(103, FSource[0]^.YList[0]); - AssertEquals(103, FSource[0]^.YList[1]); - AssertEquals(103, FSource[0]^.YList[2]); + FSource.ReorderYList := '1,1,1'; + AssertEquals(3, FSource.YCount); + AssertEquals(103, FSource[0]^.Y); + AssertEquals([103, 103], FSource[0]^.YList); FSource.ReorderYList := ''; for i := 0 to FSource.Count - 1 do begin AssertEquals(FOrigin[i]^.Y, FSource[i]^.Y); - for j := 0 to FSource.YCount - 2 do - AssertEquals(FOrigin[i]^.YList[j], FSource[i]^.YList[j]); + AssertEquals(FOrigin[i]^.YList, FSource[i]^.YList); end; end;