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

Как вызвать событие элемента стиля?


Виктор

Вопрос

Допусти есть некий стиль элемента, в этом стиле есть ButtonStyleObject HitTest у которого False. Как вызвать событие клика по этому элементу? В данном случаи интересует смена Bitmapa на PressetLink

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

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

  • 0
  • Администраторы

Триггеры вызываются автоматически на уровне TControl. То есть, когда пользовать нажимает на кнопку TButton, кнопка при:

  • нажатии мышкой на кнопку
  • перемещении мыши по области кнопки
  • выходе из области кнопки
Запускает процедуру срабатывания триггеров через:

{ ITriggerEffect }
procedure ApplyTriggerEffect(const AInstance: TFmxObject; const ATrigger: string); virtual;
{ ITriggerAnimation }
procedure StartTriggerAnimation(const AInstance: TFmxObject; const ATrigger: string); virtual;
procedure StartTriggerAnimationWait(const AInstance: TFmxObject; const ATrigger: string); virtual;
Тем самым TControl передает этот вызов всем дочерним объектам кнопки. В том числе вашему TButtonStyleObject. Поэтому картинка в TButtonStyleObject сменится на базовом уровне и не нужно форсировать вызов.

 

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

На вторую часть я ответил выше. На первую часть вопроса, вы можете вытащить объект стиля, взять у него интерфейс IControl и вручную сэмулировать срабатывание клика, например так:

var
  StyleObject: TFmxObject;
  StyleObjectControl: IControl;
begin
  StyleObject := Button1.FindStyleResource('background');
  if (StyleObject <> nil) and (StyleObject is TControl) then
  begin
    StyleObjectControl := IControl(StyleObject);
    StyleObjectControl.MouseDown(TMouseButton.mbLeft, [], 0, 0);
    StyleObjectControl.MouseClick(TMouseButton.mbLeft, [], 0, 0);
    StyleObjectControl.MouseUp(TMouseButton.mbLeft, [], 0, 0);
  end;
end;
Однако, я бы не стал придумывать велосипед.. Попробуйте уточнить, что именно вы хотите добиться.
Ссылка на комментарий
  • 0

Речь в данном случаи идет о стиле для combobox. Он состоит из общего ButtonStyleObject на котором расположены шрифт, контент и прочие, так же не нам расположен и еще один ButtonStyleObject на который повешена текстура стрелочки вниз. Везде Hittest:=False. Соотвественно контрол обрабатывает клик по всему элементу что полностью устраивает, однако во втором ButtonStyleObject при нажатии не меняется текстура с Normal на pressed, а надо что бы менялась. Я конечно сделал как предложено в дефолтном варианте с текстурами загруженными в основной контейнер ButtonStyleObject, но хотелось бы знать на будущие как можно реализовать нажатие на внутренний элемент стиля при условии что Hittest:=False.

Предложенный вариант не сработал:
[dcc32 Error] FotoOrder.pas(452): E2010 Incompatible types: 'IControl' and 'TFmxObject'
В строке:
 

StyleObjectControl := IControl(StyleObject);
StyleObjectControl := IControl(StyleObject as IControl);

При этом код заработал, но эффекта не произвел.

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

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...