TAChart: Various improvements of ChartEditor demo.

This commit is contained in:
wp_xyz 2021-08-03 14:24:57 +02:00
parent cbbc6306a8
commit 9ee5e00da7
32 changed files with 1605 additions and 696 deletions

View File

@ -0,0 +1,105 @@
object ChartArrowFrame: TChartArrowFrame
Left = 0
Height = 125
Top = 0
Width = 171
ClientHeight = 125
ClientWidth = 171
TabOrder = 0
DesignLeft = 390
DesignTop = 154
object cbArrowVisible: TCheckBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
Left = 0
Height = 19
Top = 0
Width = 54
Caption = 'Visible'
OnChange = cbArrowVisibleChange
TabOrder = 0
end
object lblArrowBaseLength: TLabel
AnchorSideLeft.Control = cbArrowVisible
AnchorSideTop.Control = seArrowBaseLength
AnchorSideTop.Side = asrCenter
Left = 0
Height = 15
Top = 31
Width = 61
Caption = 'Base length'
end
object lblArrowLength: TLabel
AnchorSideLeft.Control = cbArrowVisible
AnchorSideTop.Control = seArrowLength
AnchorSideTop.Side = asrCenter
Left = 0
Height = 15
Top = 62
Width = 37
Caption = 'Length'
end
object lblArrowWidth: TLabel
AnchorSideLeft.Control = cbArrowVisible
AnchorSideTop.Control = seArrowWidth
AnchorSideTop.Side = asrCenter
Left = 0
Height = 15
Top = 93
Width = 32
Caption = 'Width'
end
object seArrowBaseLength: TSpinEdit
AnchorSideLeft.Control = lblArrowBaseLength
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cbArrowVisible
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 85
Height = 23
Top = 27
Width = 86
Alignment = taRightJustify
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 24
BorderSpacing.Top = 8
MaxValue = 1000
OnChange = seArrowBaseLengthChange
TabOrder = 1
end
object seArrowLength: TSpinEdit
AnchorSideLeft.Control = seArrowBaseLength
AnchorSideTop.Control = seArrowBaseLength
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = seArrowBaseLength
AnchorSideRight.Side = asrBottom
Left = 85
Height = 23
Top = 58
Width = 86
Alignment = taRightJustify
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 8
MaxValue = 1000
OnChange = seArrowLengthChange
TabOrder = 2
end
object seArrowWidth: TSpinEdit
AnchorSideLeft.Control = seArrowBaseLength
AnchorSideTop.Control = seArrowLength
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = seArrowBaseLength
AnchorSideRight.Side = asrBottom
Left = 85
Height = 23
Top = 89
Width = 86
Alignment = taRightJustify
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 8
MaxValue = 1000
OnChange = seArrowWidthChange
TabOrder = 3
end
end

View File

@ -0,0 +1,81 @@
unit ceArrowFrame;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, StdCtrls, Spin,
TATypes;
type
{ TChartArrowFrame }
TChartArrowFrame = class(TFrame)
cbArrowVisible: TCheckBox;
lblArrowBaseLength: TLabel;
lblArrowLength: TLabel;
lblArrowWidth: TLabel;
seArrowBaseLength: TSpinEdit;
seArrowLength: TSpinEdit;
seArrowWidth: TSpinEdit;
procedure cbArrowVisibleChange(Sender: TObject);
procedure seArrowBaseLengthChange(Sender: TObject);
procedure seArrowLengthChange(Sender: TObject);
procedure seArrowWidthChange(Sender: TObject);
private
FArrow: TChartArrow;
procedure DoChange;
public
procedure Prepare(Arrow: TChartArrow);
end;
implementation
{$R *.lfm}
procedure TChartArrowFrame.cbArrowVisibleChange(Sender: TObject);
begin
FArrow.Visible := cbArrowVisible.Checked;
DoChange;
end;
procedure TChartArrowFrame.DoChange;
begin
lblArrowBaseLength.Enabled := cbArrowVisible.Checked;
seArrowBaseLength.Enabled := cbArrowVisible.Checked;
lblArrowLength.Enabled := cbArrowVisible.Checked;
seArrowLength.Enabled := cbArrowVisible.Checked;
lblArrowWidth.Enabled := cbArrowVisible.Checked;
seArrowWidth.Enabled := cbArrowVisible.Checked;
end;
procedure TChartArrowFrame.Prepare(Arrow: TChartArrow);
begin
FArrow := Arrow;
cbArrowVisible.Checked := Arrow.Visible;
seArrowBaseLength.Value := Arrow.BaseLength;
seArrowLength.Value := Arrow.Length;
seArrowWidth.Value := Arrow.Width;
DoChange;
end;
procedure TChartArrowFrame.seArrowBaseLengthChange(Sender: TObject);
begin
FArrow.BaseLength := seArrowBaseLength.Value;
end;
procedure TChartArrowFrame.seArrowLengthChange(Sender: TObject);
begin
FArrow.Length := seArrowLength.Value;
end;
procedure TChartArrowFrame.seArrowWidthChange(Sender: TObject);
begin
FArrow.Width := seArrowWidth.Value;
end;
end.

View File

@ -40,9 +40,9 @@ object ChartAxisFrame: TChartAxisFrame
Height = 446
Top = 25
Width = 646
ActivePage = pgTitle
ActivePage = pgLine
Align = alClient
TabIndex = 0
TabIndex = 3
TabOrder = 1
OnChanging = PageControlChanging
object pgTitle: TTabSheet
@ -62,12 +62,13 @@ object ChartAxisFrame: TChartAxisFrame
TabOrder = 0
object lblTitle: TLabel
AnchorSideLeft.Control = TitleMemoPanel
AnchorSideTop.Control = TitleMemoPanel
AnchorSideTop.Control = cbTitleVisible
AnchorSideTop.Side = asrBottom
Left = 0
Height = 15
Top = 2
Top = 27
Width = 21
BorderSpacing.Top = 2
BorderSpacing.Top = 8
Caption = 'Text'
end
object mmoTitle: TMemo
@ -79,32 +80,56 @@ object ChartAxisFrame: TChartAxisFrame
AnchorSideBottom.Control = TitleMemoPanel
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 170
Top = 21
Height = 145
Top = 46
Width = 622
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 4
OnChange = mmoTitleChange
ScrollBars = ssAutoBoth
TabOrder = 0
WordWrap = False
end
object cbTitleVisible: TCheckBox
AnchorSideTop.Control = lblTitle
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = TitleMemoPanel
AnchorSideLeft.Control = TitleMemoPanel
AnchorSideTop.Control = TitleMemoPanel
AnchorSideRight.Side = asrBottom
Left = 568
Left = 0
Height = 19
Top = 0
Width = 54
Alignment = taLeftJustify
Anchors = [akTop, akRight]
Caption = 'Visible'
Checked = True
OnChange = cbTitleVisibleChange
State = cbChecked
TabOrder = 1
end
object cbTitleHTML: TCheckBox
AnchorSideLeft.Control = cbTitleWordwrap
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cbTitleVisible
Left = 193
Height = 19
Top = 0
Width = 156
BorderSpacing.Left = 32
Caption = 'Support HTML in title text'
OnChange = cbTitleHTMLChange
TabOrder = 2
end
object cbTitleWordwrap: TCheckBox
AnchorSideLeft.Control = cbTitleVisible
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cbTitleVisible
Left = 86
Height = 19
Top = 0
Width = 75
BorderSpacing.Left = 32
Caption = 'Wordwrap'
OnChange = cbTitleWordwrapChange
TabOrder = 3
end
end
object TitleParamsPanel: TPanel
Left = 8
@ -598,19 +623,19 @@ object ChartAxisFrame: TChartAxisFrame
Left = 8
Height = 119
Top = 8
Width = 400
Width = 446
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 8
BorderSpacing.Top = 8
Caption = 'gbFrame'
ClientHeight = 99
ClientWidth = 396
ClientWidth = 442
TabOrder = 0
object cbFrameVisible: TCheckBox
Left = 16
Height = 19
Top = 8
Width = 364
Width = 410
Align = alTop
BorderSpacing.Left = 16
BorderSpacing.Top = 8
@ -630,18 +655,18 @@ object ChartAxisFrame: TChartAxisFrame
Left = 8
Height = 137
Top = 143
Width = 400
Width = 446
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 16
Caption = 'gbAxisLine'
ClientHeight = 117
ClientWidth = 396
ClientWidth = 442
TabOrder = 1
object cbAxisLineVisible: TCheckBox
Left = 16
Height = 19
Top = 8
Width = 364
Width = 410
Align = alTop
BorderSpacing.Left = 16
BorderSpacing.Top = 8
@ -658,113 +683,15 @@ object ChartAxisFrame: TChartAxisFrame
AnchorSideTop.Control = gbFrame
AnchorSideRight.Control = pgLine
AnchorSideRight.Side = asrBottom
Left = 432
Height = 156
Left = 478
Height = 131
Top = 8
Width = 200
Width = 152
Anchors = [akTop, akRight]
AutoSize = True
BorderSpacing.Left = 24
BorderSpacing.Right = 6
Caption = 'Arrow'
ClientHeight = 136
ClientWidth = 196
BorderSpacing.Right = 8
Caption = 'gbArrow'
TabOrder = 2
object cbArrowVisible: TCheckBox
AnchorSideLeft.Control = gbArrow
AnchorSideTop.Control = gbArrow
Left = 16
Height = 19
Top = 8
Width = 54
BorderSpacing.Left = 16
BorderSpacing.Top = 8
Caption = 'Visible'
OnChange = cbArrowVisibleChange
TabOrder = 0
end
object lblArrowBaseLength: TLabel
AnchorSideLeft.Control = cbArrowVisible
AnchorSideTop.Control = seArrowBaseLength
AnchorSideTop.Side = asrCenter
Left = 16
Height = 15
Top = 39
Width = 61
Caption = 'Base length'
end
object lblArrowLength: TLabel
AnchorSideLeft.Control = cbArrowVisible
AnchorSideTop.Control = seArrowLength
AnchorSideTop.Side = asrCenter
Left = 16
Height = 15
Top = 70
Width = 37
Caption = 'Length'
end
object lblArrowWidth: TLabel
AnchorSideLeft.Control = cbArrowVisible
AnchorSideTop.Control = seArrowWidth
AnchorSideTop.Side = asrCenter
Left = 16
Height = 15
Top = 101
Width = 32
Caption = 'Width'
end
object seArrowBaseLength: TSpinEdit
AnchorSideLeft.Control = lblArrowBaseLength
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cbArrowVisible
AnchorSideTop.Side = asrBottom
Left = 101
Height = 23
Top = 35
Width = 79
Alignment = taRightJustify
BorderSpacing.Left = 24
BorderSpacing.Top = 8
BorderSpacing.Right = 16
MaxValue = 1000
OnChange = seArrowBaseLengthChange
TabOrder = 1
end
object seArrowLength: TSpinEdit
AnchorSideLeft.Control = seArrowBaseLength
AnchorSideTop.Control = seArrowBaseLength
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = seArrowBaseLength
AnchorSideRight.Side = asrBottom
Left = 101
Height = 23
Top = 66
Width = 79
Alignment = taRightJustify
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 8
MaxValue = 1000
OnChange = seArrowLengthChange
TabOrder = 2
end
object seArrowWidth: TSpinEdit
AnchorSideLeft.Control = seArrowBaseLength
AnchorSideTop.Control = seArrowLength
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = seArrowBaseLength
AnchorSideRight.Side = asrBottom
Left = 101
Height = 23
Top = 97
Width = 79
Alignment = taRightJustify
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 8
BorderSpacing.Bottom = 16
MaxValue = 1000
OnChange = seArrowWidthChange
TabOrder = 3
end
end
end
end

View File

