mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-02 13:19:49 +01:00
TAChart: Add TValuesInRangeParams helper type, remove TAxisDataExtent helper type
git-svn-id: trunk@31844 -
This commit is contained in:
parent
b5c78839e1
commit
f81391d3cd
@ -244,11 +244,6 @@ implementation
|
||||
uses
|
||||
LResources, Math, PropEdits, TAGeometry;
|
||||
|
||||
type
|
||||
TAxisDataExtent = record
|
||||
FMin, FMax: Double;
|
||||
end;
|
||||
|
||||
var
|
||||
VIdentityTransform: TChartAxisTransformations;
|
||||
|
||||
@ -539,7 +534,7 @@ end;
|
||||
procedure TChartAxis.GetMarkValues(AMin, AMax: Double);
|
||||
var
|
||||
i: Integer;
|
||||
d: TAxisDataExtent;
|
||||
d: TValuesInRangeParams;
|
||||
vis: TChartOnVisitSources;
|
||||
t: TChartValueText;
|
||||
begin
|
||||
@ -552,16 +547,16 @@ begin
|
||||
if UseMax then
|
||||
AMax := Math.Min(Max, AMax);
|
||||
end;
|
||||
d.FMin := AMin;
|
||||
d.FMax := AMax;
|
||||
d.FFormat := Marks.Format;
|
||||
d.FUseY := IsVertical;
|
||||
SetLength(FMarkValues, 0);
|
||||
vis := TChartAxisList(Collection).OnVisitSources;
|
||||
if Marks.AtDataOnly and Assigned(vis) then begin
|
||||
d.FMin := AMin;
|
||||
d.FMax := AMax;
|
||||
vis(@VisitSource, Self, d);
|
||||
end
|
||||
if Marks.AtDataOnly and Assigned(vis) then
|
||||
vis(@VisitSource, Self, d)
|
||||
else
|
||||
Marks.SourceDef.ValuesInRange(
|
||||
AMin, AMax, Marks.Format, IsVertical, FMarkValues);
|
||||
Marks.SourceDef.ValuesInRange(d, FMarkValues);
|
||||
if Inverted then
|
||||
for i := 0 to High(FMarkValues) div 2 do begin
|
||||
t := FMarkValues[i];
|
||||
@ -781,13 +776,13 @@ end;
|
||||
procedure TChartAxis.VisitSource(ASource: TCustomChartSource; var AData);
|
||||
var
|
||||
ext: TDoubleRect;
|
||||
p: TValuesInRangeParams;
|
||||
begin
|
||||
ext := ASource.Extent;
|
||||
with TAxisDataExtent(AData) do
|
||||
Marks.SourceDef.ValuesInRange(
|
||||
Max(TDoublePointBoolArr(ext.a)[IsVertical], FMin),
|
||||
Min(TDoublePointBoolArr(ext.b)[IsVertical], FMax),
|
||||
Marks.Format, IsVertical, FMarkValues);
|
||||
p := TValuesInRangeParams(AData);
|
||||
p.FMin := Max(TDoublePointBoolArr(ext.a)[IsVertical], p.FMin);
|
||||
p.FMax := Min(TDoublePointBoolArr(ext.b)[IsVertical], p.FMax);
|
||||
Marks.SourceDef.ValuesInRange(p, FMarkValues);
|
||||
end;
|
||||
|
||||
const
|
||||
|
||||
@ -40,9 +40,9 @@ type
|
||||
FMaxLength: Integer;
|
||||
FMinLength: Integer;
|
||||
FNiceSteps: String;
|
||||
FStepValues: TDoubleDynArray;
|
||||
FOptions: TAxisIntervalParamOptions;
|
||||
FOwner: TPersistent;
|
||||
FStepValues: TDoubleDynArray;
|
||||
function NiceStepsIsStored: Boolean;
|
||||
procedure ParseNiceSteps;
|
||||
procedure SetCount(AValue: Integer);
|
||||
@ -82,7 +82,6 @@ type
|
||||
{ TChartDataItem }
|
||||
|
||||
TChartDataItem = object
|
||||
public
|
||||
X, Y: Double;
|
||||
Color: TChartColor;
|
||||
Text: String;
|
||||
@ -91,6 +90,12 @@ type
|
||||
end;
|
||||
PChartDataItem = ^TChartDataItem;
|
||||
|
||||
TValuesInRangeParams = record
|
||||
FFormat: String;
|
||||
FMin, FMax: Double;
|
||||
FUseY: Boolean;
|
||||
end;
|
||||
|
||||
{ TCustomChartSource }
|
||||
|
||||
TCustomChartSource = class(TComponent)
|
||||
@ -128,8 +133,7 @@ type
|
||||
const AFormat: String; AIndex, AYIndex: Integer): String;
|
||||
function IsSorted: Boolean; virtual;
|
||||
procedure ValuesInRange(
|
||||
AMin, AMax: Double; const AFormat: String; AUseY: Boolean;
|
||||
var AValues: TChartValueTextArray); virtual;
|
||||
AParams: TValuesInRangeParams; var AValues: TChartValueTextArray); virtual;
|
||||
function ValuesTotal: Double; virtual;
|
||||
function XOfMax: Double;
|
||||
function XOfMin: Double;
|
||||
@ -540,8 +544,7 @@ begin
|
||||
end;
|
||||
|
||||
procedure TCustomChartSource.ValuesInRange(
|
||||
AMin, AMax: Double; const AFormat: String; AUseY: Boolean;
|
||||
var AValues: TChartValueTextArray);
|
||||
AParams: TValuesInRangeParams; var AValues: TChartValueTextArray);
|
||||
|
||||
var
|
||||
cnt: Integer;
|
||||
@ -549,7 +552,7 @@ var
|
||||
procedure Push(AValue: Double; AIndex: Integer);
|
||||
begin
|
||||
AValues[cnt].FValue := AValue;
|
||||
AValues[cnt].FText := FormatItem(AFormat, AIndex, 0);
|
||||
AValues[cnt].FText := FormatItem(AParams.FFormat, AIndex, 0);
|
||||
cnt += 1;
|
||||
end;
|
||||
|
||||
@ -563,14 +566,14 @@ begin
|
||||
li := 0;
|
||||
for i := 0 to Count - 1 do begin
|
||||
pv := v;
|
||||
v := IfThen(AUseY, Item[i]^.Y, Item[i]^.X);
|
||||
if not InRange(v, AMin, AMax) then continue;
|
||||
v := IfThen(AParams.FUseY, Item[i]^.Y, Item[i]^.X);
|
||||
if not InRange(v, AParams.FMin, AParams.FMax) then continue;
|
||||
if (cnt = 0) and (i > 0) then
|
||||
Push(pv, i - 1);
|
||||
Push(v, i);
|
||||
li := i;
|
||||
end;
|
||||
if not InRange(v, AMin, AMax) then
|
||||
if not InRange(v, AParams.FMin, AParams.FMax) then
|
||||
Push(v, li);
|
||||
SetLength(AValues, cnt);
|
||||
end;
|
||||
|
||||
@ -44,8 +44,7 @@ type
|
||||
destructor Destroy; override;
|
||||
|
||||
procedure ValuesInRange(
|
||||
AMin, AMax: Double; const AFormat: String; AUseY: Boolean;
|
||||
var AValues: TChartValueTextArray); override;
|
||||
AParams: TValuesInRangeParams; var AValues: TChartValueTextArray); override;
|
||||
published
|
||||
property Params: TChartAxisIntervalParams read FParams write SetParams;
|
||||
end;
|
||||
@ -70,8 +69,7 @@ type
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
procedure ValuesInRange(
|
||||
AMin, AMax: Double; const AFormat: String; AUseY: Boolean;
|
||||
var AValues: TChartValueTextArray); override;
|
||||
AParams: TValuesInRangeParams; var AValues: TChartValueTextArray); override;
|
||||
published
|
||||
property DateTimeFormat: String read FDateTimeFormat write FDateTimeFormat;
|
||||
property Steps: TDateTimeSteps
|
||||
@ -250,17 +248,16 @@ begin
|
||||
end;
|
||||
|
||||
procedure TIntervalChartSource.ValuesInRange(
|
||||
AMin, AMax: Double; const AFormat: String; AUseY: Boolean;
|
||||
var AValues: TChartValueTextArray);
|
||||
AParams: TValuesInRangeParams; var AValues: TChartValueTextArray);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
Unused(AUseY);
|
||||
if AMin > AMax then exit;
|
||||
AValues := GetIntervals(AMin, AMax, false);
|
||||
if AParams.FMin > AParams.FMax then exit;
|
||||
AValues := GetIntervals(AParams.FMin, AParams.FMax, false);
|
||||
for i := 0 to High(AValues) do
|
||||
// Extra format arguments for compatibility with FormatItem.
|
||||
AValues[i].FText := Format(AFormat, [AValues[i].FValue, 0.0, '', 0.0, 0.0]);
|
||||
AValues[i].FText := Format(
|
||||
AParams.FFormat, [AValues[i].FValue, 0.0, '', 0.0, 0.0]);
|
||||
end;
|
||||
|
||||
{ TDateTimeIntervalChartSource }
|
||||
@ -272,8 +269,7 @@ begin
|
||||
end;
|
||||
|
||||
procedure TDateTimeIntervalChartSource.ValuesInRange(
|
||||
AMin, AMax: Double; const AFormat: String; AUseY: Boolean;
|
||||
var AValues: TChartValueTextArray);
|
||||
AParams: TValuesInRangeParams; var AValues: TChartValueTextArray);
|
||||
const
|
||||
YEAR = 365.25;
|
||||
STEP_INTERVALS: array [TDateTimeStep] of Double = (
|
||||
@ -324,24 +320,28 @@ var
|
||||
|
||||
var
|
||||
i, cnt: Integer;
|
||||
r: Double;
|
||||
begin
|
||||
if (AMax - AMin) / STEP_INTERVALS[dtsCentury] > MAX_STEPS then begin
|
||||
inherited ValuesInRange(
|
||||
AMin / STEP_INTERVALS[dtsYear], AMax / STEP_INTERVALS[dtsYear],
|
||||
AFormat, AUseY, AValues);
|
||||
exit;
|
||||
with AParams do begin
|
||||
r := FMax - FMin;
|
||||
if r / STEP_INTERVALS[dtsCentury] > MAX_STEPS then begin
|
||||
FMin /= STEP_INTERVALS[dtsYear];
|
||||
FMax /= STEP_INTERVALS[dtsYear];
|
||||
inherited ValuesInRange(AParams, AValues);
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
s := Low(s);
|
||||
while s < High(s) do begin
|
||||
si := STEP_INTERVALS[s];
|
||||
if (s in Steps) and ((AMax - AMin) / si > MIN_STEPS) then
|
||||
if (s in Steps) and (r / si > MIN_STEPS) then
|
||||
break;
|
||||
Inc(s);
|
||||
end;
|
||||
start := Int(AMin / si - 1) * si;
|
||||
start := Int(AParams.FMin / si - 1) * si;
|
||||
x := start;
|
||||
cnt := 1;
|
||||
while x <= AMax do begin
|
||||
while x <= AParams.FMax do begin
|
||||
cnt += 1;
|
||||
x += si;
|
||||
end;
|
||||
@ -350,9 +350,9 @@ begin
|
||||
|
||||
FillChar(prevSt, SizeOf(prevSt), $FF);
|
||||
x := start;
|
||||
while x <= AMax do begin
|
||||
while x <= AParams.FMax do begin
|
||||
AValues[i].FValue := x;
|
||||
AValues[i].FText := Format(AFormat, [x, 0.0, FormatLabel, 0.0, 0.0]);
|
||||
AValues[i].FText := Format(AParams.FFormat, [x, 0.0, FormatLabel, 0.0, 0.0]);
|
||||
i += 1;
|
||||
case s of
|
||||
dtsCentury: x := IncYear(x, 100);
|
||||
@ -363,7 +363,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
AValues[i].FValue := x;
|
||||
AValues[i].FText := Format(AFormat, [x, 0.0, FormatLabel, 0.0, 0.0]);
|
||||
AValues[i].FText := Format(AParams.FFormat, [x, 0.0, FormatLabel, 0.0, 0.0]);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user