Перейти к содержанию
Fire Monkey от А до Я
  • 0

Кнопка с тенью и стилизованным Disabled


ddr 2

Вопрос

Добрый день!

Требуется кнопка с стилизованым Disabled. Пошел по пути подмены Стиля. И раз уж все равно решается это только через наследование TButton, то хочется сразу интегрировать в компонент ТЕНЬ. Сделал. Код ниже. Работает, но есть вопросы и моя реализация с тенью явно требует изменений.

Вопрос 1(ОСНОВНОЙ).

Structure.jpg.7efc48bc2b7ade991e6f841883cea2d6.jpg

При каждом открытии проекта, к каждой кнопке TButtonWithShadow добавляется новая(ещё одна) тень(см. картинку). Как от этого избаваться?

Вопрос 2. Выбор подменяемого Стиля я реализовал через   published  property StyledDisabled:String read FStyledDisabled write FStyledDisabled; При этом в Дизайнере данное свойство - строка. Как сделать не строку, а выпадающий список по аналогии с StyleLookup?

Вопрос 3. Опытным путем(и немного чтением этого форума) выяснил, что для того, что бы Стили отображались в StyleLookup необходимо, что бы стили имели имя по маске "ButtonWithShadow*".Возможно ли влиять(изменить) на маску?

Вопрос 4. Текущая реализация запоминания(FFStyledEnabled:=StyleLookup;) основного стиля кнопки(для обратной подмены) в procedure TButtonWithShadow.EnabledChanged;  при каждом изменении значения с ИСТИНЫ на ЛОЖЬ свойства Enabled, совсем не изящное. Однократное сохранения значения свойств я ранее делал, в AfterConstruction, но с StyleLookup такой подход не работает.

Вопрос 5. В моей задаче кпопка "безфокусная". Соответсвенно и статус Focused в основном Стиле не используется. Возможно ли Disabled реализовать через подмену Focused<->Normal в основном используемом Стиле?

 

unit UButtonWithShadow;

interface
uses FMX.StdCtrls,System.Classes,FMX.Effects,System.UITypes,FMX.Types;

 type

 TButtonWithShadow = class(TButton)
  private
  protected
    FShadow:TShadowEffect;
    FStyledDisabled:String;
    FFStyledEnabled:String;
    procedure EnabledChanged; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure AfterConstruction; override;
  published
    property StyledDisabled:String read FStyledDisabled write FStyledDisabled;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Мои компоненты', [TButtonWithShadow]);
end;


constructor TButtonWithShadow.Create(AOwner: TComponent);
Begin
  inherited;

  DisabledOpacity := 1; //отключаем прозрачность для enabled=false

  TextSettings.Font.Family:='Roboto';
  TextSettings.Font.Size:=36.0;
  TextSettings.Font.Style:=[TFontStyle.fsBold];

  StyledSettings:=[TStyledSetting.Style,TStyledSetting.FontColor];

  FShadow:= TShadowEffect.Create(self{nil});
  FShadow.Direction:=45;
  FShadow.Distance:=5;
  FShadow.Softness:=0.2;
  FShadow.ShadowColor:=TAlphaColorRec.Dimgray;
  FShadow.Trigger:='IsPressed=false';
  FShadow.Parent := Self;
  //AddObject(FShadow);
End;

destructor TButtonWithShadow.Destroy;
Begin
 //RemoveObject(FShadow);
 FShadow.Free;
 inherited;
End;

procedure TButtonWithShadow.AfterConstruction;
Begin
//  NeedStyleLookup;
//  ApplyStyleLookup;
  FFStyledEnabled:=StyleLookup; //Пустая строка.
  inherited;
End;

procedure TButtonWithShadow.EnabledChanged;
Begin
  if Enabled then StyleLookup:=FFStyledEnabled
  else if FMX.Types.FindStyleResource(FStyledDisabled)<>nil then
   Begin
    FFStyledEnabled:=StyleLookup;
    StyleLookup:=FStyledDisabled;
   End;
End;

end.

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
В 11.08.2020 в 16:56, ddr 2 сказал:

Вопрос 5. В моей задаче кпопка "безфокусная". Соответсвенно и статус Focused в основном Стиле не используется. Возможно ли Disabled реализовать через подмену Focused<->Normal в основном используемом Стиле?

Ответ: Кнопка в режиме Disabled(Enabled=false) отображается в стиле Focused

//добавляем
protected
    FIsFocused:Boolean;
    procedure ApplyStyleLookup; override;
  published
    property IsFocused read FIsFocused write FIsFocused;
  end;

procedure TButtonWithShadow.ApplyStyleLookup;
Begin
  inherited;
  EnabledChanged;
End;

//изменяем на 
procedure TButtonWithShadow.EnabledChanged;
Begin
  IsFocused:= not Enabled;
  StartTriggerAnimation(Self, 'Focused');
End
Цитата

Вопрос 4. Текущая реализация запоминания(FFStyledEnabled:=StyleLookup;) основного стиля кнопки(для обратной подмены) в procedure TButtonWithShadow.EnabledChanged;  при каждом изменении значения с ИСТИНЫ на ЛОЖЬ свойства Enabled, совсем не изящное. Однократное сохранения значения свойств я ранее делал, в AfterConstruction, но с StyleLookup такой подход не работает.

Ответ: Однократное сохранения куда либо значения StyleLookup в процессе создания экземпляра (инициализации) компонента можно сделать в перекрываемом методе Loaded  , в котором значение в StyleLookup уже загружено из ресурсов.

Цитата

Вопрос 3. Опытным путем(и немного чтением этого форума) выяснил, что для того, что бы Стили отображались в StyleLookup необходимо, что бы стили имели имя по маске "ButtonWithShadow*".Возможно ли влиять(изменить) на маску?

Ответ: Применяется маска"*ClassName*", вполне адекватна и не требует изменений.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...