@ -1,7 +1,6 @@
unit ceAxisFrame;
{$MODE ObjFPC}{$H+}
{.$DEFINE WYSIWYG_AXISTITLE}
interface
@ -9,7 +8,7 @@ uses
Classes, SysUtils, Graphics, Forms,
Controls, ExtCtrls, ComCtrls, StdCtrls, Dialogs, Spin,
TATextElements, TAChartAxis, TAGraph,
ceFontFrame, cePenFrame, ceShapeBrushPenMarginsFrame;
ceFontFrame, cePenFrame, ceShapeBrushPenMarginsFrame, ceArrowFrame;
type
TChartAxisEditorPage = (aepTitle, aepLabels, aepGrid, aepLine);
@ -18,7 +17,6 @@ type
TChartAxisFrame = class(TFrame)
Bevel1: TBevel;
Bevel2: TBevel;
cbArrowVisible: TCheckBox;
cbAutoMax: TCheckBox;
cbAutoMin: TCheckBox;
cbAxisLineVisible: TCheckBox;
@ -29,6 +27,8 @@ type
cbShow: TCheckBox;
cbTickColor: TColorButton;
cbTitleVisible: TCheckBox;
cbTitleHTML: TCheckBox;
cbTitleWordwrap: TCheckBox;
edLabelFormat: TEdit;
gbArrow: TGroupBox;
gbAxisLine: TGroupBox;
@ -41,9 +41,6 @@ type
gbTicks: TGroupBox;
gbTitleFont: TGroupBox;
gbTitleShapeBrushPenMargins: TGroupBox;
lblArrowBaseLength: TLabel;
lblArrowLength: TLabel;
lblArrowWidth: TLabel;
lblAutomatic: TLabel;
lblLabelDistance: TLabel;
lblLabelFormat: TLabel;
@ -59,9 +56,6 @@ type
pgLine: TTabSheet;
pgTitle: TTabSheet;
rgTitleAlignment: TRadioGroup;
seArrowBaseLength: TSpinEdit;
seArrowLength: TSpinEdit;
seArrowWidth: TSpinEdit;
seLabelDistance: TSpinEdit;
seMaximum: TFloatSpinEdit;
seMinimum: TFloatSpinEdit;
@ -71,7 +65,6 @@ type
Spacer: TBevel;
TitleMemoPanel: TPanel;
TitleParamsPanel: TPanel;
procedure cbArrowVisibleChange(Sender: TObject);
procedure cbAutoMaxChange(Sender: TObject);
procedure cbAutoMinChange(Sender: TObject);
procedure cbAxisLineVisibleChange(Sender: TObject);
@ -81,14 +74,13 @@ type
procedure cbLabelsVisibleChange(Sender: TObject);
procedure cbShowChange(Sender: TObject);
procedure cbTickColorColorChanged(Sender: TObject);
procedure cbTitleHTMLChange(Sender: TObject);
procedure cbTitleVisibleChange(Sender: TObject);
procedure cbTitleWordwrapChange(Sender: TObject);
procedure edLabelFormatEditingDone(Sender: TObject);
procedure mmoTitleChange(Sender: TObject);
procedure PageControlChanging(Sender: TObject; var AllowChange: Boolean);
procedure rgTitleAlignmentClick(Sender: TObject);
procedure seArrowBaseLengthChange(Sender: TObject);
procedure seArrowLengthChange(Sender: TObject);
procedure seArrowWidthChange(Sender: TObject);
procedure seLabelDistanceChange(Sender: TObject);
procedure seMaximumChange(Sender: TObject);
procedure seMinimumChange(Sender: TObject);
@ -105,6 +97,7 @@ type
FFramePenFrame: TChartPenFrame;
FAxisLinePenFrame: TChartPenFrame;
FLabelShapeBrushPenMarginsFrame: TChartShapeBrushPenMarginsFrame;
FArrowFrame: TChartArrowFrame;
function GetAlignment(AItemIndex: Integer): TAlignment;
function GetAlignmentIndex(AValue: TAlignment): Integer;
@ -115,8 +108,6 @@ type
procedure LabelChangedHandler(Sender: TObject);
procedure LabelFontChangedHandler(Sender: TObject);
procedure LabelShapeChangedHandler(AShape: TChartLabelShape);
procedure TitleChangedHandler(Sender: TObject);
procedure TitleFontChangedHandler(Sender: TObject);
procedure TitleShapeChangedHandler(AShape: TChartLabelShape);
protected
procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
@ -124,6 +115,7 @@ type
function GetChart: TChart;
function GetRealAxisMax: Double;
function GetRealAxisMin: Double;
procedure UpdateControlState;
public
constructor Create(AOwner: TComponent); override;
procedure Prepare(Axis: TChartAxis);
@ -136,7 +128,7 @@ implementation
{$R *.lfm}
uses
Math,
Math, TAChartUtils,
ceUtils;
constructor TChartAxisFrame.Create(AOwner: TComponent);
@ -144,87 +136,96 @@ begin
inherited;
FTitleFontFrame := TChartFontFrame.Create(self);
FTitleFontFrame.Parent := gbTitleFont;
FTitleFontFrame.Name := '';
FTitleFontFrame.Align := alClient;
FTitleFontFrame.BorderSpacing.Left := 8;
FTitleFontFrame.BorderSpacing.Right := 8;
FTitleFontFrame.OnChange := @TitleFontChangedHandler;
FTitleFontFrame.Parent := gbTitleFont;
gbTitleFont.AutoSize := true;
gbTitleFont.Caption := 'Font';
FTitleShapeBrushPenMarginsFrame := TChartShapeBrushPenMarginsFrame.Create(self);
FTitleShapeBrushPenMarginsFrame.Parent := gbTitleShapeBrushPenMargins;
FTitleShapeBrushPenMarginsFrame.Name := '';
FTitleShapeBrushPenMarginsFrame.Align := alClient;
FTitleShapeBrushPenMarginsFrame.BorderSpacing.Left := 8;
FTitleShapeBrushPenMarginsFrame.BorderSpacing.Right := 8;
FTitleShapeBrushPenMarginsFrame.BorderSpacing.Bottom := 8;
FTitleShapeBrushPenMarginsFrame.OnChange := @TitleChangedHandler;
FTitleShapeBrushPenMarginsFrame.OnShapeChange := @TitleShapeChangedHandler;
FTitleShapeBrushPenMarginsFrame.AutoSize := true;
FTitleShapeBrushPenMarginsFrame.Parent := gbTitleShapeBrushPenMargins;
gbTitleShapeBrushPenMargins.AutoSize := true;
gbTitleShapeBrushPenMargins.Caption := 'Title background';
FLabelFontFrame := TChartFontFrame.Create(self);
FLabelFontFrame.Parent := gbLabelFont;
FLabelFontFrame.Name := '';
FLabelFontFrame.Align := alClient;
FLabelFontFrame.BorderSpacing.Left := 8;
FLabelFontFrame.BorderSpacing.Right := 8;
FLabelFontFrame.Parent := gbLabelFont;
FLabelFontFrame.OnChange := @LabelFontChangedHandler;
gbLabelFont.AutoSize := true;
gbLabelFont.Caption := 'Label font';
FLabelShapeBrushPenMarginsFrame := TChartShapeBrushPenMarginsFrame.Create(self);
FLabelShapeBrushPenMarginsFrame.Parent := gbShapeFillBorder;
FLabelShapeBrushPenMarginsFrame.Name := '';
FLabelShapeBrushPenMarginsFrame.Align := alClient;
FLabelShapeBrushPenMarginsFrame.BorderSpacing.Left := 8;
FLabelShapeBrushPenMarginsFrame.BorderSpacing.Right := 8;
FLabelShapeBrushPenMarginsFrame.BorderSpacing.Bottom := 8;
FLabelShapeBrushPenMarginsFrame.OnChange := @LabelChangedHandler;
FLabelShapeBrushPenMarginsFrame.OnShapeChange := @LabelShapeChangedHandler;
FLabelShapeBrushPenMarginsFrame.AutoSize := true;
FLabelShapeBrushPenMarginsFrame.Parent := gbShapeFillBorder;
gbShapeFillBorder.AutoSize := true;
gbShapeFillBorder.Caption := 'Label background';
FGridPenFrame := TChartPenFrame.Create(Self);
FGridPenFrame.Parent := gbGrid;
FGridPenFrame.Name := '';
FGridPenFrame.Align := alTop;
FGridPenFrame.Top := 1000;
FGridPenFrame.BorderSpacing.Left := 16;
FGridPenFrame.BorderSpacing.Right := 16;
FGridPenFrame.BorderSpacing.Bottom := 16;
FGridPenFrame.Parent := gbGrid;
FGridPenFrame.OnChange := @ChangedHandler;
gbGrid.AutoSize := true;
gbGrid.Caption := 'Grid lines';
FFramePenFrame := TChartPenFrame.Create(Self);
FFramePenFrame.Parent := gbFrame;
FFramePenFrame.Name := '';
FFramePenFrame.Align := alTop;
FFramePenFrame.Top := 1000;
FFramePenFrame.BorderSpacing.Left := 16;
FFramePenFrame.BorderSpacing.Right := 16;
FFramePenFrame.BorderSpacing.Bottom := 16;
FFramePenFrame.OnChange := @ChangedHandler;
FFramePenFrame.Parent := gbFrame;
// FFramePenFrame.OnChange := @ChangedHandler;
gbFrame.AutoSize := true;
gbFrame.Caption := 'Frame';
FAxisLinePenFrame := TChartPenFrame.Create(Self);
FAxisLinePenFrame.Parent := gbAxisLine;
FAxisLinePenFrame.Name := '';
FAxisLinePenFrame.Align := alTop;
FAxisLinePenFrame.Top := 1000;
FAxisLinePenFrame.BorderSpacing.Left := 16;
FAxisLinePenFrame.BorderSpacing.Right := 16;
FAxisLinePenFrame.BorderSpacing.Bottom := 16;
FAxisLinePenFrame.OnChange := @ChangedHandler;
FAxisLinePenFrame.Parent := gbAxisLine;
// FAxisLinePenFrame.OnChange := @ChangedHandler;
gbAxisLine.AutoSize := true;
gbAxisLine.Caption := 'Axis line';
FArrowFrame := TChartArrowFrame.Create(self);
FArrowFrame.Name := '';
FArrowFrame.Align := alClient;
FArrowFrame.BorderSpacing.Top := 8;
FArrowFrame.BorderSpacing.Left := 16;
FArrowFrame.BorderSpacing.Right := 16;
FArrowFrame.BorderSpacing.Bottom := 16;
FArrowFrame.AutoSize := true;
FArrowFrame.Parent := gbArrow;
gbArrow.AutoSize := true;
gbArrow.Caption := 'Arrow';
BoldHeaders(self);
TitleParamsPanel.AutoSize := true;
@ -253,11 +254,6 @@ begin
PanelTop.Height;
end;
procedure TChartAxisFrame.cbArrowVisibleChange(Sender: TObject);
begin
FAxis.Arrow.Visible := cbArrowVisible.Checked;
end;
procedure TChartAxisFrame.cbAutoMaxChange(Sender: TObject);
begin
FAxis.Range.UseMax := not cbAutoMax.Checked;
@ -273,16 +269,19 @@ end;
procedure TChartAxisFrame.cbAxisLineVisibleChange(Sender: TObject);
begin
FAxis.AxisPen.Visible := cbAxisLineVisible.Checked;
UpdateControlState;
end;
procedure TChartAxisFrame.cbFrameVisibleChange(Sender: TObject);
begin
GetChart.Frame.Visible := cbFrameVisible.Checked;
UpdateControlState;
end;
procedure TChartAxisFrame.cbGridVisibleChange(Sender: TObject);
begin
FAxis.Grid.Visible := cbGridVisible.Checked;
UpdateControlState;
end;
procedure TChartAxisFrame.cbInvertedChange(Sender: TObject);
@ -293,11 +292,13 @@ end;
procedure TChartAxisFrame.cbLabelsVisibleChange(Sender: TObject);
begin
FAxis.Marks{%H-}.Visible := cbLabelsVisible.Checked;
UpdateControlState;
end;
procedure TChartAxisFrame.cbShowChange(Sender: TObject);
begin
FAxis.Visible := cbShow.Checked;
PageControl.Visible := cbShow.checked;
end;
procedure TChartAxisFrame.cbTickColorColorChanged(Sender: TObject);
@ -305,9 +306,20 @@ begin
FAxis.TickColor := cbTickColor.ButtonColor;
end;
procedure TChartAxisFrame.cbTitleHTMLChange(Sender: TObject);
begin
FAxis.Title.TextFormat := TEXT_FORMAT[cbTitleHTML.Checked];
end;
procedure TChartAxisFrame.cbTitleVisibleChange(Sender: TObject);
begin
FAxis.Title.Visible := cbTitleVisible.Checked;
UpdateControlState;
end;
procedure TChartAxisFrame.cbTitleWordwrapChange(Sender: TObject);
begin
FAxis.Title.Wordwrap := cbTitleWordwrap.Checked;
end;
procedure TChartAxisFrame.ChangedHandler(Sender: TObject);
@ -403,15 +415,9 @@ begin
// Page "Title"
cbTitleVisible.Checked := Axis.Title.Visible;
cbTitleWordwrap.Checked := Axis.Title.Wordwrap;
cbTitleHTML.Checked := (Axis.Title.TextFormat = tfHTML);
mmoTitle.Lines.Text := Axis.Title.Caption;
{$IFDEF WYSIWYG_AXISTITLE}
mmoTitle.Font := Axis.Title.LabelFont;
mmoTitle.Font.Orientation := 0; // Memo has horizontal text only
if Axis.Title.LabelBrush.Style <> bsClear then
mmoTitle.Color := Axis.Title.LabelBrush.Color
else
mmoTitle.Color := GetChart.Color;
{$ENDIF}
with Axis.Title do begin
rgTitleAlignment.ItemIndex := GetAlignmentIndex(Alignment);
seTitleDistance.Value := Distance;
@ -438,49 +444,38 @@ begin
end;
// Page "Grid"
cbGridVisible.Checked := FAxis.Grid.EffVisible;
FGridPenFrame.Prepare(FAxis.Grid);
cbGridVisible.Checked := Axis.Grid.EffVisible;
FGridPenFrame.Prepare(Axis.Grid);
// Page "Line"
cbFrameVisible.Checked := GetChart.Frame.EffVisible;
FFramePenFrame.Prepare(GetChart.Frame);
cbAxisLineVisible.Checked := FAxis.AxisPen.EffVisible;
FAxisLinePenFrame.Prepare(FAxis.AxisPen);
cbArrowVisible.Checked := FAxis.Arrow.Visible;
seArrowBaseLength.Value := FAxis.Arrow.BaseLength;
seArrowLength.Value := FAxis.Arrow.Length;
seArrowWidth.Value := FAxis.Arrow.Width;
cbAxisLineVisible.Checked := Axis.AxisPen.EffVisible;
FAxisLinePenFrame.Prepare(Axis.AxisPen);
FArrowFrame.Prepare(Axis.Arrow);
UpdateControlState;
end;
procedure TChartAxisFrame.rgTitleAlignmentClick(Sender: TObject);
begin
FAxis.Title.Alignment := GetAlignment(rgTitleAlignment.ItemIndex);
end;
procedure TChartAxisFrame.seArrowBaseLengthChange(Sender: TObject);
begin
FAxis.Arrow.BaseLength := seArrowBaseLength.value;
end;
procedure TChartAxisFrame.seArrowLengthChange(Sender: TObject);
begin
FAxis.Arrow.Length := seArrowLength.Value;
end;
procedure TChartAxisFrame.seArrowWidthChange(Sender: TObject);
begin
FAxis.Arrow.Width := seArrowWidth.Value;
if Assigned(FAxis) then
FAxis.Title.Alignment := GetAlignment(rgTitleAlignment.ItemIndex);
end;
procedure TChartAxisFrame.seLabelDistanceChange(Sender: TObject);
begin
FAxis.Marks{%H-}.Distance := seLabelDistance.Value;
if Assigned(FAxis) then
FAxis.Marks{%H-}.Distance := seLabelDistance.Value;
end;
procedure TChartAxisFrame.seMaximumChange(Sender: TObject);
begin
FAxis.Range.Max := seMaximum.Value;
cbAutoMax.Checked := false;
if Assigned(FAxis) then
begin
FAxis.Range.Max := seMaximum.Value;
cbAutoMax.Checked := false;
end;
end;
procedure TChartAxisFrame.seMinimumChange(Sender: TObject);
@ -496,36 +491,20 @@ end;
procedure TChartAxisFrame.seTickLengthChange(Sender: TObject);
begin
FAxis.TickLength := seTickLength.Value;
if Assigned(FAxis) then
FAxis.TickLength := seTickLength.Value;
end;
procedure TChartAxisFrame.seTickInnerLengthChange(Sender: TObject);
begin
FAxis.TickInnerLength := seTickInnerLength.Value;
if Assigned(FAxis) then
FAxis.TickInnerLength := seTickInnerLength.Value;
end;
procedure TChartAxisFrame.seTitleDistanceChange(Sender: TObject);
begin
FAxis.Title.Distance := seTitleDistance.Value;
end;
procedure TChartAxisFrame.TitleChangedHandler(Sender: TObject);
begin
{$IFDEF WYSIWYG_AXISTITLE}
if FAxis.Title.LabelBrush.Style <> bsClear then
mmoTitle.Color := FAxis.Title.LabelBrush.Color
else
mmoTitle.Color := GetChart.Color;
{$ENDIF}
GetChart.Invalidate;
end;
procedure TChartAxisFrame.TitleFontChangedHandler(Sender: TObject);
begin
{$IFDEF WYSIWYG_AXISTITLE}
mmoTitle.Font.Assign(FAxis.Title.LabelFont);
mmoTitle.Font.Orientation := 0;
{$ENDIF}
if Assigned(FAxis) then
FAxis.Title.Distance := seTitleDistance.Value;
end;
procedure TChartAxisFrame.TitleShapeChangedHandler(AShape: TChartLabelShape);
@ -533,6 +512,29 @@ begin
FAxis.Title.Shape := AShape;
end;
procedure TChartAxisFrame.UpdateControlstate;
begin
// title
cbTitleWordwrap.Enabled := cbTitleVisible.Checked;
cbTitleHTML.Enabled := cbTitleVisible.Checked;
lblTitle.Enabled := cbTitleVisible.Checked;
mmoTitle.Enabled := cbTitleVisible.Checked;
TitleParamsPanel.Enabled := cbTitleVisible.Checked;
// labels
lblLabelFormat.Enabled := cbLabelsVisible.Checked;
edlabelFormat.Enabled := cbLabelsVisible.Checked;
lblLabelDistance.Enabled := cbLabelsVisible.Checked;
seLabelDistance.Enabled := cbLabelsVisible.Checked;
// grid
FGridPenFrame.Enabled := cbGridVisible.Checked;
// Line
FAxisLinePenFrame.Enabled := cbAxisLineVisible.Checked;
FFramePenFrame.Enabled := cbFrameVisible.Checked;
end;
function TChartAxisFrame.Validate(out AMsg: String; out AControl: TWinControl): Boolean;
begin
Result := false;

