Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]


> Вопрос в чем дело, и как это лечить?


Дело в том, что обработчик вызывает не кнопка, а акция.

Явление полезное, надо не лечить, а пользоваться.


Наверх

Титульная страница Поиск, карта сайта Написать письмо