unit RectangleButton;
interface
uses
System.SysUtils, System.Classes, System.UITypes, FMX.Types, FMX.Controls, FMX.Objects, FMX.StdCtrls, FMX.Ani, FMX.Dialogs;
type
TRectangleButton = class(TRectangle)
private
fClicked: Boolean;
fMainColor: TAlphaColor;
fClickedColor: TAlphaColor;
fText: String;
ColorAnimation: TColorAnimation;
TextLabel: TLabel;
protected
procedure Click; override;
procedure SetText(const Value: String);
procedure SetMainColor(const Value: TAlphaColor);
procedure SetClickedColor(const Value: TAlphaColor);
procedure SetClicked(const Value: Boolean);
public
{ Public declarations }
published
property Clicked: Boolean read fClicked write SetClicked;
property MainColor: TAlphaColor read fMainColor write SetMainColor;
property ClickedColor: TAlphaColor read fClickedColor write SetClickedColor;
property Text: String read fText write SetText;
procedure Unselect;
constructor Create(aowner: TComponent); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Shapes', [TRectangleButton]);
end;
{ TRectangleButton }
procedure TRectangleButton.Click;
begin
inherited;
if not fClicked then begin
fClicked:= True;
Fill.Color:= fClickedColor;
ColorAnimation.Trigger:= '';
ColorAnimation.TriggerInverse:= '';
end;
end;
constructor TRectangleButton.Create(aowner: TComponent);
begin
inherited Create (AOwner);
ColorAnimation:= TColorAnimation.Create(Self);
with ColorAnimation do begin
Parent:= Self;
Stored:= False;
AutoReverse:= False;
Delay:= 0;
Duration:= 0.2;
PropertyName:= 'Fill.Color';
//StartValue:= Fill.Color;
//StopValue:= ClickedColor;
Trigger:= 'IsMouseOver=true';
TriggerInverse:= 'IsMouseOver=false';
end;
TextLabel:= TLabel.Create(Self);
with TextLabel do begin
Stored:= False;
Parent:= self;
Align:= TAlignLayout.Contents;
TextSettings.HorzAlign:= TTextAlign.Center;
Text:= 'Text';
end;
end;
procedure TRectangleButton.SetClicked(const Value: Boolean);
begin
if Value then begin
fClicked:= True;
Fill.Color:= fClickedColor;
ColorAnimation.Trigger:= '';
ColorAnimation.TriggerInverse:= '';
end;
if not Value then begin
fClicked:= False;
Fill.Color:= fMainColor;
ColorAnimation.Trigger:= 'IsMouseOver=true';
ColorAnimation.TriggerInverse:= 'IsMouseOver=false';
end;
end;
procedure TRectangleButton.SetClickedColor(const Value: TAlphaColor);
begin
if ClickedColor <> Value then begin
ColorAnimation.StopValue:= Value;
fClickedColor:= Value;
end;
end;
procedure TRectangleButton.SetMainColor(const Value: TAlphaColor);
begin
if MainColor <> Value then begin
if not Clicked then Fill.Color:= Value
else Fill.Color:= fClickedColor;
ColorAnimation.StartValue:= Value;
fMainColor:= Value;
end;
end;
procedure TRectangleButton.SetText(const Value: String);
begin
if TextLabel.Text <> Value then begin
TextLabel.Text:= Value;
fText:= Value;
end;
end;
procedure TRectangleButton.Unselect;
begin
fClicked:= False;
with ColorAnimation do begin
Inverse:= True;
Start;
Trigger:= 'IsMouseOver=true';
TriggerInverse:= 'IsMouseOver=false';
end;
end;
end.
Есть св-во Clicked, и если оно True, то компонент должен создаваться с Fill.Color=ClickedColor, но он создаётся вообще без заливки. Если Clicked=False, то всё нормально и компонент создаётся с Fill.Color=MainColor.
Вопрос
patrikey
Создал компонент. Квадратная кнопка.
unit RectangleButton; interface uses System.SysUtils, System.Classes, System.UITypes, FMX.Types, FMX.Controls, FMX.Objects, FMX.StdCtrls, FMX.Ani, FMX.Dialogs; type TRectangleButton = class(TRectangle) private fClicked: Boolean; fMainColor: TAlphaColor; fClickedColor: TAlphaColor; fText: String; ColorAnimation: TColorAnimation; TextLabel: TLabel; protected procedure Click; override; procedure SetText(const Value: String); procedure SetMainColor(const Value: TAlphaColor); procedure SetClickedColor(const Value: TAlphaColor); procedure SetClicked(const Value: Boolean); public { Public declarations } published property Clicked: Boolean read fClicked write SetClicked; property MainColor: TAlphaColor read fMainColor write SetMainColor; property ClickedColor: TAlphaColor read fClickedColor write SetClickedColor; property Text: String read fText write SetText; procedure Unselect; constructor Create(aowner: TComponent); override; end; procedure Register; implementation procedure Register; begin RegisterComponents('Shapes', [TRectangleButton]); end; { TRectangleButton } procedure TRectangleButton.Click; begin inherited; if not fClicked then begin fClicked:= True; Fill.Color:= fClickedColor; ColorAnimation.Trigger:= ''; ColorAnimation.TriggerInverse:= ''; end; end; constructor TRectangleButton.Create(aowner: TComponent); begin inherited Create (AOwner); ColorAnimation:= TColorAnimation.Create(Self); with ColorAnimation do begin Parent:= Self; Stored:= False; AutoReverse:= False; Delay:= 0; Duration:= 0.2; PropertyName:= 'Fill.Color'; //StartValue:= Fill.Color; //StopValue:= ClickedColor; Trigger:= 'IsMouseOver=true'; TriggerInverse:= 'IsMouseOver=false'; end; TextLabel:= TLabel.Create(Self); with TextLabel do begin Stored:= False; Parent:= self; Align:= TAlignLayout.Contents; TextSettings.HorzAlign:= TTextAlign.Center; Text:= 'Text'; end; end; procedure TRectangleButton.SetClicked(const Value: Boolean); begin if Value then begin fClicked:= True; Fill.Color:= fClickedColor; ColorAnimation.Trigger:= ''; ColorAnimation.TriggerInverse:= ''; end; if not Value then begin fClicked:= False; Fill.Color:= fMainColor; ColorAnimation.Trigger:= 'IsMouseOver=true'; ColorAnimation.TriggerInverse:= 'IsMouseOver=false'; end; end; procedure TRectangleButton.SetClickedColor(const Value: TAlphaColor); begin if ClickedColor <> Value then begin ColorAnimation.StopValue:= Value; fClickedColor:= Value; end; end; procedure TRectangleButton.SetMainColor(const Value: TAlphaColor); begin if MainColor <> Value then begin if not Clicked then Fill.Color:= Value else Fill.Color:= fClickedColor; ColorAnimation.StartValue:= Value; fMainColor:= Value; end; end; procedure TRectangleButton.SetText(const Value: String); begin if TextLabel.Text <> Value then begin TextLabel.Text:= Value; fText:= Value; end; end; procedure TRectangleButton.Unselect; begin fClicked:= False; with ColorAnimation do begin Inverse:= True; Start; Trigger:= 'IsMouseOver=true'; TriggerInverse:= 'IsMouseOver=false'; end; end; end.
Есть св-во Clicked, и если оно True, то компонент должен создаваться с Fill.Color=ClickedColor, но он создаётся вообще без заливки. Если Clicked=False, то всё нормально и компонент создаётся с Fill.Color=MainColor.
Ссылка на комментарий
1 ответ на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.