View File

@ -1,4 +1,4 @@
object BrushFrame: TChartBrushFrame
object ChartBrushFrame: TChartBrushFrame
Left = 0
Height = 24
Top = 0
@ -38,7 +38,6 @@ object BrushFrame: TChartBrushFrame
Top = 5
Width = 25
Caption = 'Style'
ParentColor = False
end
object cbBrushColor: TColorButton
AnchorSideLeft.Side = asrBottom

View File

@ -21,12 +21,10 @@ type
FBrush: TBrush;
FOnChange: TNotifyEvent;
procedure DoChanged;
public
constructor Create(AOwner: TComponent); override;
procedure Prepare(ABrush: TBrush);
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
implementation

View File

@ -21,13 +21,11 @@ object ChartEditorForm: TChartEditorForm
OKButton.OnClick = OKButtonClick
HelpButton.Name = 'HelpButton'
HelpButton.DefaultCaption = True
CloseButton.Name = 'ApplyButton'
CloseButton.Caption = 'Apply'
CloseButton.OnClick = ApplyButtonClick
CloseButton.Name = 'CloseButton'
CancelButton.Name = 'CancelButton'
CancelButton.DefaultCaption = True
TabOrder = 0
ShowButtons = [pbOK, pbCancel, pbClose]
ShowButtons = [pbOK, pbCancel]
end
object Tree: TTreeView
Left = 6

View File

@ -6,7 +6,7 @@ interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ButtonPanel, ComCtrls,
ExtCtrls, StdCtrls,
ExtCtrls, StdCtrls, Buttons,
TAGraph, TAChartAxis, TACustomSeries, TASeries, TAChartImageList,
ceAxisFrame;
@ -15,7 +15,7 @@ type
{ TChartEditorForm }
TChartEditorForm = class(TForm)
ApplyButton: TPanelBitBtn;
CloseButton: TPanelBitBtn;
ButtonPanel: TButtonPanel;
Image1: TImage;
Label1: TLabel;
@ -23,7 +23,6 @@ type
TitlePanel: TPanel;
Splitter1: TSplitter;
Tree: TTreeView;
procedure ApplyButtonClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
@ -43,8 +42,10 @@ type
FAxesNode: TTreeNode;
FSeriesNode: TTreeNode;
FOKClicked: Boolean;
FApplyButton: TBitBtn;
function AddFrame(AParentNode: TTreeNode; ACaption: String; AFrame: TFrame;
AImageIndex: Integer): TTreeNode;
procedure ApplyButtonClick(Sender: TObject);
procedure FindComponentClass({%H-}AReader: TReader; const AClassName: String;
var AClass: TComponentClass);
function GetPageIndexOfNode(ANode: TTreeNode): Integer;
@ -213,6 +214,20 @@ begin
end;
procedure TChartEditorForm.ApplyButtonClick(Sender: TObject);
var
msg: String;
C: TWinControl;
begin
if not Validate(Tree.Selected, msg, C) then
begin
C.SetFocus;
MessageDlg(msg, mtError, [mbOK], 0);
ModalResult := mrNone;
end else
SaveChartToStream;
end;
(*
procedure TChartEditorForm.CloseButtonClick(Sender: TObject);
var
msg: String;
C: TWinControl;
@ -225,7 +240,7 @@ begin
end else
RestoreChartFromStream;
end;
*)
procedure TChartEditorForm.FormActivate(Sender: TObject);
var
w: Integer = 0;
@ -318,6 +333,15 @@ begin
Tree.Items.EndUpdate;
end;
FApplyButton := TBitBtn.Create(ButtonPanel);
FApplyButton.Caption := 'Apply';
FApplyButton.Images := ChartImagesDM.ChartImages;
FApplyButton.ImageIndex := 7;
FApplyButton.AutoSize := true;
FApplyButton.OnClick := @ApplyButtonClick;
FApplyButton.AnchorSideTop.Control := ButtonPanel.OKButton;
FApplyButton.Parent := ButtonPanel;
AutoSize := true;
end;
@ -444,6 +468,7 @@ procedure TChartEditorForm.SaveChartToStream;
var
i: Integer;
begin
FSavedChartStream.Position := 0;
WriteComponentAsTextToStream(FSavedChartStream, FChart);
for i := 0 to FChart.SeriesCount-1 do
WriteComponentAsTextToStream(FSavedSeriesStreams[i], FChart.Series[i]);

View File

@ -1,4 +1,4 @@
object FontFrame: TChartFontFrame
object ChartFontFrame: TChartFontFrame
Left = 0
Height = 84
Top = 0
@ -37,7 +37,7 @@ object FontFrame: TChartFontFrame
Font.Style = [fsBold]
OnChange = cbBoldChange
ParentFont = False
TabOrder = 1
TabOrder = 2
end
object cbItalic: TCheckBox
AnchorSideLeft.Control = cbBold
@ -52,7 +52,7 @@ object FontFrame: TChartFontFrame
Font.Style = [fsItalic]
OnChange = cbItalicChange
ParentFont = False
TabOrder = 2
TabOrder = 3
end
object cbUnderline: TCheckBox
AnchorSideLeft.Control = cbItalic
@ -69,7 +69,7 @@ object FontFrame: TChartFontFrame
Font.Style = [fsUnderline]
OnChange = cbUnderlineChange
ParentFont = False
TabOrder = 3
TabOrder = 4
end
object Panel2: TPanel
AnchorSideLeft.Control = Owner
@ -88,7 +88,7 @@ object FontFrame: TChartFontFrame
ChildSizing.ControlsPerLine = 3
ClientHeight = 31
ClientWidth = 301
TabOrder = 4
TabOrder = 1
object cmbFontSize: TComboBox
AnchorSideLeft.Control = Panel2
AnchorSideTop.Side = asrCenter
@ -127,7 +127,6 @@ object FontFrame: TChartFontFrame
Width = 31
Caption = 'Angle'
FocusControl = seOrientation
ParentColor = False
end
object seOrientation: TSpinEdit
AnchorSideLeft.Control = lblOrientation

View File

@ -34,13 +34,11 @@ type
FFont: TFont;
FOnChange: TNotifyEvent;
procedure DoChanged;
public
constructor Create(AOwner: TComponent); override;
procedure GetData(AFont: TFont);
procedure Prepare(AFont: TFont; WithOrientation: boolean);
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
implementation

View File

@ -6,8 +6,8 @@ object ChartLegendFrame: TChartLegendFrame
ClientHeight = 400
ClientWidth = 671
TabOrder = 0
DesignLeft = 380
DesignTop = 303
DesignLeft = 1101
DesignTop = 368
object PanelTop: TPanel
Left = 0
Height = 23
@ -37,18 +37,30 @@ object ChartLegendFrame: TChartLegendFrame
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cbShow
AnchorSideRight.Side = asrBottom
Left = 65
Left = 81
Height = 19
Top = 0
Width = 87
Alignment = taLeftJustify
BorderSpacing.Left = 16
BorderSpacing.Left = 32
Caption = 'Outside axes'
Checked = True
OnChange = cbUseSideBarChange
State = cbChecked
TabOrder = 1
end
object cbHTML: TCheckBox
AnchorSideLeft.Control = cbUseSideBar
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = PanelTop
Left = 200
Height = 19
Top = 0
Width = 181
BorderSpacing.Left = 32
Caption = 'Support HTML in legend items'
OnChange = cbHTMLChange
TabOrder = 2
end
end
object ParamsPanel: TPanel
Left = 0
@ -56,7 +68,6 @@ object ChartLegendFrame: TChartLegendFrame
Top = 31
Width = 671
Align = alClient
AutoSize = True
BevelOuter = bvNone
ClientHeight = 369
ClientWidth = 671
@ -65,94 +76,33 @@ object ChartLegendFrame: TChartLegendFrame
AnchorSideLeft.Control = gbAlignment
AnchorSideTop.Control = gbAlignment
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Background_Border_Spacer
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 83
Height = 72
Top = 128
Width = 140
Width = 127
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 16
Caption = 'Background'
ClientHeight = 63
ClientWidth = 136
BorderSpacing.Right = 16
Caption = 'gbBackground'
TabOrder = 2
object cbFilled: TCheckBox
AnchorSideLeft.Control = gbBackground
AnchorSideTop.Control = gbBackground
Left = 8
Height = 19
Top = 6
Width = 48
BorderSpacing.Left = 8
BorderSpacing.Top = 6
Caption = 'Filled'
OnChange = cbFilledChange
TabOrder = 0
end
object cbFillColor: TColorBox
AnchorSideLeft.Control = cbFilled
AnchorSideTop.Control = cbFilled
AnchorSideTop.Side = asrBottom
Left = 8
Height = 22
Top = 33
Width = 120
Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames, cbCustomColors]
BorderSpacing.Top = 8
BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
ItemHeight = 16
OnChange = cbFillColorChange
TabOrder = 1
end
end
object gbBorder: TGroupBox
AnchorSideLeft.Control = gbBackground
AnchorSideLeft.Side = asrBottom
AnchorSideLeft.Control = Background_Border_Spacer
AnchorSideTop.Control = gbAlignment
AnchorSideTop.Side = asrBottom
AnchorSideBottom.Control = gbBackground
AnchorSideRight.Control = gbAlignment
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Side = asrBottom
Left = 156
Height = 83
Left = 143
Height = 88
Top = 128
Width = 140
Anchors = [akTop, akLeft, akBottom]
BorderSpacing.Left = 16
Width = 153
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 16
Caption = 'Border'
ClientHeight = 63
ClientWidth = 136
Caption = 'gbBorder'
TabOrder = 3
object cbShowBorder: TCheckBox
AnchorSideLeft.Control = gbBorder
AnchorSideTop.Control = gbBorder
Left = 8
Height = 19
Top = 6
Width = 54
BorderSpacing.Left = 8
BorderSpacing.Top = 6
Caption = 'Visible'
OnChange = cbShowBorderChange
TabOrder = 0
end
object cbBorderColor: TColorBox
AnchorSideLeft.Control = cbShowBorder
AnchorSideTop.Control = cbShowBorder
AnchorSideTop.Side = asrBottom
Left = 8
Height = 22
Top = 33
Width = 120
Style = [cbStandardColors, cbExtendedColors, cbSystemColors, cbPrettyNames]
BorderSpacing.Top = 8
BorderSpacing.Right = 8
BorderSpacing.Bottom = 6
ItemHeight = 16
OnChange = cbBorderColorChange
TabOrder = 1
Visible = False
end
end
object gbFont: TGroupBox
AnchorSideLeft.Control = gbAlignment
@ -288,36 +238,39 @@ object ChartLegendFrame: TChartLegendFrame
AnchorSideRight.Side = asrBottom
Left = 0
Height = 83
Top = 224
Width = 140
Anchors = [akTop, akRight]
BorderSpacing.Top = 13
Top = 216
Width = 127
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 16
Caption = 'Margins'
ClientHeight = 63
ClientWidth = 136
ClientWidth = 123
TabOrder = 4
object lblMarginX: TLabel
AnchorSideLeft.Control = gbMargins
AnchorSideTop.Control = seMarginX
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = seMarginX
Left = 31
Left = 16
Height = 15
Top = 8
Width = 7
Anchors = [akTop, akRight]
BorderSpacing.Left = 16
BorderSpacing.Right = 8
Caption = 'X'
FocusControl = seMarginX
end
object seMarginX: TSpinEdit
AnchorSideLeft.Control = lblMarginX
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = gbMargins
AnchorSideRight.Side = asrBottom
Left = 46
Left = 31
Height = 23
Top = 4
Width = 74
Width = 76
Alignment = taRightJustify
Anchors = [akTop, akRight]
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 4
BorderSpacing.Right = 10
MaxValue = 1000
@ -326,30 +279,33 @@ object ChartLegendFrame: TChartLegendFrame
Value = 1
end
object lblMarginY: TLabel
AnchorSideLeft.Control = lblMarginX
AnchorSideTop.Control = seMarginY
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = seMarginY
Left = 33
Left = 16
Height = 15
Top = 37
Width = 7
Anchors = [akTop, akRight]
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Right = 8
Caption = 'Y'
FocusControl = seMarginY
end
object seMarginY: TSpinEdit
AnchorSideLeft.Control = seMarginX
AnchorSideTop.Control = seMarginX
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = seMarginX
AnchorSideRight.Side = asrBottom
Left = 48
Left = 31
Height = 23
Top = 33
Width = 74
Width = 76
Alignment = taRightJustify
Anchors = [akTop, akRight]
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
BorderSpacing.Right = 10
BorderSpacing.Bottom = 8
MaxValue = 1000
OnChange = seMarginYChange
TabOrder = 1
@ -358,14 +314,20 @@ object ChartLegendFrame: TChartLegendFrame
end
object gbItems: TGroupBox
AnchorSideLeft.Control = gbFont
AnchorSideTop.Control = gbBackground
AnchorSideTop.Control = gbFont
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbFont
AnchorSideRight.Side = asrBottom
Left = 316
Height = 179
Height = 165
Top = 128
Width = 222
Width = 216
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Top = 16
Caption = 'Items'
ClientHeight = 159
ClientWidth = 218
ClientHeight = 145
ClientWidth = 212
TabOrder = 5
object cbInverted: TCheckBox
AnchorSideLeft.Control = gbItems
@ -385,7 +347,7 @@ object ChartLegendFrame: TChartLegendFrame
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbItems
AnchorSideRight.Side = asrBottom
Left = 114
Left = 108
Height = 23
Top = 33
Width = 96
@ -407,7 +369,7 @@ object ChartLegendFrame: TChartLegendFrame
Left = 8
Height = 15
Top = 37
Width = 98
Width = 92
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Right = 8
Caption = 'Columns'
@ -420,8 +382,8 @@ object ChartLegendFrame: TChartLegendFrame
AnchorSideRight.Control = cbItemFillOrder
Left = 8
Height = 15
Top = 68
Width = 98
Top = 64
Width = 92
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Right = 8
Caption = 'Item fill order'
@ -431,12 +393,12 @@ object ChartLegendFrame: TChartLegendFrame
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbItems
AnchorSideRight.Side = asrBottom
Left = 114
Left = 108
Height = 23
Top = 64
Top = 60
Width = 96
Anchors = [akTop, akRight]
BorderSpacing.Top = 8
BorderSpacing.Top = 4
BorderSpacing.Right = 8
ItemHeight = 15
ItemIndex = 0
@ -453,13 +415,13 @@ object ChartLegendFrame: TChartLegendFrame
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbItems
AnchorSideRight.Side = asrBottom
Left = 114
Left = 108
Height = 23
Top = 95
Top = 87
Width = 96
Alignment = taRightJustify
Anchors = [akTop, akRight]
BorderSpacing.Top = 8
BorderSpacing.Top = 4
BorderSpacing.Right = 8
MaxValue = 1000
OnChange = seSpacingChange
@ -473,8 +435,8 @@ object ChartLegendFrame: TChartLegendFrame
AnchorSideRight.Control = seSpacing
Left = 8
Height = 15
Top = 99
Width = 98
Top = 91
Width = 92
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Right = 8
Caption = 'Spacing'
@ -485,14 +447,15 @@ object ChartLegendFrame: TChartLegendFrame
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbItems
AnchorSideRight.Side = asrBottom
Left = 114
Left = 108
Height = 23
Top = 126
Top = 114
Width = 96
Alignment = taRightJustify
Anchors = [akTop, akRight]
BorderSpacing.Top = 8
BorderSpacing.Top = 4
BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
MaxValue = 1000
OnChange = seSymbolWidthChange
TabOrder = 4
@ -505,13 +468,23 @@ object ChartLegendFrame: TChartLegendFrame
AnchorSideRight.Control = seSymbolWidth
Left = 8
Height = 15
Top = 130
Width = 98
Top = 118
Width = 92
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Right = 8
Caption = 'Symbol width'
FocusControl = seSymbolWidth
end
end
object Background_Border_Spacer: TBevel
AnchorSideLeft.Control = gbAlignment
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = gbBorder
Left = 143
Height = 42
Top = 128
Width = 10
Shape = bsSpacer
end
end
end

