任意改变FMX的TPanel控件的颜色

来源:互联网 发布:阿里云域名解析端口号 编辑:程序博客网 时间:2024/05/22 13:17

FMX的控件的外观以Style为主,但是也有不方便的地方,比如要任意改变TPanel的颜色,只能写代码,摸索了几天,初步实现了

unit FMX.JKPanelEx;interfaceuses  System.SysUtils, System.Classes, System.Types, System.UITypes, FMX.Types, FMX.Controls, FMX.Objects, FMX.Graphics,  FMX.Controls.Presentation, FMX.StdCtrls;type  TAppearanceUpdateKind = (None, Fill, Stroke, CornerSize);  TJKPanelEx = class(TPanel)  private    FAppearance: TRectangle;    FFill: TBrush;    FStroke: TStrokeBrush;    FCornerSize: Single;    FAppearanceUpdateKind: TAppearanceUpdateKind;    procedure SetFill(const Value: TBrush);    procedure SetStroke(const Value: TStrokeBrush);    procedure SetCornerSize(const Value: Single);  protected    procedure ApplyStyle; override;    procedure FreeStyle; override;    procedure FillChanged(Sender: TObject); virtual;    procedure StrokeChanged(Sender: TObject); virtual;    procedure UpdateAppearanceFill;    procedure UpdateAppearanceStroke;    procedure UpdateAppearanceCornerSize;    procedure UpdateAppearance;  public    constructor Create(AOwner: TComponent); override;    destructor Destroy; override;    property Appearance: TRectangle read FAppearance write FAppearance;  published    property Fill: TBrush read FFill write SetFill;    property Stroke: TStrokeBrush read FStroke write SetStroke;    property CornerSize: Single read FCornerSize write SetCornerSize;  end;procedure Register;implementationprocedure Register;begin  RegisterComponents('JKFMXControl', [TJKPanelEx]);end;{ TJKPanelEx }procedure TJKPanelEx.ApplyStyle;begin  inherited;  if not Assigned(FAppearance) then  begin    if not FindStyleResource<TRectangle>('Background', FAppearance) and (ResourceControl is TRectangle) then      FAppearance := TRectangle(ResourceControl);    UpdateAppearanceCornerSize;    UpdateAppearanceFill;    UpdateAppearanceStroke;  end  else  begin    UpdateAppearance;  end;end;constructor TJKPanelEx.Create(AOwner: TComponent);begin  inherited;  FAppearance := nil;  FAppearanceUpdateKind := TAppearanceUpdateKind.None;  FFill := TBrush.Create(TBrushKind.Solid, TAlphaColor($FFE0E0E0));  FStroke := TStrokeBrush.Create(TBrushKind.Solid, TAlphaColors.Black);  FFill.OnChanged := FillChanged;  FStroke.OnChanged := StrokeChanged;end;destructor TJKPanelEx.Destroy;begin  FreeAndNil(FFill);  FreeAndNil(FStroke);  inherited;end;procedure TJKPanelEx.FillChanged(Sender: TObject);begin  FAppearanceUpdateKind := TAppearanceUpdateKind.Fill;  ApplyStyle;end;procedure TJKPanelEx.FreeStyle;begin  inherited;  FAppearance := nil;end;procedure TJKPanelEx.SetCornerSize(const Value: Single);begin  if FCornerSize <> Value then  begin    FAppearanceUpdateKind := TAppearanceUpdateKind.CornerSize;    FCornerSize := Value;    UpdateAppearanceCornerSize;  end;end;procedure TJKPanelEx.SetFill(const Value: TBrush);begin  FFill.Assign(Value);end;procedure TJKPanelEx.SetStroke(const Value: TStrokeBrush);begin  FStroke.Assign(Value);end;procedure TJKPanelEx.StrokeChanged(Sender: TObject);begin  FAppearanceUpdateKind := TAppearanceUpdateKind.Stroke;  ApplyStyle;end;procedure TJKPanelEx.UpdateAppearance;begin  case FAppearanceUpdateKind of    TAppearanceUpdateKind.None: ;    TAppearanceUpdateKind.Fill: UpdateAppearanceFill;    TAppearanceUpdateKind.Stroke: UpdateAppearanceStroke;    TAppearanceUpdateKind.CornerSize: UpdateAppearanceCornerSize;  end;end;procedure TJKPanelEx.UpdateAppearanceFill;begin  if FAppearance <> nil then  begin    FAppearance.Fill.Assign(FFill);  end;end;procedure TJKPanelEx.UpdateAppearanceStroke;begin  if FAppearance <> nil then  begin    FAppearance.Stroke.Assign(FStroke);  end;end;procedure TJKPanelEx.UpdateAppearanceCornerSize;begin  if FAppearance <> nil then  begin    FAppearance.XRadius := FCornerSize;    FAppearance.YRadius := FCornerSize;  end;end;end.