В Delphi XE2 FireMonkey — как мне изменить цвет кнопки после ее нажатия

#delphi #firemonkey

#delphi #firemonkey

Вопрос:

Я просто хочу изменить цвет кнопки после ее нажатия.

Должен ли я использовать «стили» для этого или ….?

Комментарии:

1. Для пояснения: вы хотите, чтобы кнопка меняла цвет при нажатии и возвращалась впоследствии, или постоянно меняла цвет после нажатия (например, кнопка быстрого доступа, которая находится «вниз») — и если да, то когда она возвращается к исходному цвету?

Ответ №1:

Вы можете изменить кнопку.Свойство StyleLookup для изменения стиля (цвета).

Вам нужно добавить новый стиль в Книгу стилей.

  1. Выберите «Редактировать пользовательский стиль …» в меню правой кнопки мыши из кнопки.
  2. Измените заливку.Свойство Color из элементов TRectangle под фоном:TRectangle
  3. Примените и закройте Stylebook
  4. Очистить кнопку.stylelookup
  5. Измените button.stylelookup в вашем buttonclick на новый стиль create, когда вы не меняли название его Button1Style1

Комментарии:

1. В Delphi XE8 этого не существует — в стилях кнопок этого нет TRectangle , только TStyleContainer , TButtonStyleObject TGlyph , TButtonStyleTextObject TImage , и a,,,,,,,,,,,,,.

2. В Delphi 10.3 мне нужно было добавить TRectangle, поскольку по умолчанию он не существует.

Ответ №2:

Использование стилей

Альтернативой созданию другого стиля и переключению на этот новый стиль было бы создание пользовательского стиля для кнопки и изменение цвета в этом стиле во время выполнения.

  1. Щелкните правой кнопкой мыши на кнопке и выберите «Редактировать пользовательский стиль …» в главном меню.
  2. Нажмите Применить и закрыть в редакторе стилей.

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

Теперь введите следующее в событие OnClick, чтобы изменить цвет во время выполнения:

   var
    r: TRectangle;
  begin
    // Find the background TRectangle style element for the button
    r := (Button1.FindStyleResource('background') as TRectangle);
    if Assigned(r) then
    begin
      r.Fill.Color := claBlue;
    end;
  end;
  

Примечание: Добавьте FMX.Objects в ваше предложение uses, если у вас его еще нет. Вот где находится TRectangle.

Но подождите…

Вы заметите, что цвет кнопки возвращается к значению по умолчанию, когда мышь покидает кнопку или входит в нее. Это из-за анимации. Если вы установите свойства stylename для обоих элементов стиля TColorAnimation в редакторе стилей для пользовательского стиля, вы также можете установить цвет для них. Для моего примера я назвал TColorAnimations coloranimation1 и coloranimation2.

Вот пересмотренный код:

 var
  r: TRectangle;
  ca: TColorAnimation;
begin
  // Find the background TRectangle style element for the button
  r := (Button1.FindStyleResource('background') as TRectangle);
  if Assigned(r) then
  begin
    r.Fill.Color := claBlue;
  end;
  ca := (Button1.FindStyleResource('coloranimation1') as TColorAnimation);
  if Assigned(ca) then
  begin
    ca.StartValue := claBlue;
  end;
  ca := (Button1.FindStyleResource('coloranimation2') as TColorAnimation);
  if Assigned(ca) then
  begin
    ca.StopValue := claBlue;
  end;
  

Примечание: Добавьте FMX.Ответьте на ваше предложение uses для TColorAnimation.

Комментарии:

1. Это работает до тех пор, пока курсор мыши находится над кнопкой. Перемещение курсора изменило цвет на исходный. Но, возможно, я неправильно понял вопрос.

2. @Arjen, ты прав. Это работает для большинства элементов стиля, но анимация фокусировки восстанавливает цвет по умолчанию после того, как мышь уходит.

3. Я обновил свой ответ, чтобы включить также обновление анимации.

4. Нееет, не делайте этого таким образом. Извините, Маркус, но этот код не работает со стилем по умолчанию. Существует много разных стилей кнопок. Например: MacBlue, только GradientAnimation или Ruby, FloatAnimation и 2 rectangle. Оба стиля не имеют coloranimation. Не кодируйте изменения стиля в своем коде жестко, а используйте для этого Книгу стилей.

5. @tondog, если вам не нужна гибкость в выборе цвета во время выполнения, сделайте это так, как предлагает Арьен, это проще. Я просто опубликовал свой ответ, чтобы вы могли увидеть другой подход, который может вам подойти. В моем приложении пользователь выбирает цвета.