#delphi #firemonkey
#delphi #firemonkey
Вопрос:
Я просто хочу изменить цвет кнопки после ее нажатия.
Должен ли я использовать «стили» для этого или ….?
Комментарии:
1. Для пояснения: вы хотите, чтобы кнопка меняла цвет при нажатии и возвращалась впоследствии, или постоянно меняла цвет после нажатия (например, кнопка быстрого доступа, которая находится «вниз») — и если да, то когда она возвращается к исходному цвету?
Ответ №1:
Вы можете изменить кнопку.Свойство StyleLookup для изменения стиля (цвета).
Вам нужно добавить новый стиль в Книгу стилей.
- Выберите «Редактировать пользовательский стиль …» в меню правой кнопки мыши из кнопки.
- Измените заливку.Свойство Color из элементов TRectangle под фоном:TRectangle
- Примените и закройте Stylebook
- Очистить кнопку.stylelookup
- Измените button.stylelookup в вашем buttonclick на новый стиль create, когда вы не меняли название его Button1Style1
Комментарии:
1. В Delphi XE8 этого не существует — в стилях кнопок этого нет
TRectangle
, толькоTStyleContainer
,TButtonStyleObject
TGlyph
,TButtonStyleTextObject
TImage
, и a,,,,,,,,,,,,,.2. В Delphi 10.3 мне нужно было добавить TRectangle, поскольку по умолчанию он не существует.
Ответ №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, если вам не нужна гибкость в выборе цвета во время выполнения, сделайте это так, как предлагает Арьен, это проще. Я просто опубликовал свой ответ, чтобы вы могли увидеть другой подход, который может вам подойти. В моем приложении пользователь выбирает цвета.