如何更改,禁用按钮颜色FMX?

时间:2017-01-16 06:26:58

标签: delphi firemonkey

使用StyleBook时,如果按钮是Diasbled,则颜色几乎不会描述按钮被禁用。因此,我希望在禁用按钮时更改颜色。我怎么做。 我正在使用Delphi Seattle

2 个答案:

答案 0 :(得分:2)

这不像改变样式簿中的正常颜色那样直截了当。禁用外观是通过降低控件的不透明度而不是通过调整任何颜色属性来实现的。

我要做的是首先使用您喜欢的颜色为禁用按钮创建样式。每当您禁用该按钮时,您可以将按钮的StyleLookup设置为该样式的名称,如果再次启用它,则将其更改回默认值。

除此之外,您可能还想禁用调整不透明度的常用行为。因此,您需要设置按钮的DisabledOpacity。您通常无法访问该属性,但可以通过继承它来打开它。

type
  TMyButton = class (TButton);

// ...

TMyButton(Button1).DisabledOpacity := 1.0;

答案 1 :(得分:0)

聚会晚了一点,但是我遇到了同样的问题。我想出的解决方案是让我自己的后代成为TButton,就像@DNR一样,我将DisabledOpacity设置为1.0。但是,我没有为禁用按钮的版本提供完整的单独样式,而是实现了用于设置控件enabled属性的动画/效果触发器。这样就可以在按钮样式中使用彩色动画。

一些代码段:

界面

TMyButton = class(TButton)
protected
  procedure ApplyStyle; override;
  procedure ApplyTriggers; override;
  procedure SetEnabled(const Value: Boolean); override;
public
  constructor Create(AOwner: TComponent); override;
end;

实施

{ TMyButton }

procedure TMyButton.ApplyStyle;
begin
  inherited;
  if not Enabled then
    ApplyTriggers;
end;

procedure TMyButton.ApplyTriggers;
begin
  StartTriggerAnimation(Self, 'Enabled');
  ApplyTriggerEffect(Self, 'Enabled');
  inherited;
end;

constructor TMyButton.Create(AOwner: TComponent);
begin
  inherited;
  DisabledOpacity := 1;
end;

procedure TMyButton.SetEnabled(const Value: Boolean);
var
  LOldValue: Boolean;
begin
  LOldValue := Enabled;
  inherited;
  if IsInflated and (LOldValue <> Value) then
    ApplyTriggers;
end;

假设您有一个带有TRectangle背景的按钮,您可以按照以下样式进行操作:

object TLayout
  StyleName = 'TMyButtonStyle'
  Align = Center
  Size.Width = 200.000000000000000000
  Size.Height = 50.000000000000000000
  Size.PlatformDefault = False
  TabOrder = 0
  object TRectangle
    StyleName = 'background'
    Align = Contents
    Fill.Color = claWhite
    HitTest = False
    Size.Width = 200.000000000000000000
    Size.Height = 50.000000000000000000
    Size.PlatformDefault = False
    object TColorAnimation
      StyleName = 'caFillEnabled'
      Duration = 0.200000002980232200
      PropertyName = 'Fill.Color'
      StartValue = claWhite
      StopValue = claLightgray
      Trigger = 'Enabled=false'
      TriggerInverse = 'Enabled=true'
    end
...