Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.05;
Скачать: CL | DM;

Вниз

Sender is not! TButton   Найти похожие ветки 

 
id_privin ©   (2002-08-23 11:36) [0]

Очередной раз наступаю на эти грабли, и хочу наконец разобраться.

Есть MyAction : TAction. Сделана в дизайне. И в проге пишем так

MyButton := TButton.Create(...);
MyButton.Action := MyAction;

Вызываем прогу, жмем на кнопку, акция срабатывает, но !!!!! Sender"ом оказывается не кнопка, а акция.

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


 
DiamondShark ©   (2002-08-23 11:49) [1]


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


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

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


 
id_privin ©   (2002-08-23 12:10) [2]

Хм, насколько я помню, если акцию присвоить в дизайне то Sendr"ом будет как раз компонент который ее вызывает, нет?


 
Игорь Шевченко ©   (2002-08-23 12:12) [3]

Нет. Sender - это всегда Action. Сделано, к примеру, для того, чтобы различать Actions на которые назначен общий обработчик


 
id_privin ©   (2002-08-23 12:19) [4]

Да, я ошибся, но если писать Button.OnClick = MyActionExecute
Sender правильный, только все преимущества которые дает Action, при этом теряются.

2Игорь Шевченко. Вам не кажеться странным такой подход, ведь Action это действие, почему разные действия могут делать одно и тоже? А вот вызвать из разных мест одно и тоже действие, вполне логично.


 
Игорь Шевченко ©   (2002-08-23 12:32) [5]

Какая разница, какой компонент вызвал Action.Execute, если действие всегда одно и то же ?

Мне этот подход кажется разумным и логичным, как, впрочем и остальные подходы Borland :-)))


 
Макс Черных ©   (2002-08-23 17:06) [6]


> Какая разница, какой компонент вызвал Action.Execute, если
> действие всегда одно и то же


Ну а если разница все таки интересна, то для этого
существует свойство TBasicAction.ActionComponent
которое и указывает на кнопку или меню или чего там
нажали.

>id_privin
Вот так оно и лечится:
TAction(Sender).ActionComponent ...

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


 
Игорь Шевченко ©   (2002-08-23 17:22) [7]

Макс Черных © (23.08.02 17:06)

Только для D6


 
Юрий Зотов ©   (2002-08-23 22:17) [8]

> если акцию присвоить в дизайне

Неважно когда, в run-time то же самое.


> то Sendr"ом будет как раз компонент который ее вызывает, нет?

Да, именно так. И все у Вас именно так и происходит. Обработчик вызывается КОМПОНЕНТОМ TAction (потому что TAction - это точно такой же компонент, как и все остальные, только невидимый), поэтому Sender"ом, естественно, он и является. Все по теории.




Страницы: 1 вся ветка

Текущий архив: 2002.09.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
7-14308
Georg
2002-06-19 17:11
2002.09.05
Ручной коммутатор - исчезает мышь


1-14127
EternalWonderer
2002-08-20 15:04
2002.09.05
Некорректная отрисовка TreeView


3-13946
3asys
2002-08-12 23:59
2002.09.05
Record is deleted


1-14035
Up
2002-08-26 06:31
2002.09.05
Cкрытые ключи реестра


6-14196
Белый Орел
2002-06-26 15:07
2002.09.05
Постояное соединение с сервером