1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
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;
procedure DoChange;
function GetWidthLeft: Integer;
procedure SetWidthLeft(const AValue: Integer);
protected
procedure CalculatePreferredSize(
var PreferredWidth, PreferredHeight: integer;
{%H-}WithThemeSpace: Boolean); override;
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, Math;
{ TSimpleChartPenFrame }
constructor TSimpleChartPenFrame.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
cbPenWidth.DropdownCount := DEFAULT_DROPDOWN_COUNT;
cbPenColor.Width := cbPenColor.Height;
end;
procedure TSimpleChartPenFrame.CalculatePreferredSize(
var PreferredWidth, PreferredHeight: integer;
WithThemeSpace: Boolean);
begin
PreferredWidth := Max(
cbPenColor.Left + cbPenColor.Width,
cbPenWidth.Left + cbPenWidth.Constraints.MinWidth
);
PreferredHeight := cbPenWidth.Top + cbPenWidth.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.
|