mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-15 19:22:41 +02:00
TChart: Introduce TChartAxisAlignment and TChartAxisList
* First step for adding support for multiple axises * Does not yet change any user-visible behaviour git-svn-id: trunk@20312 -
This commit is contained in:
parent
d99a3fc221
commit
b991035ee7
@ -107,19 +107,15 @@ type
|
||||
|
||||
TChartSeriesList = class(TPersistent)
|
||||
private
|
||||
FChart: TChart;
|
||||
FList: TFPList;
|
||||
function GetItem(AIndex: Integer): TBasicChartSeries;
|
||||
procedure SetItem(AIndex: Integer; const AValue: TBasicChartSeries);
|
||||
public
|
||||
function Count: Integer;
|
||||
constructor Create(AOwner: TChart);
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
|
||||
public
|
||||
property Chart: TChart read FChart;
|
||||
property Items[AIndex: Integer]: TBasicChartSeries
|
||||
read GetItem write SetItem; default;
|
||||
property Items[AIndex: Integer]: TBasicChartSeries read GetItem; default;
|
||||
end;
|
||||
|
||||
{ TChart }
|
||||
@ -130,14 +126,12 @@ type
|
||||
FAxisColor: TColor;
|
||||
FAxisVisible: Boolean;
|
||||
FBackColor: TColor;
|
||||
FBottomAxis: TChartAxis;
|
||||
FDepth: TChartZPosition;
|
||||
FExpandPercentage: Integer;
|
||||
FExtent: TChartExtent;
|
||||
FFoot: TChartTitle;
|
||||
FFrame: TChartPen;
|
||||
FGraphBrush: TBrush;
|
||||
FLeftAxis: TChartAxis;
|
||||
FLegend: TChartLegend;
|
||||
FMargins: TChartMargins;
|
||||
FOnDrawReticule: TDrawReticuleEvent;
|
||||
@ -145,6 +139,7 @@ type
|
||||
FTitle: TChartTitle;
|
||||
|
||||
private
|
||||
FAxisList: TChartAxisList;
|
||||
FClipRect: TRect;
|
||||
FCurrentExtent: TDoubleRect;
|
||||
FIsMouseDown: Boolean;
|
||||
@ -157,6 +152,7 @@ type
|
||||
|
||||
procedure CalculateTransformationCoeffs(const AMargin: TRect);
|
||||
procedure DrawReticule(ACanvas: TCanvas);
|
||||
function GetAxis(AIndex: integer): TChartAxis; inline;
|
||||
function GetChartHeight: Integer;
|
||||
function GetChartWidth: Integer;
|
||||
function GetLegendWidth(ACanvas: TCanvas): Integer;
|
||||
@ -165,17 +161,16 @@ type
|
||||
function GetSeriesInZOrder: TFPList;
|
||||
procedure PrepareXorPen;
|
||||
|
||||
procedure SetAxis(AIndex: Integer; AValue: TChartAxis);
|
||||
procedure SetAxisColor(const AValue: TColor);
|
||||
procedure SetAxisVisible(Value: Boolean);
|
||||
procedure SetBackColor(const AValue: TColor);
|
||||
procedure SetBottomAxis(Value: TChartAxis);
|
||||
procedure SetDepth(AValue: TChartZPosition);
|
||||
procedure SetExpandPercentage(AValue: Integer);
|
||||
procedure SetExtent(const AValue: TChartExtent);
|
||||
procedure SetFoot(Value: TChartTitle);
|
||||
procedure SetFrame(Value: TChartPen);
|
||||
procedure SetGraphBrush(Value: TBrush);
|
||||
procedure SetLeftAxis(Value: TChartAxis);
|
||||
procedure SetLegend(Value: TChartLegend);
|
||||
procedure SetMargins(AValue: TChartMargins);
|
||||
procedure SetReticuleMode(const AValue: TReticuleMode);
|
||||
@ -252,7 +247,7 @@ type
|
||||
property AxisColor: TColor read FAxisColor write SetAxisColor default clBlack;
|
||||
property AxisVisible: Boolean read FAxisVisible write SetAxisVisible default true;
|
||||
property BackColor: TColor read FBackColor write SetBackColor default clBtnFace;
|
||||
property BottomAxis: TChartAxis read FBottomAxis write SetBottomAxis;
|
||||
property BottomAxis: TChartAxis index 1 read GetAxis write SetAxis;
|
||||
property Depth: TChartZPosition read FDepth write SetDepth default 0;
|
||||
property ExpandPercentage: Integer
|
||||
read FExpandPercentage write SetExpandPercentage default 0;
|
||||
@ -260,7 +255,7 @@ type
|
||||
property Foot: TChartTitle read FFoot write SetFoot;
|
||||
property Frame: TChartPen read FFrame write SetFrame;
|
||||
property GraphBrush: TBrush read FGraphBrush write SetGraphBrush;
|
||||
property LeftAxis: TChartAxis read FLeftAxis write SetLeftAxis;
|
||||
property LeftAxis: TChartAxis index 2 read GetAxis write SetAxis;
|
||||
property Legend: TChartLegend read FLegend write SetLegend;
|
||||
property Margins: TChartMargins read FMargins write SetMargins;
|
||||
property ReticuleMode: TReticuleMode
|
||||
@ -349,7 +344,7 @@ begin
|
||||
FReticulePos := Point(-1, -1);
|
||||
FReticuleMode := rmNone;
|
||||
|
||||
FSeries := TChartSeriesList.Create(Self);
|
||||
FSeries := TChartSeriesList.Create;
|
||||
|
||||
Color := clBtnFace;
|
||||
FBackColor := clBtnFace;
|
||||
@ -368,12 +363,17 @@ begin
|
||||
FTitle.Text.Add('TAChart');
|
||||
FFoot := TChartTitle.Create(Self);
|
||||
|
||||
FLeftAxis := TChartAxis.Create(Self);
|
||||
FLeftAxis.Title.Angle := 90;
|
||||
FLeftAxis.Grid.Style := psDot;
|
||||
FBottomAxis := TChartAxis.Create(Self);
|
||||
FBottomAxis.Title.Angle := 0;
|
||||
FBottomAxis.Grid.Style := psDot;
|
||||
FAxisList := TChartAxisList.Create(Self);
|
||||
with TChartAxis.Create(FAxisList) do begin
|
||||
Alignment := calLeft;
|
||||
Title.Angle := 90;
|
||||
Grid.Style := psDot;
|
||||
end;
|
||||
with TChartAxis.Create(FAxisList) do begin
|
||||
Alignment := calBottom;
|
||||
Title.Angle := 0;
|
||||
Grid.Style := psDot;
|
||||
end;
|
||||
|
||||
FFrame := TChartPen.Create;
|
||||
FFrame.OnChange := @StyleChanged;
|
||||
@ -390,8 +390,7 @@ begin
|
||||
FLegend.Free;
|
||||
FTitle.Free;
|
||||
FFoot.Free;
|
||||
FLeftAxis.Free;
|
||||
FBottomAxis.Free;
|
||||
FAxisList.Free;
|
||||
FFrame.Free;
|
||||
FExtent.Free;
|
||||
FMargins.Free;
|
||||
@ -414,6 +413,11 @@ begin
|
||||
Unused(DC);
|
||||
end;
|
||||
|
||||
function TChart.GetAxis(AIndex: integer): TChartAxis;
|
||||
begin
|
||||
Result := FAxisList.GetAxis(AIndex);
|
||||
end;
|
||||
|
||||
procedure TChart.StyleChanged(Sender: TObject);
|
||||
begin
|
||||
Invalidate;
|
||||
@ -462,7 +466,7 @@ type
|
||||
TConvFunc = function (AX: Integer): Double of object;
|
||||
|
||||
procedure CalcOneCoord(
|
||||
AInverted: boolean; AConv: TConvFunc; var AGraphMin, AGraphMax: Double;
|
||||
AAxis: TChartAxis; AConv: TConvFunc; var AGraphMin, AGraphMax: Double;
|
||||
AImageLo, AImageHi, AMarginLo, AMarginHi, ASign: Integer;
|
||||
out AScale, AOffset: Double);
|
||||
var
|
||||
@ -477,24 +481,24 @@ type
|
||||
exit;
|
||||
end;
|
||||
|
||||
if AInverted then
|
||||
if (AAxis <> nil) and AAxis.Inverted then
|
||||
Exchange(lo, hi);
|
||||
|
||||
AScale := (hi - lo) / (AGraphMax - AGraphMin);
|
||||
AOffset := hi - AScale * AGraphMax;
|
||||
AGraphMin := AConv(AImageLo);
|
||||
AGraphMax := AConv(AImageHi);;
|
||||
if AInverted then
|
||||
if (AAxis <> nil) and AAxis.Inverted then
|
||||
Exchange(AGraphMin, AGraphMax);
|
||||
end;
|
||||
|
||||
begin
|
||||
CalcOneCoord(
|
||||
BottomAxis.Inverted, @XImageToGraph, FCurrentExtent.a.X, FCurrentExtent.b.X,
|
||||
BottomAxis, @XImageToGraph, FCurrentExtent.a.X, FCurrentExtent.b.X,
|
||||
FClipRect.Left, FClipRect.Right, AMargin.Left, -AMargin.Right, 1,
|
||||
FScale.X, FOffset.X);
|
||||
CalcOneCoord(
|
||||
LeftAxis.Inverted, @YImageToGraph, FCurrentExtent.a.Y, FCurrentExtent.b.Y,
|
||||
LeftAxis, @YImageToGraph, FCurrentExtent.a.Y, FCurrentExtent.b.Y,
|
||||
FClipRect.Bottom, FClipRect.Top, -AMargin.Bottom, AMargin.Top, -1,
|
||||
FScale.Y, FOffset.Y);
|
||||
end;
|
||||
@ -586,22 +590,27 @@ var
|
||||
begin
|
||||
// FIXME: Angle assumed to be around 0 for bottom and 90 for left axis.
|
||||
c := CenterPoint(FClipRect);
|
||||
s := FLeftAxis.Title.Caption;
|
||||
if FLeftAxis.Visible and (s <> '') then begin
|
||||
w := ACanvas.TextHeight(FLeftAxis.Title.Caption);
|
||||
|
||||
if LeftAxis <> nil then begin
|
||||
s := LeftAxis.Title.Caption;
|
||||
if LeftAxis.Visible and (s <> '') then begin
|
||||
w := ACanvas.TextHeight(LeftAxis.Title.Caption);
|
||||
x := FClipRect.Left;
|
||||
leftOffset := w + 4;
|
||||
ACanvas.Font.Orientation := FLeftAxis.Title.Angle * DEGREES_TO_ORIENT;
|
||||
ACanvas.Font.Orientation := LeftAxis.Title.Angle * DEGREES_TO_ORIENT;
|
||||
ACanvas.TextOut(x, c.Y - w div 2, s);
|
||||
end;
|
||||
end;
|
||||
|
||||
s := FBottomAxis.Title.Caption;
|
||||
if FBottomAxis.Visible and (s <> '') then begin
|
||||
if BottomAxis <> nil then begin
|
||||
s := BottomAxis.Title.Caption;
|
||||
if BottomAxis.Visible and (s <> '') then begin
|
||||
sz := ACanvas.TextExtent(s);
|
||||
ACanvas.Font.Orientation := FBottomAxis.Title.Angle * DEGREES_TO_ORIENT;
|
||||
ACanvas.Font.Orientation := BottomAxis.Title.Angle * DEGREES_TO_ORIENT;
|
||||
ACanvas.TextOut(c.X - sz.cx div 2, FClipRect.Bottom - sz.cy, s);
|
||||
bottomOffset := sz.cy + 4;
|
||||
end;
|
||||
end;
|
||||
ACanvas.Font.Orientation := 0;
|
||||
end;
|
||||
|
||||
@ -612,8 +621,8 @@ var
|
||||
begin
|
||||
x := XGraphToImage(AMark);
|
||||
|
||||
if FBottomAxis.Grid.Visible then begin
|
||||
ACanvas.Pen.Assign(FBottomAxis.Grid);
|
||||
if BottomAxis.Grid.Visible then begin
|
||||
ACanvas.Pen.Assign(BottomAxis.Grid);
|
||||
ACanvas.Brush.Style := bsClear;
|
||||
DrawLineVert(ACanvas, x);
|
||||
end;
|
||||
@ -639,8 +648,8 @@ var
|
||||
begin
|
||||
y := YGraphToImage(AMark);
|
||||
|
||||
if FLeftAxis.Grid.Visible then begin
|
||||
ACanvas.Pen.Assign(FLeftAxis.Grid);
|
||||
if LeftAxis.Grid.Visible then begin
|
||||
ACanvas.Pen.Assign(LeftAxis.Grid);
|
||||
ACanvas.Brush.Style := bsClear;
|
||||
DrawLineHoriz(ACanvas, y);
|
||||
end;
|
||||
@ -675,11 +684,11 @@ begin
|
||||
DrawAxisTitles;
|
||||
|
||||
// Check AxisScale for both axes
|
||||
leftAxisScale := INV_TO_SCALE[LeftAxis.Inverted];
|
||||
bottomAxisScale := INV_TO_SCALE[BottomAxis.Inverted];
|
||||
leftAxisScale := INV_TO_SCALE[(LeftAxis <> nil) and LeftAxis.Inverted];
|
||||
bottomAxisScale := INV_TO_SCALE[(BottomAxis <> nil) and BottomAxis.Inverted];
|
||||
|
||||
leftAxisWidth := 0;
|
||||
if FLeftAxis.Visible then begin
|
||||
if (LeftAxis <> nil) and LeftAxis.Visible then begin
|
||||
// Find max mark width
|
||||
maxWidth := 0;
|
||||
if YGraphMin <> YGraphMax then begin
|
||||
@ -710,7 +719,7 @@ begin
|
||||
leftOffset += leftAxisWidth;
|
||||
end;
|
||||
|
||||
if FBottomAxis.Visible then
|
||||
if (BottomAxis <> nil) and BottomAxis.Visible then
|
||||
bottomOffset += ACanvas.TextHeight('0') + 5;
|
||||
|
||||
FClipRect.Left += Max(leftOffset, Depth);
|
||||
@ -730,7 +739,7 @@ begin
|
||||
end;
|
||||
|
||||
// X graduations
|
||||
if FBottomAxis.Visible and (XGraphMin <> XGraphMax) then begin
|
||||
if (BottomAxis <> nil) and BottomAxis.Visible and (XGraphMin <> XGraphMax) then begin
|
||||
CalculateIntervals(XGraphMin, XGraphMax, bottomAxisScale, mark, step);
|
||||
case bottomAxisScale of
|
||||
asIncreasing:
|
||||
@ -749,7 +758,7 @@ begin
|
||||
end;
|
||||
|
||||
// Y graduations
|
||||
if FLeftAxis.Visible and (YGraphMin <> YGraphMax) then begin
|
||||
if (LeftAxis <> nil) and LeftAxis.Visible and (YGraphMin <> YGraphMax) then begin
|
||||
CalculateIntervals(YGraphMin, YGraphMax, leftAxisScale, mark, step);
|
||||
case leftAxisScale of
|
||||
asIncreasing:
|
||||
@ -1032,6 +1041,12 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TChart.SetAxis(AIndex: Integer; AValue: TChartAxis);
|
||||
begin
|
||||
FAxisList.SetAxis(AIndex, AValue);
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
procedure TChart.SetAxisColor(const AValue: TColor);
|
||||
begin
|
||||
if FAxisColor = AValue then exit;
|
||||
@ -1220,18 +1235,6 @@ begin
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
procedure TChart.SetLeftAxis(Value: TChartAxis);
|
||||
begin
|
||||
FLeftAxis.Assign(Value);
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
procedure TChart.SetBottomAxis(Value: TChartAxis);
|
||||
begin
|
||||
FBottomAxis.Assign(Value);
|
||||
Invalidate;
|
||||
end;
|
||||
|
||||
procedure TChart.SetMargins(AValue: TChartMargins);
|
||||
begin
|
||||
FMargins.Assign(AValue);
|
||||
@ -1454,9 +1457,8 @@ begin
|
||||
Result := FList.Count;
|
||||
end;
|
||||
|
||||
constructor TChartSeriesList.Create(AOwner: TChart);
|
||||
constructor TChartSeriesList.Create;
|
||||
begin
|
||||
FChart := AOwner;
|
||||
FList := TFPList.Create;
|
||||
end;
|
||||
|
||||
@ -1477,12 +1479,6 @@ begin
|
||||
Result := TBasicChartSeries(FList.Items[AIndex]);
|
||||
end;
|
||||
|
||||
procedure TChartSeriesList.SetItem(
|
||||
AIndex: Integer; const AValue: TBasicChartSeries);
|
||||
begin
|
||||
GetItem(AIndex).Assign(AValue);
|
||||
end;
|
||||
|
||||
procedure SkipObsoleteChartProperties;
|
||||
const
|
||||
MIRRORX_NOTE = 'Obsolete, use BottomAxis.Invert instead';
|
||||
|
@ -64,9 +64,9 @@ type
|
||||
procedure SetVisible(const AValue: Boolean);
|
||||
protected
|
||||
FOwner: TCustomChart;
|
||||
procedure StyleChanged(Sender: TObject);
|
||||
procedure InitHelper(
|
||||
var AResult: TFPCanvasHelper; AClass: TFPCanvasHelperClass);
|
||||
procedure StyleChanged(Sender: TObject);
|
||||
public
|
||||
constructor Create(AOwner: TCustomChart);
|
||||
procedure Assign(Source: TPersistent); override;
|
||||
@ -147,26 +147,57 @@ type
|
||||
property Visible default false;
|
||||
end;
|
||||
|
||||
TChartAxis = class(TChartElement)
|
||||
TChartAxisAlignment = (calLeft, calTop, calRight, calBottom);
|
||||
|
||||
{ TChartAxis }
|
||||
|
||||
TChartAxis = class(TCollectionItem)
|
||||
private
|
||||
FAlignment: TChartAxisAlignment;
|
||||
FGrid: TChartPen;
|
||||
FInverted: Boolean;
|
||||
FTitle: TChartAxisTitle;
|
||||
FVisible: Boolean;
|
||||
|
||||
procedure SetAlignment(AValue: TChartAxisAlignment);
|
||||
procedure SetGrid(AValue: TChartPen);
|
||||
procedure SetInverted(AValue: Boolean);
|
||||
procedure SetTitle(AValue: TChartAxisTitle);
|
||||
procedure SetVisible(const AValue: Boolean);
|
||||
|
||||
procedure StyleChanged(ASender: TObject);
|
||||
public
|
||||
constructor Create(AOwner: TCustomChart);
|
||||
constructor Create(ACollection: TCollection); override;
|
||||
destructor Destroy; override;
|
||||
|
||||
procedure Assign(Source: TPersistent); override;
|
||||
published
|
||||
property Alignment: TChartAxisAlignment read FAlignment write SetAlignment;
|
||||
property Grid: TChartPen read FGrid write SetGrid;
|
||||
// Inverts the axis scale from increasing to decreasing.
|
||||
property Inverted: boolean read FInverted write SetInverted default false;
|
||||
property Title: TChartAxisTitle read FTitle write SetTitle;
|
||||
property Visible default true;
|
||||
property Visible: Boolean read FVisible write SetVisible default true;
|
||||
end;
|
||||
|
||||
{ TChartAxisList }
|
||||
|
||||
TChartAxisList = class(TCollection)
|
||||
private
|
||||
FChart: TCustomChart;
|
||||
function GetAxes(AIndex: Integer): TChartAxis;
|
||||
protected
|
||||
function GetOwner: TPersistent; override;
|
||||
public
|
||||
constructor Create(AOwner: TCustomChart);
|
||||
public
|
||||
function Add: TChartAxis; inline;
|
||||
function GetAxis(AIndex: Integer): TChartAxis;
|
||||
procedure SetAxis(AIndex: Integer; AValue: TChartAxis);
|
||||
|
||||
property Axes[AIndex: Integer]: TChartAxis read GetAxes; default;
|
||||
property BottomAxis: TChartAxis index 1 read GetAxis write SetAxis;
|
||||
property LeftAxis: TChartAxis index 2 read GetAxis write SetAxis;
|
||||
end;
|
||||
|
||||
TChartLinkPen = class(TChartPen)
|
||||
@ -333,7 +364,7 @@ end;
|
||||
|
||||
procedure TChartElement.Assign(Source: TPersistent);
|
||||
begin
|
||||
inherited Assign(Source);
|
||||
//inherited Assign(Source);
|
||||
if Source is TChartElement then
|
||||
Self.FVisible := TChartElement(Source).FVisible;
|
||||
end;
|
||||
@ -542,14 +573,15 @@ begin
|
||||
FInverted := Inverted;
|
||||
FTitle.Assign(Title);
|
||||
end;
|
||||
inherited Assign(Source);
|
||||
//inherited Assign(Source);
|
||||
end;
|
||||
|
||||
constructor TChartAxis.Create(AOwner: TCustomChart);
|
||||
constructor TChartAxis.Create(ACollection: TCollection);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
FTitle := TChartAxisTitle.Create(AOwner);
|
||||
InitHelper(FGrid, TChartPen);
|
||||
inherited Create(ACollection);
|
||||
FTitle := TChartAxisTitle.Create(ACollection.Owner as TCustomChart);
|
||||
FGrid := TChartPen.Create;
|
||||
FGrid.OnChange := @StyleChanged;
|
||||
FVisible := true;
|
||||
end;
|
||||
|
||||
@ -560,6 +592,13 @@ begin
|
||||
inherited;
|
||||
end;
|
||||
|
||||
procedure TChartAxis.SetAlignment(AValue: TChartAxisAlignment);
|
||||
begin
|
||||
if FAlignment = AValue then exit;
|
||||
FAlignment := AValue;
|
||||
StyleChanged(Self);
|
||||
end;
|
||||
|
||||
procedure TChartAxis.SetGrid(AValue: TChartPen);
|
||||
begin
|
||||
FGrid.Assign(AValue);
|
||||
@ -578,6 +617,19 @@ begin
|
||||
StyleChanged(Self);
|
||||
end;
|
||||
|
||||
procedure TChartAxis.SetVisible(const AValue: Boolean);
|
||||
begin
|
||||
if FVisible = AValue then exit;
|
||||
FVisible := AValue;
|
||||
StyleChanged(Self);
|
||||
end;
|
||||
|
||||
procedure TChartAxis.StyleChanged(ASender: TObject);
|
||||
begin
|
||||
Unused(ASender);
|
||||
(Collection.Owner as TCustomChart).Invalidate;
|
||||
end;
|
||||
|
||||
{ TChartMarks }
|
||||
|
||||
procedure TChartMarks.Assign(Source: TPersistent);
|
||||
@ -882,5 +934,52 @@ begin
|
||||
StyleChanged(Self);
|
||||
end;
|
||||
|
||||
const
|
||||
AXIS_INDEX: array [1..2] of TChartAxisAlignment = (calBottom, calLeft);
|
||||
|
||||
{ TChartAxisList }
|
||||
|
||||
function TChartAxisList.Add: TChartAxis; inline;
|
||||
begin
|
||||
Result := TChartAxis(inherited Add);
|
||||
end;
|
||||
|
||||
constructor TChartAxisList.Create(AOwner: TCustomChart);
|
||||
begin
|
||||
inherited Create(TChartAxis);
|
||||
FChart := AOwner;
|
||||
end;
|
||||
|
||||
function TChartAxisList.GetAxes(AIndex: Integer): TChartAxis;
|
||||
begin
|
||||
Result := TChartAxis(Items[AIndex]);
|
||||
end;
|
||||
|
||||
function TChartAxisList.GetAxis(AIndex: Integer): TChartAxis;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i := 0 to Count - 1 do
|
||||
if Axes[i].Alignment = AXIS_INDEX[AIndex] then
|
||||
exit(Axes[i]);
|
||||
Result := nil;
|
||||
end;
|
||||
|
||||
function TChartAxisList.GetOwner: TPersistent;
|
||||
begin
|
||||
Result := FChart;
|
||||
end;
|
||||
|
||||
procedure TChartAxisList.SetAxis(AIndex: Integer; AValue: TChartAxis);
|
||||
var
|
||||
a: TChartAxis;
|
||||
begin
|
||||
a := GetAxis(AIndex);
|
||||
if a = nil then
|
||||
a := Add;
|
||||
a.Assign(AValue);
|
||||
a.FAlignment := AXIS_INDEX[AIndex];
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user