View File

@ -8,7 +8,7 @@ uses
Classes, SysUtils, Graphics,
Forms, Controls, ExtCtrls, ColorBox, StdCtrls, Spin,
TALegend, TAGraph,
ceFontFrame;
ceFontFrame, ceSimpleBrushFrame, ceSimplePenFrame;
type
@ -16,14 +16,12 @@ type
TChartLegendFrame = class(TFrame)
Bevel1: TBevel;
cbBorderColor: TColorBox;
cbFillColor: TColorBox;
cbFilled: TCheckBox;
Background_Border_Spacer: TBevel;
cbInverted: TCheckBox;
cbItemFillOrder: TComboBox;
cbShow: TCheckBox;
cbShowBorder: TCheckBox;
cbUseSideBar: TCheckBox;
cbHTML: TCheckBox;
gbAlignment: TGroupBox;
gbBackground: TGroupBox;
gbBorder: TGroupBox;
@ -51,12 +49,9 @@ type
seMarginY: TSpinEdit;
seSpacing: TSpinEdit;
seSymbolWidth: TSpinEdit;
procedure cbBorderColorChange(Sender: TObject);
procedure cbFillColorChange(Sender: TObject);
procedure cbFilledChange(Sender: TObject);
procedure cbHTMLChange(Sender: TObject);
procedure cbInvertedChange(Sender: TObject);
procedure cbItemFillOrderChange(Sender: TObject);
procedure cbShowBorderChange(Sender: TObject);
procedure cbShowChange(Sender: TObject);
procedure cbUseSideBarChange(Sender: TObject);
procedure gbAlignmentClick(Sender: TObject);
@ -68,10 +63,13 @@ type
private
FLegend: TChartLegend;
FFontFrame: TChartFontFrame;
procedure ChangedHandler(Sender: TObject);
FBackgroundFrame: TSimpleChartBrushFrame;
FBorderFrame: TSimpleChartPenFrame;
function GetAlignment: TLegendAlignment;
procedure SetAlignment(AValue: TLegendAlignment);
protected
procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
{%H-}WithThemeSpace: Boolean); override;
function GetChart: TChart;
public
constructor Create(AOwner: TComponent); override;
@ -84,6 +82,8 @@ implementation
{$R *.lfm}
uses
Math,
TATypes, TAChartUtils,
ceUtils;
constructor TChartLegendFrame.Create(AOwner: TComponent);
@ -97,30 +97,51 @@ begin
FFontFrame.BorderSpacing.Left := 8;
FFontFrame.BorderSpacing.Right := 8;
FFontFrame.AutoSize := true;
FFontFrame.OnChange := @ChangedHandler;
gbFont.AutoSize := true;
gbFont.Caption := 'Font';
FBackgroundFrame := TSimpleChartBrushFrame.Create(self);
FBackgroundFrame.Name := '';
FBackgroundFrame.Align := alClient;
FBackgroundFrame.BorderSpacing.Left := 8;
FBackgroundFrame.BorderSpacing.Right := 8;
FBackgroundFrame.BorderSpacing.Bottom := 8;
FBackgroundFrame.Parent := gbBackground;
FBackgroundFrame.AutoSize := true;
gbBackground.AutoSize := true;
gbBackground.Caption := 'Background';
FBorderFrame := TSimpleChartPenFrame.Create(self);
FBorderFrame.Name := '';
FBorderFrame.Align := alClient;
FBorderFrame.BorderSpacing.Left := 8;
FBorderFrame.BorderSpacing.Right := 8;
FBorderFrame.BorderSpacing.Bottom := 8;
FBorderFrame.AutoSize := true;
FBorderFrame.Parent := gbBorder;
gbBorder.AutoSize := true;
gbBorder.Caption := 'Border';
BoldHeaders(Self);
end;
procedure TChartLegendFrame.cbBorderColorChange(Sender: TObject);
procedure TChartLegendFrame.CalculatePreferredSize(
var PreferredWidth, PreferredHeight: integer;
WithThemeSpace: Boolean);
begin
FLegend.Frame.Color := cbBorderColor.Selected;
PreferredHeight := PanelTop.Height + PanelTop.BorderSpacing.Bottom +
Max(
gbAlignment.Height + gbBackground.Height + gbBackground.BorderSpacing.Top +
gbMargins.Height + gbMargins.Borderspacing.Top,
gbFont.Height + gbItems.Height + gbItems.BorderSpacing.Top
);
PreferredWidth := gbAlignment.Width + gbFont.Width + gbFont.BorderSpacing.Left;
end;
procedure TChartLegendFrame.cbFilledChange(Sender: TObject);
procedure TChartLegendFrame.cbHTMLChange(Sender: TObject);
begin
cbFillColor.Visible := cbFilled.Checked;
if cbFilled.Checked then
FLegend.BackgroundBrush.Style := bsSolid
else
FLegend.BackgroundBrush.Style := bsClear;
end;
procedure TChartLegendFrame.cbFillColorChange(Sender: TObject);
begin
FLegend.BackgroundBrush.Color := cbFillColor.Selected;
FLegend.TextFormat := TEXT_FORMAT[cbHTML.Checked];
end;
procedure TChartLegendFrame.cbInvertedChange(Sender: TObject);
@ -137,6 +158,7 @@ procedure TChartLegendFrame.cbShowChange(Sender: TObject);
begin
FLegend.Visible := cbShow.Checked;
cbUseSideBar.Visible := cbShow.Checked;
cbHTML.Visible := cbShow.Checked;
gbAlignment.Visible := cbShow.Checked;
gbFont.Visible := cbShow.Checked;
gbBackground.Visible := cbShow.Checked;
@ -145,53 +167,16 @@ begin
gbMargins.Visible := cbShow.Checked;
end;
procedure TChartLegendFrame.cbShowBorderChange(Sender: TObject);
begin
FLegend.Frame.Visible := cbShowBorder.Checked;
cbBorderColor.Visible := cbShowBorder.Checked;
end;
procedure TChartLegendFrame.cbUseSideBarChange(Sender: TObject);
begin
FLegend.UseSideBar := cbUseSideBar.Checked;
end;
procedure TChartLegendFrame.ChangedHandler(Sender: TObject);
begin
GetChart.Invalidate;
end;
function TChartLegendFrame.GetChart: TChart;
begin
Result := FLegend.GetOwner as TChart;
end;
procedure TChartLegendFrame.Prepare(ALegend: TChartLegend);
begin
FLegend := ALegend;
cbShow.Checked := ALegend.Visible;
SetAlignment(ALegend.Alignment);
cbFilled.Checked := ALegend.BackgroundBrush.Style <> bsClear;
cbFillColor.Selected := ColorToRGB(ALegend.BackgroundBrush.Color);
cbShowBorder.Checked := (ALegend.Frame.Style <> psClear) and ALegend.Frame.Visible;
cbBorderColor.Selected := ColorToRGB(ALegend.Frame.Color);
seMarginX.Value := ALegend.MarginX;
seMarginY.Value := ALegend.MarginY;
cbUseSideBar.Checked := ALegend.UseSidebar;
cbInverted.Checked := ALegend.Inverted;
seColumns.Value := ALegend.ColumnCount;
seSymbolWidth.Value := ALegend.SymbolWidth;
seSpacing.Value := ALegend.Spacing;
cbItemFillOrder.ItemIndex := ord(ALegend.ItemFillOrder);
FFontFrame.Prepare(ALegend.Font, false);
end;
function TChartLegendFrame.GetAlignment: TLegendAlignment;
var
i: Integer;
@ -213,6 +198,29 @@ begin
FLegend.Alignment := GetAlignment;
end;
procedure TChartLegendFrame.Prepare(ALegend: TChartLegend);
begin
FLegend := ALegend;
cbShow.Checked := ALegend.Visible;
cbHTML.Checked := (ALegend.TextFormat = tfHTML);
SetAlignment(ALegend.Alignment);
seMarginX.Value := ALegend.MarginX;
seMarginY.Value := ALegend.MarginY;
cbUseSideBar.Checked := ALegend.UseSidebar;
cbInverted.Checked := ALegend.Inverted;
seColumns.Value := ALegend.ColumnCount;
seSymbolWidth.Value := ALegend.SymbolWidth;
seSpacing.Value := ALegend.Spacing;
cbItemFillOrder.ItemIndex := ord(ALegend.ItemFillOrder);
FFontFrame.Prepare(ALegend.Font, false);
FBackgroundFrame.Prepare(ALegend.BackgroundBrush);
FBorderFrame.Prepare(ALegend.Frame);
end;
procedure TChartLegendFrame.seColumnsChange(Sender: TObject);
begin
FLegend.ColumnCount := seColumns.Value;

View File

@ -98,7 +98,7 @@ object MainForm: TMainForm
Height = 4
Top = 290
Width = 613
Anchors = [akTop, akLeft, akRight]
Anchors = [akLeft, akRight, akBottom]
Shape = bsBottomLine
end
object cbDoubleClick: TCheckBox

View File

@ -0,0 +1,198 @@
object MarksForm: TMarksForm
Left = 983
Height = 511
Top = 279
Width = 535
AutoSize = True
BorderStyle = bsDialog
Caption = 'MarksForm'
ClientHeight = 511
ClientWidth = 535
OnCreate = FormCreate
LCLVersion = '2.3.0.0'
object ButtonPanel: TButtonPanel
Left = 6
Height = 34
Top = 471
Width = 523
OKButton.Name = 'OKButton'
OKButton.DefaultCaption = True
HelpButton.Name = 'HelpButton'
HelpButton.DefaultCaption = True
CloseButton.Name = 'CloseButton'
CloseButton.DefaultCaption = True
CancelButton.Name = 'CancelButton'
CancelButton.DefaultCaption = True
TabOrder = 1
ShowButtons = [pbOK, pbCancel]
end
object Panel1: TPanel
Left = 16
Height = 439
Top = 16
Width = 503
Align = alClient
AutoSize = True
BorderSpacing.Around = 16
BevelOuter = bvNone
ClientHeight = 439
ClientWidth = 503
TabOrder = 0
object gbShapeBrushPenMargins: TGroupBox
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = gbLabelFont
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbLabelFont
AnchorSideRight.Side = asrBottom
Left = 0
Height = 193
Top = 178
Width = 272
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 16
Caption = 'gbShapeBrushPenMargins'
TabOrder = 1
end
object gbLinkPen: TGroupBox
AnchorSideLeft.Control = gbShapeBrushPenMargins
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Panel1
AnchorSideRight.Control = gbArrow
AnchorSideRight.Side = asrBottom
Left = 296
Height = 105
Top = 0
Width = 207
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 24
Caption = 'gbLinkPen'
TabOrder = 2
end
object gbArrow: TGroupBox
AnchorSideLeft.Control = gbShapeBrushPenMargins
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = gbLinkPen
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Panel1
AnchorSideRight.Side = asrBottom
Left = 296
Height = 138
Top = 121
Width = 207
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 24
BorderSpacing.Top = 16
Caption = 'gbArrow'
TabOrder = 3
end
object gbLabelFont: TGroupBox
AnchorSideLeft.Control = Panel1
AnchorSideTop.Control = Panel1
Left = 0
Height = 162
Top = 0
Width = 272
Caption = 'gbLabelFont'
TabOrder = 0
end
object gbPosition: TGroupBox
AnchorSideLeft.Control = gbShapeBrushPenMargins
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = gbArrow
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbArrow
AnchorSideRight.Side = asrBottom
Left = 296
Height = 113
Top = 275
Width = 207
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Left = 24
BorderSpacing.Top = 16
Caption = 'Position'
ClientHeight = 93
ClientWidth = 203
TabOrder = 4
object lblDistance: TLabel
AnchorSideLeft.Control = gbPosition
AnchorSideTop.Control = seDistance
AnchorSideTop.Side = asrCenter
Left = 16
Height = 15
Top = 8
Width = 45
BorderSpacing.Left = 16
Caption = 'Distance'
end
object seDistance: TSpinEdit
AnchorSideLeft.Control = lblDistance
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = gbPosition
AnchorSideRight.Control = gbPosition
AnchorSideRight.Side = asrBottom
Left = 85
Height = 23
Top = 4
Width = 110
Alignment = taRightJustify
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 24
BorderSpacing.Top = 4
BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
MaxValue = 1000
OnChange = seDistanceChange
TabOrder = 0
end
object lblPosition: TLabel
AnchorSideLeft.Control = lblDistance
AnchorSideTop.Control = cmbMarkPositions
AnchorSideTop.Side = asrCenter
Left = 16
Height = 15
Top = 39
Width = 43
Caption = 'Position'
end
object cmbMarkPositions: TComboBox
AnchorSideLeft.Control = seDistance
AnchorSideTop.Control = seDistance
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = seDistance
AnchorSideRight.Side = asrBottom
Left = 85
Height = 23
Top = 35
Width = 110
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
BorderSpacing.Bottom = 8
ItemHeight = 15
Items.Strings = (
'Outside'
'Positive'
'Negative'
'Inside'
)
OnChange = cmbMarkPositionsChange
TabOrder = 1
Text = 'cmbMarkPositions'
end
object cbMarksCentered: TCheckBox
AnchorSideLeft.Control = lblPosition
AnchorSideTop.Control = cmbMarkPositions
AnchorSideTop.Side = asrBottom
Left = 16
Height = 19
Top = 66
Width = 112
BorderSpacing.Top = 6
BorderSpacing.Bottom = 8
Caption = 'Position centered'
OnChange = cbMarksCenteredChange
TabOrder = 2
end
end
end
end

