From 14c82d694e11fbd768336584f3a172a7f0f143b7 Mon Sep 17 00:00:00 2001 From: ask Date: Sat, 15 Sep 2012 07:48:48 +0000 Subject: [PATCH] TAChart: Avoid double call to SetLength from ValuesInRange for unsorted TCustomChartSource git-svn-id: trunk@38659 - --- components/tachart/tacustomsource.pas | 35 ++++++++++++++++----------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/components/tachart/tacustomsource.pas b/components/tachart/tacustomsource.pas index 6bf0bb104f..d0a4e48389 100644 --- a/components/tachart/tacustomsource.pas +++ b/components/tachart/tacustomsource.pas @@ -776,8 +776,23 @@ var prevImagePos := imagePos; end; + function EnsureMinLength(AStart, AEnd: Integer): Integer; + var + i: Integer; + v: Double; + begin + prevImagePos := MaxInt; + Result := AStart; + for i := AStart to AEnd do begin + v := AValues[i].FValue; + if InRange(v, AParams.FMin, AParams.FMax) and IsTooClose(v) then continue; + AValues[Result] := AValues[i]; + Result += 1; + end; + end; + var - i, j, cnt, start: Integer; + i, cnt, start: Integer; v: Double; lo, hi: TChartValueText; begin @@ -827,21 +842,13 @@ begin AValues[cnt] := hi; cnt += 1; end; - SetLength(AValues, cnt); - if IsSorted or IsValueTextsSorted(AValues, start, cnt - 1) then exit; - SortValuesInRange(AValues, start, cnt - 1); - if aipUseMinLength in AParams.FIntervals.Options then begin - prevImagePos := MaxInt; - j := start; - for i := start to cnt - 1 do begin - v := AValues[i].FValue; - if InRange(v, AParams.FMin, AParams.FMax) and IsTooClose(v) then continue; - AValues[j] := AValues[i]; - j += 1; - end; - SetLength(AValues, j); + if not IsSorted and not IsValueTextsSorted(AValues, start, cnt - 1) then begin + SortValuesInRange(AValues, start, cnt - 1); + if aipUseMinLength in AParams.FIntervals.Options then + cnt := EnsureMinLength(start, cnt - 1); end; + SetLength(AValues, cnt); end; function TCustomChartSource.ValuesTotal: Double;