TAChart: Add TValuesInRangeParams helper type, remove TAxisDataExtent helper type

git-svn-id: trunk@31844 -
This commit is contained in:
ask 2011-08-01 06:06:43 +00:00
parent b5c78839e1
commit f81391d3cd
3 changed files with 49 additions and 51 deletions

View File

@ -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

View File

@ -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;

View File

@ -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.