View File

@ -0,0 +1,188 @@
unit ceMarksForm;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ButtonPanel, StdCtrls,
ExtCtrls, Spin,
TAGraph, TATextElements, TACustomSeries,
ceFontFrame, ceShapeBrushPenMarginsFrame, ceSimplePenFrame, ceArrowFrame;
type
{ TMarksForm }
TMarksForm = class(TForm)
ButtonPanel: TButtonPanel;
cbMarksCentered: TCheckBox;
cmbMarkPositions: TComboBox;
gbArrow: TGroupBox;
gbShapeBrushPenMargins: TGroupBox;
gbLinkPen: TGroupBox;
gbLabelFont: TGroupBox;
gbPosition: TGroupBox;
lblPosition: TLabel;
lblDistance: TLabel;
Panel1: TPanel;
seDistance: TSpinEdit;
procedure cbMarksCenteredChange(Sender: TObject);
procedure cmbMarkPositionsChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure seDistanceChange(Sender: TObject);
private
FSeries: TChartSeries;
FShapeBrushPenMarginsFrame: TChartShapeBrushPenMarginsFrame;
FLinkPenFrame: TSimpleChartPenFrame;
FFontFrame: TChartFontFrame;
FArrowFrame: TChartArrowFrame;
function GetChart: TChart;
procedure ShapeChangedHandler(AShape: TChartLabelShape);
public
procedure Prepare(ASeries: TChartSeries);
end;
var
MarksForm: TMarksForm;
implementation
{$R *.lfm}
uses
TASeries,
ceUtils;
{ TMarksForm }
procedure TMarksForm.cbMarksCenteredChange(Sender: TObject);
begin
if (FSeries is TBarSeries) then
TBarSeries(FSeries).MarkPositionCentered := cbMarksCentered.Checked;
end;
procedure TMarksForm.cmbMarkPositionsChange(Sender: TObject);
begin
if (FSeries is TLineSeries) then
TLineSeries(FSeries).MarkPositions := TLinearMarkPositions(cmbMarkPositions.ItemIndex)
else if (FSeries is TAreaSeries) then
TAreaSeries(FSeries).MarkPositions := TLinearMarkPositions(cmbMarkPositions.ItemIndex)
else if (FSeries is TBarSeries) then
TBarSeries(FSeries).MarkPositions := TLinearMarkPositions(cmbMarkPositions.ItemIndex)
else
raise Exception.Create('Series type not supported.');
end;
procedure TMarksForm.FormCreate(Sender: TObject);
begin
FFontFrame := TChartFontFrame.Create(self);
FFontFrame.Name := '';
FFontFrame.Align := alClient;
FFontFrame.BorderSpacing.Left := 16;
FFontFrame.BorderSpacing.Right := 8;
FFontFrame.BorderSpacing.Bottom := 8;
FFontFrame.AutoSize := true;
FFontFrame.Parent := gbLabelFont;
gbLabelFont.AutoSize := true;
gbLabelFont.Caption := 'Marks font';
FShapeBrushPenMarginsFrame := TChartShapeBrushPenMarginsFrame.Create(self);
FShapeBrushPenMarginsFrame.Name := '';
FShapeBrushPenMarginsFrame.Align := alClient;
FShapeBrushPenMarginsFrame.BorderSpacing.Left := 16;
FShapeBrushPenMarginsFrame.BorderSpacing.Right := 8;
FShapeBrushPenMarginsFrame.BorderSpacing.Bottom := 8;
// FShapeBrushPenMarginsFrame.OnChange := @ChangedHandler;
FShapeBrushPenMarginsFrame.OnShapeChange := @ShapeChangedHandler;
FShapeBrushPenMarginsFrame.AutoSize := true;
FShapeBrushPenMarginsFrame.Parent := gbShapeBrushPenMargins;
gbShapeBrushPenMargins.AutoSize := true;
gbShapeBrushPenMargins.Caption := 'Marks shape and background';
FLinkPenFrame := TSimpleChartPenFrame.Create(self);
FLinkPenFrame.Name := '';
FLinkPenFrame.Align := alClient;
FLinkPenFrame.BorderSpacing.Left := 16;
FLinkPenFrame.BorderSpacing.Right := 8;
FLinkPenFrame.BorderSpacing.Bottom := 8;
FLinkPenFrame.AutoSize := true;
FLinkPenFrame.Parent := gbLinkPen;
gbLinkPen.AutoSize := true;
gbLinkPen.Caption := 'Link line';
FArrowFrame := TChartArrowFrame.Create(self);
FArrowFrame.Name := '';
FArrowFrame.Align := alClient;
FArrowFrame.BorderSpacing.Left := 16;
FArrowFrame.BorderSpacing.Right := 8;
FArrowFrame.BorderSpacing.Bottom := 8;
FArrowFrame.AutoSize := true;
FArrowFrame.Parent := gbArrow;
gbArrow.AutoSize := true;
gbArrow.Caption := 'Arrow';
AutoSize := true;
BoldHeaders(self);
end;
function TMarksForm.GetChart: TChart;
begin
Result := FSeries.ParentChart;
end;
procedure TMarksForm.Prepare(ASeries: TChartSeries);
begin
FSeries := ASeries;
with ASeries.Marks do
begin
FFontFrame.Prepare(LabelFont, true);
FShapeBrushPenMarginsFrame.Prepare(Shape, LabelBrush, Frame, Margins);
FLinkPenFrame.Prepare(LinkPen);
FArrowFrame.Prepare(Arrow);
end;
seDistance.Value := ASeries.Marks.Distance;
if ASeries is TLineSeries then
begin
cmbMarkPositions.ItemIndex := ord(TLineSeries(ASeries).MarkPositions);
cbMarksCentered.Hide;
end else
if ASeries is TBarSeries then
begin
cmbMarkPositions.ItemIndex := ord(TBarSeries(ASeries).MarkPositions);
cbMarksCentered.Checked := TBarSeries(ASeries).MarkPositionCentered;
end else
if ASeries is TAreaSeries then
begin
cmbMarkPositions.ItemIndex := ord(TAreaSeries(ASeries).MarkPositions);
cbMarksCentered.Hide;
end else
begin
cmbMarkPositions.Hide;
lblPosition.Hide;
cbMarksCentered.Hide;
end;
FLinkPenFrame.WidthLeft := FArrowFrame.seArrowBaseLength.Left;
seDistance.BorderSpacing.Left := FArrowFrame.Left +
FArrowFrame.seArrowBaseLength.Left - lblDistance.Width;
end;
procedure TMarksForm.seDistanceChange(Sender: TObject);
begin
FSeries.Marks.Distance := seDistance.Value;
end;
procedure TMarksForm.ShapeChangedHandler(AShape: TChartLabelShape);
begin
FSeries.Marks.Shape := AShape;
end;
end.

View File

@ -1,11 +1,11 @@
object PenFrame: TChartPenFrame
object ChartPenFrame: TChartPenFrame
Left = 0
Height = 56
Top = 0
Width = 212
Width = 214
AutoSize = True
ClientHeight = 56
ClientWidth = 212
ClientWidth = 214
TabOrder = 0
DesignLeft = 332
DesignTop = 128
@ -17,7 +17,7 @@ object PenFrame: TChartPenFrame
Left = 48
Height = 22
Top = 0
Width = 128
Width = 130
PenPattern = '1|1'
PointerStyle = psNone
Anchors = [akTop, akLeft, akRight]
@ -36,7 +36,6 @@ object PenFrame: TChartPenFrame
Top = 4
Width = 25
Caption = 'Style'
ParentColor = False
end
object cbPenWidth: TChartComboBox
AnchorSideLeft.Control = lblPenWidth
@ -47,7 +46,7 @@ object PenFrame: TChartPenFrame
Left = 48
Height = 22
Top = 30
Width = 128
Width = 130
Mode = ccmPenWidth
PenPattern = '1|1'
PointerStyle = psNone
@ -67,7 +66,6 @@ object PenFrame: TChartPenFrame
Top = 34
Width = 32
Caption = 'Width'
ParentColor = False
end
object cbPenColor: TColorButton
AnchorSideLeft.Side = asrBottom
@ -75,7 +73,7 @@ object PenFrame: TChartPenFrame
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 181
Left = 183
Height = 25
Top = 14
Width = 31
@ -91,7 +89,7 @@ object PenFrame: TChartPenFrame
AnchorSideRight.Control = cbPenColor
AnchorSideBottom.Control = cbPenWidth
AnchorSideBottom.Side = asrBottom
Left = 176
Left = 178
Height = 52
Top = 0
Width = 5

View File

@ -26,12 +26,10 @@ type
FPen: TPen;
FOnChange: TNotifyEvent;
procedure DoChanged;
public
constructor Create(AOwner: TComponent); override;
procedure Prepare(APen: TPen);
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
implementation

View File

@ -32,7 +32,6 @@ type
procedure DoChange;
protected
function GetChart: TChart;
public
constructor Create(AOwner: TComponent); override;
procedure Prepare(APointer: TSeriesPointer);

View File

@ -10,14 +10,14 @@ object ChartSeriesFrame: TChartSeriesFrame
DesignTop = 344
object PanelTop: TPanel
Left = 0
Height = 134
Height = 142
Top = 0
Width = 589
Align = alTop
AutoSize = True
BorderSpacing.Bottom = 12
BevelOuter = bvNone
ClientHeight = 134
ClientHeight = 142
ClientWidth = 589
TabOrder = 0
object cbShowSeries: TCheckBox
@ -37,14 +37,16 @@ object ChartSeriesFrame: TChartSeriesFrame
AnchorSideTop.Control = cbShowSeries
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Bevel4
AnchorSideBottom.Control = gbMarks
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 109
Height = 117
Top = 25
Width = 286
Anchors = [akTop, akLeft, akRight]
Anchors = [akTop, akLeft, akRight, akBottom]
AutoSize = True
Caption = 'Legend text'
ClientHeight = 89
Caption = 'Legend text (Series title)'
ClientHeight = 97
ClientWidth = 282
TabOrder = 1
object edSeriesTitle: TEdit
@ -71,14 +73,14 @@ object ChartSeriesFrame: TChartSeriesFrame
Left = 8
Height = 19
Top = 33
Width = 101
Width = 133
BorderSpacing.Top = 6
Caption = 'Show in legend'
Caption = 'Show series in legend'
OnChange = cbShowInLegendChange
TabOrder = 1
end
object cbLegendMultiplicity: TComboBox
AnchorSideLeft.Control = Label1
object cmbLegendMultiplicity: TComboBox
AnchorSideLeft.Control = lblLegendItems
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cbShowInLegend
AnchorSideTop.Side = asrBottom
@ -95,42 +97,42 @@ object ChartSeriesFrame: TChartSeriesFrame
ItemHeight = 15
ItemIndex = 0
Items.Strings = (
'single item per series'
'marks text per data point'
'Series title'
'Marks text per data point'
)
OnChange = cbLegendMultiplicityChange
OnChange = cmbLegendMultiplicityChange
Style = csDropDownList
TabOrder = 2
Text = 'single item per series'
Text = 'Series title'
end
object Label1: TLabel
object lblLegendItems: TLabel
AnchorSideLeft.Control = edSeriesTitle
AnchorSideTop.Control = cbLegendMultiplicity
AnchorSideTop.Control = cmbLegendMultiplicity
AnchorSideTop.Side = asrCenter
Left = 8
Height = 15
Top = 62
Width = 71
Caption = 'Legend items'
ParentColor = False
end
end
object gbMarks: TGroupBox
AnchorSideLeft.Control = Bevel4
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = gbLegendText
AnchorSideTop.Control = cbShowSeries
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = PanelTop
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = gbLegendText
AnchorSideBottom.Side = asrBottom
Left = 302
Height = 109
Height = 117
Top = 25
Width = 287
Anchors = [akTop, akLeft, akRight, akBottom]
Anchors = [akTop, akLeft, akRight]
AutoSize = True
Caption = 'Marks'
ClientHeight = 89
ClientHeight = 97
ClientWidth = 283
TabOrder = 2
object lblSeriesMarksStyle: TLabel
@ -143,7 +145,6 @@ object ChartSeriesFrame: TChartSeriesFrame
Width = 25
BorderSpacing.Left = 8
Caption = 'Style'
ParentColor = False
end
object cbMarksStyle: TComboBox
AnchorSideLeft.Control = edMarksFormat
@ -186,7 +187,6 @@ object ChartSeriesFrame: TChartSeriesFrame
Top = 37
Width = 38
Caption = 'Format'
ParentColor = False
end
object edMarksFormat: TEdit
AnchorSideLeft.Control = Label2
@ -208,18 +208,35 @@ object ChartSeriesFrame: TChartSeriesFrame
Text = 'edMarksFormat'
end
object cbShowMarks: TCheckBox
AnchorSideLeft.Control = edMarksFormat
AnchorSideTop.Control = edMarksFormat
AnchorSideTop.Side = asrBottom
Left = 54
AnchorSideLeft.Control = lblSeriesMarksStyle
AnchorSideTop.Control = btnMore
AnchorSideTop.Side = asrCenter
Left = 8
Height = 19
Top = 62
Top = 67
Width = 156
BorderSpacing.Top = 6
Caption = 'Show at series data points'
OnChange = cbShowMarksChange
TabOrder = 2
end
object btnMore: TButton
AnchorSideTop.Control = edMarksFormat
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbMarks
AnchorSideRight.Side = asrBottom
Left = 212
Height = 25
Top = 64
Width = 63
Anchors = [akTop, akRight]
AutoSize = True
BorderSpacing.Around = 8
Caption = 'More...'
Enabled = False
OnClick = btnMoreClick
TabOrder = 3
end
end
object Bevel4: TBevel
AnchorSideLeft.Control = PanelTop
@ -233,8 +250,8 @@ object ChartSeriesFrame: TChartSeriesFrame
end
object nbSeriesTypes: TNotebook
Left = 0
Height = 313
Top = 146
Height = 305
Top = 154
Width = 589
PageIndex = 0
Align = alClient
@ -273,12 +290,12 @@ object ChartSeriesFrame: TChartSeriesFrame
AnchorSideRight.Control = pgLineSeries
AnchorSideRight.Side = asrBottom
Left = 302
Height = 240
Height = 88
Top = 0
Width = 287
Anchors = [akTop, akLeft, akRight]
Caption = 'gbLineSeriesPointer'
ClientHeight = 220
ClientHeight = 68
ClientWidth = 283
TabOrder = 1
object cbLineSeriesShowPoints: TCheckBox

