![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Sender is not! TButton [D5, Win2k]
id_privin © (2002-08-23 11:36:00)Очередной раз наступаю на эти грабли, и хочу наконец разобраться.
Есть MyAction : TAction. Сделана в дизайне. И в проге пишем так
MyButton := TButton.Create(...);
MyButton.Action := MyAction;
Вызываем прогу, жмем на кнопку, акция срабатывает, но !!!!! Sender"ом оказывается не кнопка, а акция.
Вопрос в чем дело, и как это лечить?
Юрий Зотов (2002-08-23 22:17:00) [1]> если акцию присвоить в дизайне
Неважно когда, в run-time то же самое.
> то Sendr"ом будет как раз компонент который ее вызывает, нет?
Да, именно так. И все у Вас именно так и происходит. Обработчик вызывается КОМПОНЕНТОМ TAction (потому что TAction - это точно такой же компонент, как и все остальные, только невидимый), поэтому Sender"ом, естественно, он и является. Все по теории.
Игорь Шевченко (2002-08-23 17:22:00) [2]Макс Черных © (23.08.02 17:06)
Только для D6
Макс Черных (2002-08-23 17:06:00) [3]
> Какая разница, какой компонент вызвал Action.Execute, если
> действие всегда одно и то же
Ну а если разница все таки интересна, то для этого
существует свойство TBasicAction.ActionComponent
которое и указывает на кнопку или меню или чего там
нажали.
>id_privin
Вот так оно и лечится:
TAction(Sender).ActionComponent ...
Однако, лучше пересмотреть логику работы программы, чтобы
исключить подобные проверки. А то получается смесь
концепций построения пользовательского интерфейса.
Игорь Шевченко (2002-08-23 12:32:00) [4]Какая разница, какой компонент вызвал Action.Execute, если действие всегда одно и то же ?
Мне этот подход кажется разумным и логичным, как, впрочем и остальные подходы Borland :-)))
id_privin (2002-08-23 12:19:00) [5]Да, я ошибся, но если писать Button.OnClick = MyActionExecute
Sender правильный, только все преимущества которые дает Action, при этом теряются.
2Игорь Шевченко. Вам не кажеться странным такой подход, ведь Action это действие, почему разные действия могут делать одно и тоже? А вот вызвать из разных мест одно и тоже действие, вполне логично.
Игорь Шевченко (2002-08-23 12:12:00) [6]Нет. Sender - это всегда Action. Сделано, к примеру, для того, чтобы различать Actions на которые назначен общий обработчик
id_privin (2002-08-23 12:10:00) [7]Хм, насколько я помню, если акцию присвоить в дизайне то Sendr"ом будет как раз компонент который ее вызывает, нет?
DiamondShark (2002-08-23 11:49:00) [8]
> Вопрос в чем дело, и как это лечить?
Дело в том, что обработчик вызывает не кнопка, а акция.
Явление полезное, надо не лечить, а пользоваться.