Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.015 c
14-14265
monya
2002-08-11 17:13
2002.09.05
Shortcut


1-14017
lipskiy
2002-08-25 04:10
2002.09.05
Как покрасить главное меню своим цветом?


4-14336
antonyo
2002-07-05 11:06
2002.09.05
Человеки!!!Дайте адресок где можно скачать исходые тексты на API


14-14275
Anatoly Shkodin
2002-08-10 11:42
2002.09.05
QII и QIII


3-13901
Sedunov Vitaly
2002-08-14 17:46
2002.09.05
Обновление данных при помощи ClientDataSet




   Наверх