View File

@ -18,10 +18,11 @@ type
Bevel2: TBevel;
Bevel3: TBevel;
Bevel4: TBevel;
btnMore: TButton;
cbAreaShowContourLines: TCheckBox;
cbAreaShowDropLines: TCheckBox;
cbBarShape: TComboBox;
cbLegendMultiplicity: TComboBox;
cmbLegendMultiplicity: TComboBox;
cbLineSeriesShowLines: TCheckBox;
cbLineSeriesShowPoints: TCheckBox;
cbMarksStyle: TComboBox;
@ -40,7 +41,7 @@ type
gbLineSeriesLineStyle: TGroupBox;
gbLineSeriesPointer: TGroupBox;
gbMarks: TGroupBox;
Label1: TLabel;
lblLegendItems: TLabel;
Label2: TLabel;
lblSeriesMarksStyle: TLabel;
nbSeriesTypes: TNotebook;
@ -48,10 +49,11 @@ type
pgAreaSeries: TPage;
pgBarSeries: TPage;
pgLineSeries: TPage;
procedure btnMoreClick(Sender: TObject);
procedure cbAreaShowContourLinesChange(Sender: TObject);
procedure cbAreaShowDropLinesChange(Sender: TObject);
procedure cbBarShapeChange(Sender: TObject);
procedure cbLegendMultiplicityChange(Sender: TObject);
procedure cmbLegendMultiplicityChange(Sender: TObject);
procedure cbLineSeriesShowLinesChange(Sender: TObject);
procedure cbLineSeriesShowPointsChange(Sender: TObject);
procedure cbMarksStyleChange(Sender: TObject);
@ -85,8 +87,8 @@ implementation
{$R *.lfm}
uses
ceUtils,
TAChartUtils, TALegend;
TAChartUtils, TALegend,
ceUtils, ceMarksForm;
constructor TChartSeriesFrame.Create(AOwner: TComponent);
begin
@ -176,7 +178,7 @@ begin
{ for all }
BoldHeaders(self);
cbLegendMultiplicity.DropdownCount := DEFAULT_DROPDOWN_COUNT;
cmbLegendMultiplicity.DropdownCount := DEFAULT_DROPDOWN_COUNT;
cbMarksStyle.DropdownCount := DEFAULT_DROPDOWN_COUNT;
end;
@ -187,6 +189,30 @@ begin
TAreaSeries(FSeries).AreaContourPen.Style := FAreaSeriesContourPenFrame.cbPenStyle.PenStyle
else
TAreaSeries(FSeries).AreaContourPen.Style := psClear;
FAreaSeriesContourPenFrame.Enabled := cbAreaShowContourLines.Checked;
end;
end;
procedure TChartSeriesFrame.btnMoreClick(Sender: TObject);
var
F: TMarksForm;
ser: TBasicChartSeries;
begin
if not (FSeries is TChartSeries) then
exit;
F := TMarksForm.Create(GetParentForm(self));
try
ser := TSeriesClass(FSeries.ClassType).Create(nil);
ser.Assign(FSeries);
F.Prepare(TChartSeries(FSeries));
F.Position := poOwnerFormCenter;
if F.ShowModal <> mrOK then
FSeries.Assign(ser);
finally
ser.Free;
F.Free;
end;
end;
@ -197,6 +223,7 @@ begin
TAreaSeries(FSeries).AreaLinesPen.Style := FAreaSeriesDropLinesPenFrame.cbPenStyle.PenStyle
else
TAreaSeries(FSeries).AreaLinesPen.Style := psClear;
FAreaSeriesDropLinesPenFrame.Enabled := cbAreaShowDropLines.Checked;
end;
end;
@ -206,21 +233,25 @@ begin
TBarSeries(FSeries).BarShape := TBarShape(cbBarShape.ItemIndex);
end;
procedure TChartSeriesFrame.cbLegendMultiplicityChange(Sender: TObject);
procedure TChartSeriesFrame.cmbLegendMultiplicityChange(Sender: TObject);
begin
(FSeries as TCustomChartSeries).Legend.Multiplicity := TLegendMultiplicity(cbLegendMultiplicity.ItemIndex);
(FSeries as TCustomChartSeries).Legend.Multiplicity := TLegendMultiplicity(cmbLegendMultiplicity.ItemIndex);
end;
procedure TChartSeriesFrame.cbLineSeriesShowLinesChange(Sender: TObject);
begin
if FSeries is TLineSeries then
begin
TLineSeries(FSeries).ShowLines := cbLineSeriesShowLines.Checked;
FLineSeriesPenFrame.Enabled := cbLineSeriesShowLines.Checked;
end;
end;
procedure TChartSeriesFrame.cbLineSeriesShowPointsChange(Sender: TObject);
begin
if FSeries is TLineSeries then
TLineSeries(FSeries).ShowPoints := cbLineSeriesShowPoints.Checked;
FLineSeriesPointerFrame.Enabled := cbLineSeriesShowPoints.Checked;
end;
procedure TChartSeriesFrame.cbMarksStyleChange(Sender: TObject);
@ -231,23 +262,32 @@ begin
series := TChartSeries(FSeries);
series.Marks.Style := TSeriesMarksStyle(cbMarksStyle.ItemIndex);
edMarksFormat.Text := series.Marks.Format;
btnMore.Enabled := (series.Marks.Style <> smsNone) and cbShowMarks.Checked;
end;
end;
procedure TChartSeriesFrame.cbShowInLegendChange(Sender: TObject);
begin
(FSeries as TCustomChartSeries).Legend.Visible := cbShowInLegend.Checked;
lblLegendItems.Enabled := cbShowInLegend.Checked;
cmbLegendMultiplicity.Enabled := cbShowInLegend.Checked;
end;
procedure TChartSeriesFrame.cbShowMarksChange(Sender: TObject);
begin
if (FSeries is TChartSeries) then
begin
TChartSeries(FSeries).Marks.Visible := cbShowMarks.Checked;
btnMore.Enabled := (TChartSeries(FSeries).Marks.Style <> smsNone) and cbShowMarks.Checked;
end;
end;
procedure TChartSeriesFrame.cbShowSeriesChange(Sender: TObject);
begin
FSeries.Active := cbShowSeries.Checked;
gbLegendText.Visible := cbShowSeries.Checked;
gbMarks.Visible := cbShowSeries.Checked;
nbSeriesTypes.Visible := cbShowSeries.Checked;
end;
procedure TChartSeriesFrame.ChangedHandler(Sender: TObject);
@ -285,7 +325,7 @@ begin
cbShowSeries.Checked := series.Active;
cbShowInLegend.Checked := series.Legend.Visible;
edSeriesTitle.Text := series.Title;
cbLegendMultiplicity.ItemIndex := ord(series.Legend.Multiplicity);
cmbLegendMultiplicity.ItemIndex := ord(series.Legend.Multiplicity);
gbMarks.Visible := (FSeries is TChartSeries);
if (FSeries is TChartSeries) then begin
@ -317,6 +357,7 @@ begin
FAreaSeriesContourPenFrame.Prepare(TAreaSeries(ASeries).AreaContourPen);
FAreaSeriesDropLinesPenFrame.Prepare(TAreaSeries(ASeries).AreaLinesPen);
end;
end;
end.

View File

@ -2,9 +2,9 @@ object ChartShapeBrushPenMarginsFrame: TChartShapeBrushPenMarginsFrame
Left = 0
Height = 237
Top = 0
Width = 227
Width = 276
ClientHeight = 237
ClientWidth = 227
ClientWidth = 276
TabOrder = 0
DesignLeft = 1498
DesignTop = 388
@ -17,7 +17,7 @@ object ChartShapeBrushPenMarginsFrame: TChartShapeBrushPenMarginsFrame
Left = 0
Height = 23
Top = 0
Width = 227
Width = 276
Anchors = [akTop, akLeft, akRight]
Enabled = False
ItemHeight = 15
@ -37,137 +37,62 @@ object ChartShapeBrushPenMarginsFrame: TChartShapeBrushPenMarginsFrame
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = cmbShape
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Spacer
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = gbBorder
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 54
Height = 73
Top = 31
Width = 106
Anchors = [akTop, akLeft, akRight]
Width = 83
Anchors = [akTop, akLeft, akBottom]
AutoSize = True
BorderSpacing.Top = 8
BorderSpacing.Right = 8
Caption = 'Background'
ClientHeight = 34
ClientWidth = 102
TabOrder = 1
object cbFilled: TCheckBox
AnchorSideLeft.Control = gbBackground
AnchorSideTop.Control = cbFillColor
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = cbFillColor
Left = 10
Height = 19
Top = 3
Width = 44
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 6
BorderSpacing.Right = 8
BorderSpacing.Bottom = 12
Caption = 'Filled'
OnChange = cbFilledChange
TabOrder = 0
end
object cbFillColor: TColorButton
AnchorSideTop.Control = gbBackground
AnchorSideRight.Control = gbBackground
AnchorSideRight.Side = asrBottom
Left = 62
Height = 25
Top = 0
Width = 32
Anchors = [akTop, akRight]
BorderSpacing.Left = 8
BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
BorderWidth = 2
ButtonColorSize = 16
ButtonColor = clBlack
Margin = 2
Visible = False
OnColorChanged = cbFillColorColorChanged
end
end
object gbBorder: TGroupBox
AnchorSideLeft.Control = Spacer
AnchorSideTop.Control = gbBackground
AnchorSideLeft.Control = gbBackground
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbShape
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = gbBackground
AnchorSideBottom.Side = asrBottom
Left = 121
Height = 54
Left = 91
Height = 73
Top = 31
Width = 106
Anchors = [akTop, akLeft, akRight, akBottom]
AutoSize = True
Width = 185
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 8
BorderSpacing.Top = 8
Caption = 'Border'
ClientHeight = 34
ClientWidth = 102
TabOrder = 2
object cbShowBorder: TCheckBox
AnchorSideLeft.Control = gbBorder
AnchorSideTop.Control = cbBorderColor
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = cbBorderColor
Left = 10
Height = 19
Top = 3
Width = 50
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 6
BorderSpacing.Bottom = 12
Caption = 'Visible '
OnChange = cbShowBorderChange
TabOrder = 0
end
object cbBorderColor: TColorButton
AnchorSideTop.Control = gbBorder
AnchorSideRight.Control = gbBorder
AnchorSideRight.Side = asrBottom
Left = 64
Height = 25
Top = 0
Width = 30
Anchors = [akTop, akRight]
BorderSpacing.Left = 4
BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
BorderWidth = 2
ButtonColorSize = 16
ButtonColor = clBlack
Margin = 2
Visible = False
OnColorChanged = cbBorderColorColorChanged
end
end
object gbMargins: TGroupBox
AnchorSideLeft.Control = gbBackground
AnchorSideTop.Control = gbBackground
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbBorder
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 97
Top = 93
Width = 227
Top = 112
Width = 276
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Top = 8
Caption = 'Margins'
ClientHeight = 77
ClientWidth = 223
ClientWidth = 272
TabOrder = 3
object seTopMargin: TSpinEdit
AnchorSideLeft.Control = gbMargins
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = gbMargins
Left = 86
Left = 111
Height = 23
Top = 0
Width = 50
@ -180,7 +105,7 @@ object ChartShapeBrushPenMarginsFrame: TChartShapeBrushPenMarginsFrame
AnchorSideTop.Control = seTopMargin
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = seTopMargin
Left = 28
Left = 53
Height = 23
Top = 23
Width = 50
@ -197,7 +122,7 @@ object ChartShapeBrushPenMarginsFrame: TChartShapeBrushPenMarginsFrame
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = seTopMargin
AnchorSideTop.Side = asrBottom
Left = 144
Left = 169
Height = 23
Top = 23
Width = 50
@ -215,7 +140,7 @@ object ChartShapeBrushPenMarginsFrame: TChartShapeBrushPenMarginsFrame
AnchorSideTop.Side = asrBottom
AnchorSideBottom.Control = gbMargins
AnchorSideBottom.Side = asrBottom
Left = 86
Left = 111
Height = 23
Top = 46
Width = 50
@ -226,15 +151,4 @@ object ChartShapeBrushPenMarginsFrame: TChartShapeBrushPenMarginsFrame
TabOrder = 3
end
end
object Spacer: TBevel
AnchorSideLeft.Control = cmbShape
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = cmbShape
AnchorSideTop.Side = asrBottom
Left = 113
Height = 50
Top = 23
Width = 1
Shape = bsSpacer
end
end

View File

@ -6,7 +6,8 @@ interface
uses
Classes, SysUtils, Graphics, Forms, Controls, StdCtrls, Dialogs, Spin, ExtCtrls,
TATypes, TATextElements;
TATypes, TATextElements,
ceSimplePenFrame, ceSimpleBrushFrame;
type
@ -15,11 +16,6 @@ type
{ TChartShapeBrushPenMarginsFrame }
TChartShapeBrushPenMarginsFrame = class(TFrame)
Spacer: TBevel;
cbBorderColor: TColorButton;
cbFillColor: TColorButton;
cbFilled: TCheckBox;
cbShowBorder: TCheckBox;
cmbShape: TComboBox;
gbBackground: TGroupBox;
gbBorder: TGroupBox;
@ -28,10 +24,6 @@ type
seLeftMargin: TSpinEdit;
seRightMargin: TSpinEdit;
seTopMargin: TSpinEdit;
procedure cbBorderColorColorChanged(Sender: TObject);
procedure cbFillColorColorChanged(Sender: TObject);
procedure cbFilledChange(Sender: TObject);
procedure cbShowBorderChange(Sender: TObject);
procedure cmbShapeChange(Sender: TObject);
procedure seBottomMarginChange(Sender: TObject);
procedure seLeftMarginChange(Sender: TObject);
@ -45,9 +37,11 @@ type
FMargins: TChartLabelMargins;
FShape: TChartLabelShape;
FLockEvents: Integer;
procedure DoChanged;
FBrushFrame: TSimpleChartBrushFrame;
FPenFrame: TSimpleChartPenFrame;
procedure ChangeHandler(Sender: TObject);
procedure DoChange;
procedure DoShapeChanged(AShape: TChartLabelShape);
procedure UpdateControls;
protected
procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
{%H-}WithThemeSpace: Boolean); override;
@ -74,9 +68,30 @@ uses
constructor TChartShapeBrushPenMarginsFrame.Create(AOwner: TComponent);
begin
inherited;
cbFillColor.Width := cbFillColor.Height;
cbBorderColor.Width := cbBorderColor.Height;
cmbShape.DropdownCount := DEFAULT_DROPDOWN_COUNT;
FBrushFrame := TSimpleChartBrushFrame.Create(self);
FBrushFrame.Name := '';
FBrushFrame.BorderSpacing.Left := 8;
FBrushFrame.BorderSpacing.Right := 8;
FBrushFrame.BorderSpacing.Bottom := 8;
FBrushFrame.Align := alClient;
FBrushFrame.OnChange := @ChangeHandler;
FBrushFrame.AutoSize := true;
gbBackground.AutoSize := true;
FBrushFrame.Parent := gbBackground;
FPenFrame := TSimpleChartPenFrame.Create(self);
FPenFrame.Name := '';
FPenFrame.BorderSpacing.Left := 8;
FPenFrame.BorderSpacing.Right := 8;
FPenFrame.BorderSpacing.Bottom := 8;
FPenFrame.Align := alClient;
FPenFrame.OnChange := @ChangeHandler;
FPenFrame.AutoSize := true;
gbBorder.AutoSize := true;
FPenFrame.Parent := gbBorder;
end;
procedure TChartShapeBrushPenMarginsFrame.CalculatePreferredSize(
@ -84,46 +99,26 @@ procedure TChartShapeBrushPenMarginsFrame.CalculatePreferredSize(
WithThemeSpace: Boolean);
begin
PreferredHeight := cmbShape.Height +
gbBackground.BorderSpacing.Top + gbBackground.Height +
gbBorder.BorderSpacing.Top + gbBorder.Height +
gbMargins.BorderSpacing.Top + gbMargins.Height;
PreferredWidth := Max(
Max(gbBackground.Width, gbBorder.Width) * 2 + Spacer.Width,
gbMargins.Width
);;
PreferredWidth :=
gbBackground.Width + gbBorder.Width +
Max(gbBackground.BorderSpacing.Right, gbBorder.BorderSpacing.Left);
end;
procedure TChartShapeBrushPenMarginsFrame.cbBorderColorColorChanged(Sender: TObject);
procedure TChartShapeBrushPenMarginsFrame.ChangeHandler(Sender: TObject);
begin
FPen.Color := cbBorderColor.ButtonColor;
// if FPen.Style <> psClear then
DoChanged;
end;
procedure TChartShapeBrushPenMarginsFrame.cbFillColorColorChanged(Sender: TObject);
var
bs: TBrushStyle;
begin
bs := FBrush.Style;
FBrush.Color := cbFillColor.ButtonColor;
FBrush.Style := bs;
// if FBrush.Style <> bsClear then
DoChanged;
end;
procedure TChartShapeBrushPenMarginsFrame.cbFilledChange(Sender: TObject);
begin
if cbFilled.Checked then FBrush.Style := bsSolid else FBrush.Style := bsClear;
UpdateControls;
DoChanged;
end;
procedure TChartShapeBrushPenMarginsFrame.cbShowBorderChange(Sender: TObject);
begin
FPen.Visible := cbShowBorder.Checked;
if FPen.Visible and (FPen.Style = psClear) then FPen.Style := psSolid;
UpdateControls;
DoChanged;
if FLockEvents = 0 then
begin
if (Sender is TChartPen) then
FPen := TChartPen(Sender)
else if (Sender is TBrush) then
FBrush := TBrush(Sender);
cmbShape.Enabled := FPen.EffVisible or (FBrush.Style <> bsClear);
gbMargins.Enabled := cmbShape.Enabled;
DoChange;
end;
end;
procedure TChartShapeBrushPenMarginsFrame.cmbShapeChange(Sender: TObject);
@ -131,7 +126,7 @@ begin
DoShapeChanged(TChartLabelShape(cmbShape.ItemIndex));
end;
procedure TChartShapeBrushPenMarginsFrame.DoChanged;
procedure TChartShapeBrushPenMarginsFrame.DoChange;
begin
if (FLockEvents = 0) and Assigned(FOnChange) then
FOnChange(Self);
@ -146,25 +141,25 @@ end;
procedure TChartShapeBrushPenMarginsFrame.seBottomMarginChange(Sender: TObject);
begin
FMargins.Bottom := seBottomMargin.Value;
DoChanged;
DoChange;
end;
procedure TChartShapeBrushPenMarginsFrame.seLeftMarginChange(Sender: TObject);
begin
FMargins.Left := seLeftMargin.Value;
DoChanged;
DoChange;
end;
procedure TChartShapeBrushPenMarginsFrame.seRightMarginChange(Sender: TObject);
begin
FMargins.Right := seRightMargin.Value;
DoChanged;
DoChange;
end;
procedure TChartShapeBrushPenMarginsFrame.seTopMarginChange(Sender: TObject);
begin
FMargins.Top := seTopMargin.Value;
DoChanged;
DoChange;
end;
procedure TChartShapeBrushPenMarginsFrame.GetData(out AShape: TChartLabelShape;
@ -173,11 +168,9 @@ begin
AShape := TChartLabelShape(cmbShape.ItemIndex);
if HandleAllocated then
begin
if cbFilled.Checked then ABrush.Style := bsSolid else ABrush.Style := bsClear;
ABrush.Color := cbFillColor.ButtonColor;
APen.Visible := cbShowBorder.Checked;
FBrushFrame.GetData(ABrush);
FPenFrame.GetData(APen);
APen.Style := psSolid;
APen.Color := cbBorderColor.ButtonColor;
end;
AMargins.Top := seTopMargin.Value;
AMargins.Left := seLeftMargin.Value;
@ -189,30 +182,24 @@ procedure TChartShapeBrushPenMarginsFrame.Prepare(AShape: TChartLabelShape;
ABrush: TBrush; APen: TChartPen; AMargins: TChartLabelMargins);
begin
inc(FLockEvents);
FShape := AShape;
FBrush := ABrush;
FPen := APen;
FMargins := AMargins;
cmbShape.ItemIndex := ord(AShape);
cbFilled.Checked := ABrush.Style <> bsClear;
cbFillColor.ButtonColor := ColorToRGB(ABrush.Color);
cbShowBorder.Checked := APen.EffVisible;
if APen.Color = clDefault then
cbBorderColor.ButtonColor := ColorToRGB(clWindowText)
else
cbBorderColor.ButtonColor := ColorToRGB(APen.Color);
cmbShape.Enabled := APen.EffVisible or (ABrush.Style <> bsClear);
gbMargins.Enabled := cmbShape.Enabled;
FBrushFrame.Prepare(ABrush);
FPenFrame.Prepare(APen);
seTopMargin.Value := AMargins.Top;
seLeftMargin.Value := AMargins.Left;
seRightMargin.Value := AMargins.Right;
seBottomMargin.Value := AMargins.Bottom;
dec(FLockEvents);
end;
procedure TChartShapeBrushPenMarginsFrame.UpdateControls;
begin
cbBorderColor.Visible := cbShowBorder.Checked;
cmbShape.Enabled := cbShowBorder.Checked or cbFilled.Checked;
cbFillColor.Visible := cbFilled.Checked;
dec(FLockEvents);
end;
end.

View File

@ -0,0 +1,44 @@
object SimpleChartBrushFrame: TSimpleChartBrushFrame
Left = 0
Height = 151
Top = 0
Width = 120
ClientHeight = 151
ClientWidth = 120
TabOrder = 0
DesignLeft = 275
DesignTop = 131
object cbFilled: TCheckBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = cbFillColor
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = cbFillColor
Left = 0
Height = 19
Top = 3
Width = 80
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
BorderSpacing.Right = 8
Caption = 'Filled'
OnChange = cbFilledChange
TabOrder = 0
end
object cbFillColor: TColorButton
AnchorSideTop.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 88
Height = 25
Top = 0
Width = 32
Anchors = [akTop, akRight]
BorderSpacing.Left = 8
BorderWidth = 2
ButtonColorSize = 16
ButtonColor = clBlack
Enabled = False
Margin = 2
OnColorChanged = cbFillColorColorChanged
end
end

View File

@ -0,0 +1,84 @@
unit ceSimpleBrushFrame;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Graphics, Forms, Controls, StdCtrls, Dialogs;
type
{ TSimpleChartBrushFrame }
TSimpleChartBrushFrame = class(TFrame)
cbFillColor: TColorButton;
cbFilled: TCheckBox;
procedure cbFillColorColorChanged(Sender: TObject);
procedure cbFilledChange(Sender: TObject);
private
FBrush: TBrush;
FOnChange: TNotifyEvent;
FOnVisibleChange: TNotifyEvent;
procedure DoChange;
public
constructor Create(AOwner: TComponent); override;
procedure GetData(ABrush: TBrush);
procedure Prepare(ABrush: TBrush);
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
implementation
{$R *.lfm}
constructor TSimpleChartBrushFrame.Create(AOwner: TComponent);
begin
inherited;
cbFillColor.Width := cbFillColor.Height;
end;
procedure TSimpleChartBrushFrame.cbFillColorColorChanged(Sender: TObject);
var
bs: TBrushStyle;
begin
// Be careful: Setting the Brush.Color switches the Style of a transparent brush
// to solid. --> We store the style to reset it and after changing the color.
bs := FBrush.Style;
FBrush.Color := cbFillColor.ButtonColor;
FBrush.Style := bs;
DoChange;
end;
procedure TSimpleChartBrushFrame.cbFilledChange(Sender: TObject);
begin
if cbFilled.Checked then FBrush.Style := bsSolid else FBrush.Style := bsClear;
cbFillColor.Enabled := cbFilled.Checked;
DoChange;
end;
procedure TSimpleChartBrushFrame.DoChange;
begin
if Assigned(FOnChange) then FOnChange(FBrush);
end;
// Transfers the properties of the GUI elements (or the internal brush) to the
// brush provided as parameter.
procedure TSimpleChartBrushFrame.GetData(ABrush: TBrush);
begin
ABrush.Assign(FBrush);
end;
// Applies the brush properties to the GUI elements
procedure TSimpleChartBrushFrame.Prepare(ABrush: TBrush);
begin
FBrush := ABrush;
cbFilled.Checked := ABrush.Style <> bsClear;
if ABrush.Color = clDefault then
cbFillColor.ButtonColor := ColorToRGB(clWindow)
else
cbFillColor.ButtonColor := ColorToRGB(ABrush.Color);
end;
end.

View File

@ -0,0 +1,79 @@
object SimpleChartPenFrame: TSimpleChartPenFrame
Left = 0
Height = 62
Top = 0
Width = 120
ClientHeight = 62
ClientWidth = 120
OnResize = FrameResize
TabOrder = 0
DesignLeft = 620
DesignTop = 210
object cbVisible: TCheckBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = cbPenColor
AnchorSideTop.Side = asrCenter
Left = 0
Height = 19
Top = 3
Width = 54
BorderSpacing.Top = 8
Caption = 'Visible'
OnChange = cbVisibleChange
TabOrder = 0
end
object cbPenColor: TColorButton
AnchorSideLeft.Control = cbVisible
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 70
Height = 25
Top = 0
Width = 30
BorderSpacing.Left = 16
BorderSpacing.Bottom = 6
BorderWidth = 2
ButtonColorSize = 16
ButtonColor = clBlack
Enabled = False
Margin = 2
OnColorChanged = cbPenColorColorChanged
end
object cbPenWidth: TChartComboBox
AnchorSideLeft.Control = lblPenWidth
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cbPenColor
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 40
Height = 22
Top = 33
Width = 80
Mode = ccmPenWidth
Options = [ccoPatternBrush, ccoPatternPen]
PenPattern = '1|1'
PointerStyle = psNone
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 8
BorderSpacing.Top = 8
Enabled = False
ItemHeight = 16
ItemIndex = 0
TabOrder = 1
OnChange = cbPenWidthChange
end
object lblPenWidth: TLabel
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = cbPenWidth
AnchorSideTop.Side = asrCenter
Left = 0
Height = 15
Top = 37
Width = 32
Caption = 'Width'
Enabled = False
end
end

View File

@ -0,0 +1,120 @@
unit ceSimplePenFrame;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Graphics, Forms, Controls, StdCtrls, Dialogs,
TATypes, TAChartCombos;
type
{ TSimpleChartPenFrame }
TSimpleChartPenFrame = class(TFrame)
cbPenColor: TColorButton;
cbVisible: TCheckBox;
cbPenWidth: TChartComboBox;
lblPenWidth: TLabel;
procedure cbPenColorColorChanged(Sender: TObject);
procedure cbPenWidthChange(Sender: TObject);
procedure cbVisibleChange(Sender: TObject);
procedure FrameResize(Sender: TObject);
private
FPen: TChartPen;
FOnChange: TNotifyEvent;
FOnVisibleChange: TNotifyEvent;
procedure DoChange;
function GetWidthLeft: Integer;
procedure SetWidthLeft(const AValue: Integer);
public
constructor Create(AOwner: TComponent); override;
procedure GetData(APen: TChartPen);
procedure Prepare(APen: TChartPen);
property WidthLeft: Integer read GetWidthLeft write SetWidthLeft;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
implementation
{$R *.lfm}
uses
LCLIntf, LCLType;
{ TSimpleChartPenFrame }
constructor TSimpleChartPenFrame.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
cbPenWidth.DropdownCount := DEFAULT_DROPDOWN_COUNT;
cbPenColor.Width := cbPenColor.Height;
end;
procedure TSimpleChartPenFrame.cbPenColorColorChanged(Sender: TObject);
begin
FPen.Color := cbPenColor.ButtonColor;
DoChange;
end;
procedure TSimpleChartPenFrame.cbPenWidthChange(Sender: TObject);
begin
FPen.Width := cbPenWidth.PenWidth;
DoChange;
end;
procedure TSimpleChartPenFrame.cbVisibleChange(Sender: TObject);
begin
FPen.Visible := cbVisible.Checked;
if FPen.Visible then FPen.Style := psSolid else FPen.Style := psClear;
cbPenColor.Enabled := cbVisible.Checked;
cbPenWidth.Enabled := cbVisible.Checked;
lblPenWidth.Enabled := cbVisible.Checked;
DoChange;
end;
procedure TSimpleChartPenFrame.DoChange;
begin
if Assigned(FOnChange) then FOnChange(FPen);
end;
procedure TSimpleChartPenFrame.FrameResize(Sender: TObject);
begin
cbPenWidth.SymbolWidth := cbPenWidth.ClientWidth - GetSystemMetrics(SM_CXVSCROLL) - 16;
end;
// Transfers the properties of the GUI elements (or the internal pen) to the pen.
procedure TSimpleChartPenFrame.GetData(APen: TChartPen);
begin
APen.Assign(FPen);
end;
function TSimpleChartPenFrame.GetWidthLeft: Integer;
begin
Result := cbPenWidth.Left;
end;
// Applies the pen properties to the GUI elements
procedure TSimpleChartPenFrame.Prepare(APen: TChartPen);
begin
FPen := APen;
cbVisible.Checked := APen.EffVisible;
cbPenWidth.PenWidth := APen.Width;
if APen.Color = clDefault then
cbPenColor.ButtonColor := ColorToRGB(clWindowText)
else
cbPenColor.ButtonColor := ColorToRGB(APen.Color);
end;
procedure TSimpleChartPenFrame.SetWidthLeft(const AValue: Integer);
var
d: Integer;
begin
d := AValue - lblPenWidth.Width;
if d > 0 then
cbPenWidth.BorderSpacing.Left := d;
end;
end.

View File

@ -1,10 +1,10 @@
object ChartTitleFootFrame: TChartTitleFootFrame
Left = 0
Height = 432
Height = 394
Top = 0
Width = 423
ClientHeight = 432
ClientWidth = 423
Width = 429
ClientHeight = 394
ClientWidth = 429
TabOrder = 0
DesignLeft = 500
DesignTop = 237
@ -12,12 +12,12 @@ object ChartTitleFootFrame: TChartTitleFootFrame
Left = 0
Height = 25
Top = 0
Width = 423
Width = 429
Align = alTop
AutoSize = True
BevelOuter = bvNone
ClientHeight = 25
ClientWidth = 423
ClientWidth = 429
TabOrder = 0
object cbShow: TCheckBox
Left = 0
@ -44,27 +44,42 @@ object ChartTitleFootFrame: TChartTitleFootFrame
OnClick = cbWordwrapClick
TabOrder = 1
end
object cbHTML: TCheckBox
AnchorSideLeft.Control = cbWordwrap
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = PanelTop
Left = 188
Height = 19
Top = 0
Width = 133
BorderSpacing.Left = 32
Caption = 'Support HTML in text'
OnChange = cbHTMLChange
TabOrder = 2
end
end
object ParamsPanel: TPanel
Left = 0
Height = 187
Top = 237
Width = 423
Top = 199
Width = 429
Align = alBottom
BorderSpacing.Top = 16
BorderSpacing.Bottom = 8
BevelOuter = bvNone
ClientHeight = 187
ClientWidth = 423
ClientWidth = 429
TabOrder = 2
object rgAlignment: TRadioGroup
AnchorSideLeft.Control = ParamsPanel
AnchorSideTop.Control = ParamsPanel
AnchorSideRight.Control = Bevel1
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 51
Top = 0
Width = 211
Width = 202
Anchors = [akTop, akLeft, akRight]
AutoFill = True
AutoSize = True
Caption = 'Alignment'
@ -78,7 +93,7 @@ object ChartTitleFootFrame: TChartTitleFootFrame
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 3
ClientHeight = 31
ClientWidth = 207
ClientWidth = 198
Columns = 3
ItemIndex = 0
Items.Strings = (
@ -90,19 +105,18 @@ object ChartTitleFootFrame: TChartTitleFootFrame
TabOrder = 0
end
object gbShapeBrushPenMargins: TGroupBox
AnchorSideLeft.Control = rgAlignment
AnchorSideLeft.Control = Bevel1
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = rgAlignment
AnchorSideRight.Control = ParamsPanel
AnchorSideRight.Side = asrBottom
Left = 235
Left = 226
Height = 168
Top = 0
Width = 188
Width = 203
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 24
Caption = 'Title/footer background'
TabOrder = 2
Caption = 'gbShapeBrushPenMargins'
TabOrder = 3
end
object gbFont: TGroupBox
AnchorSideLeft.Control = rgAlignment
@ -113,23 +127,78 @@ object ChartTitleFootFrame: TChartTitleFootFrame
Left = 0
Height = 61
Top = 67
Width = 211
Width = 202
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 16
Caption = 'Font'
Caption = 'gbFont'
TabOrder = 1
end
object Bevel1: TBevel
AnchorSideLeft.Control = ParamsPanel
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = rgAlignment
Left = 202
Height = 50
Top = 0
Width = 24
Shape = bsSpacer
end
object gbMargin: TGroupBox
AnchorSideLeft.Control = ParamsPanel
AnchorSideTop.Control = gbFont
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbFont
AnchorSideRight.Side = asrBottom
Left = 0
Height = 51
Top = 144
Width = 202
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Top = 16
Caption = 'Distance to chart'
ClientHeight = 31
ClientWidth = 198
TabOrder = 2
object lblMargin: TLabel
AnchorSideLeft.Control = gbMargin
Left = 16
Height = 15
Top = 5
Width = 38
BorderSpacing.Left = 16
Caption = 'Margin'
end
object seMargin: TSpinEdit
AnchorSideLeft.Control = lblMargin
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = gbMargin
AnchorSideRight.Control = gbMargin
AnchorSideRight.Side = asrBottom
Left = 70
Height = 23
Top = 0
Width = 72
Alignment = taRightJustify
BorderSpacing.Left = 16
BorderSpacing.Right = 8
BorderSpacing.Bottom = 8
MaxValue = 1000
OnChange = seMarginChange
TabOrder = 0
end
end
end
object MemoPanel: TPanel
AnchorSideTop.Side = asrBottom
Left = 0
Height = 196
Height = 158
Top = 25
Width = 423
Width = 429
Align = alClient
BevelOuter = bvNone
ClientHeight = 196
ClientWidth = 423
ClientHeight = 158
ClientWidth = 429
Constraints.MinHeight = 80
TabOrder = 1
object lblText: TLabel
@ -150,14 +219,15 @@ object ChartTitleFootFrame: TChartTitleFootFrame
AnchorSideBottom.Control = MemoPanel
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 177
Height = 139
Top = 19
Width = 423
Width = 429
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 4
OnChange = mmoTextChange
ScrollBars = ssAutoBoth
TabOrder = 0
WordWrap = False
end
end
end

View File

@ -1,12 +1,11 @@
unit ceTitleFootFrame;
{$mode ObjFPC}{$H+}
{.$DEFINE WYSIWYG_TITLE}
interface
uses
Classes, SysUtils, Forms, Controls, ExtCtrls, StdCtrls,
Classes, SysUtils, Forms, Controls, ExtCtrls, StdCtrls, Spin,
TATextElements, TAGraph,
ceFontFrame, ceShapeBrushPenMarginsFrame;
@ -15,20 +14,27 @@ type
{ TChartTitleFootFrame }
TChartTitleFootFrame = class(TFrame)
Bevel1: TBevel;
cbShow: TCheckBox;
cbWordwrap: TCheckBox;
cbHTML: TCheckBox;
gbFont: TGroupBox;
gbShapeBrushPenMargins: TGroupBox;
gbMargin: TGroupBox;
lblMargin: TLabel;
lblText: TLabel;
MemoPanel: TPanel;
mmoText: TMemo;
PanelTop: TPanel;
ParamsPanel: TPanel;
rgAlignment: TRadioGroup;
seMargin: TSpinEdit;
procedure cbHTMLChange(Sender: TObject);
procedure cbShowChange(Sender: TObject);
procedure cbWordwrapClick(Sender: TObject);
procedure mmoTextChange(Sender: TObject);
procedure rgAlignmentClick(Sender: TObject);
procedure seMarginChange(Sender: TObject);
private
FTitle: TChartTitle;
FFontFrame: TChartFontFrame;
@ -51,6 +57,7 @@ implementation
{$R *.lfm}
uses
Math, TAChartUtils,
ceUtils;
constructor TChartTitleFootFrame.Create(AOwner: TComponent);
@ -58,24 +65,27 @@ begin
inherited;
FFontFrame := TChartFontFrame.Create(self);
FFontFrame.Parent := gbFont;
FFontFrame.Name := '';
FFontFrame.Align := alClient;
FFontFrame.BorderSpacing.Left := 8;
FFontFrame.BorderSpacing.Right := 8;
FFontFrame.OnChange := @ChangedHandler;
FFontFrame.Parent := gbFont;
gbFont.AutoSize := true;
gbFont.Caption := 'Font';
FShapeBrushPenMarginsFrame := TChartShapeBrushPenMarginsFrame.Create(self);
FShapeBrushPenMarginsFrame.Parent := gbShapeBrushPenMargins;
FShapeBrushPenMarginsFrame.Name := '';
FShapeBrushPenMarginsFrame.Align := alClient;
FShapeBrushPenMarginsFrame.BorderSpacing.Left := 8;
FShapeBrushPenMarginsFrame.BorderSpacing.Right := 8;
FShapeBrushPenMarginsFrame.BorderSpacing.Bottom := 8;
FShapeBrushPenMarginsFrame.Constraints.MinWidth := 230;
FShapeBrushPenMarginsFrame.OnChange := @ChangedHandler;
FShapeBrushPenMarginsFrame.OnShapeChange := @ShapeChangedHandler;
FShapeBrushPenMarginsFrame.AutoSize := true;
FShapeBrushPenMarginsFrame.Parent := gbShapeBrushPenMargins;
gbShapeBrushPenMargins.AutoSize := true;
// Caption of this groupbox depends on title/footer. Will be set by Prepare.
BoldHeaders(Self);
@ -90,11 +100,10 @@ begin
MemoPanel.Constraints.MinHeight +
ParamsPanel.Height + ParamsPanel.BorderSpacing.Top + ParamsPanel.BorderSpacing.Bottom;
PreferredWidth := gbFont.Width +
PreferredWidth := Max(gbFont.Width, rgAlignment.Width) +
gbShapeBrushPenMargins.Width + gbShapeBrushPenMargins.BorderSpacing.Left;
end;
procedure TChartTitleFootFrame.cbShowChange(Sender: TObject);
begin
FTitle.Visible := cbShow.Checked;
@ -104,6 +113,13 @@ begin
gbShapeBrushPenMargins.Visible := cbShow.Checked;
gbFont.Visible := cbShow.Checked;
cbWordwrap.Visible := cbShow.Checked;
cbHTML.Visible := cbShow.Checked;
gbMargin.Visible := cbShow.Checked;
end;
procedure TChartTitleFootFrame.cbHTMLChange(Sender: TObject);
begin
FTitle.TextFormat := TEXT_FORMAT[cbHTML.Checked];
end;
procedure TChartTitleFootFrame.cbWordwrapClick(Sender: TObject);
@ -114,10 +130,6 @@ end;
procedure TChartTitleFootFrame.ChangedHandler(Sender: TObject);
begin
GetChart.Invalidate;
{$IFDEF WYSIWYG_TITLE}
mmoText.Font.Assign(FTitle.Font);
mmoText.Color := FTitle.Brush.Color;
{$ENDIF}
end;
function TChartTitleFootFrame.GetAlignment: TAlignment;
@ -137,27 +149,34 @@ begin
FTitle.Text.Assign(mmoText.Lines);
end;
procedure TChartTitleFootFrame.rgAlignmentClick(Sender: TObject);
begin
FTitle.Alignment := GetAlignment;
end;
procedure TChartTitleFootFrame.Prepare(ATitle: TChartTitle);
begin
FTitle := ATitle;
cbShow.Checked := ATitle.Visible;
cbWordwrap.Checked := ATitle.Wordwrap;
cbHTML.Checked := (ATitle.TextFormat = tfHTML);
seMargin.Value := ATitle.Margin;
mmoText.Lines.Assign(ATitle.Text);
{$IFDEF WYSIWYG_TITLE}
mmoText.Font.Assign(ATitle.Font);
mmoText.Font.Orientation := 0;
{$ENDIF}
SetAlignment(ATitle.Alignment);
FFontFrame.Prepare(ATitle.Font, false);
FShapeBrushPenMarginsFrame.Prepare(ATitle.Shape, ATitle.Brush, ATitle.Frame, ATitle.Margins);
if ATitle = GetChart.Title then
gbShapeBrushPenMargins.Caption := 'Title background'
else
gbShapeBrushPenMargins.Caption := 'Footer background';
end;
procedure TChartTitleFootFrame.rgAlignmentClick(Sender: TObject);
begin
FTitle.Alignment := GetAlignment;
end;
procedure TChartTitleFootFrame.seMarginChange(Sender: TObject);
begin
FTitle.Margin := seMargin.Value;
end;
procedure TChartTitleFootFrame.SetAlignment(AValue: TAlignment);

View File

@ -5,10 +5,12 @@ unit ceUtils;
interface
uses
Graphics, Classes, SysUtils, Controls;
Graphics, Classes, SysUtils, Controls,
TAChartUtils;
const
DEFAULT_DROPDOWN_COUNT = 32;
TEXT_FORMAT: array[boolean] of TChartTextFormat = (tfNormal, tfHTML);
procedure BoldHeaders(AControl: TControl);

View File

@ -170,6 +170,38 @@
<ResourceBaseClass Value="DataModule"/>
<UnitName Value="ceImages"/>
</Unit>
<Unit>
<Filename Value="cesimplepenframe.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="SimpleChartPenFrame"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Frame"/>
<UnitName Value="ceSimplePenFrame"/>
</Unit>
<Unit>
<Filename Value="cesimplebrushframe.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="SimpleChartBrushFrame"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Frame"/>
<UnitName Value="ceSimpleBrushFrame"/>
</Unit>
<Unit>
<Filename Value="cemarksform.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="MarksForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="ceMarksForm"/>
</Unit>
<Unit>
<Filename Value="cearrowframe.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="ChartArrowFrame"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Frame"/>
<UnitName Value="ceArrowFrame"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>

View File

@ -8,7 +8,8 @@ uses
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, ceMain, ceSeriesDlg, cePointerFrame, ceTitleFootFrame, ceAxisFrame,
ceSeriesFrame, ceChartEditor, ceImages;
ceSeriesFrame, ceChartEditor, ceImages, ceSimplePenFrame, ceSimpleBrushFrame,
ceMarksForm, ceArrowFrame;
{$R *.res}
@ -18,6 +19,7 @@ begin
Application.Initialize;
Application.CreateForm(TChartImagesDM, ChartImagesDM);
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TMarksForm, MarksForm);
Application.Run;
end.

View File

@ -374,7 +374,11 @@ begin
DrawLink(ADrawer, ADataPoint, ALabelCenter);
with GetLabelBrush do begin
clr := TColor(IfThen(Color = clDefault, FOwner.Color, Color));
if Color = clDefault then
begin
if FOwner <> nil then clr := FOwner.Color else clr := clBtnFace;
end else
clr := Color;
ADrawer.SetBrushParams(Style, ColorToRGB(clr));
end;
if IsMarginRequired then begin