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

Вниз

PopupMenu - определить какой Item вызвал событие OnClik   Найти похожие ветки 

 
Gavrila   (2008-03-26 13:37) [0]

Всем добрый день. Подскажите, плз, по следующему вопросу:

popupmenu состоит из динамически изменяемых Items, у всех на событие OnClik стоит одна процедура:

Procedure TForm1.PM_OnClik(Sender: TObject);
Begin
...
End;

как внутри PM_OnClik узнать какой именно Item(Name) вызвал событие?


 
tesseract ©   (2008-03-26 13:46) [1]


> как внутри PM_OnClik узнать какой именно Item(Name) вызвал
> событие?


TMyItem(Sender).Name;


 
Gavrila   (2008-03-26 14:00) [2]


> tesseract ©   (26.03.08 13:46) [1]
>
> TMyItem(Sender).Name;


Спасибо большое, получилось


 
Ega23 ©   (2008-03-26 15:03) [3]


> TMyItem(Sender).Name;


ЕМНИП, в качестве Sender может Action вернуться. Так что аккуратнее с этим...


 
tesseract ©   (2008-03-26 15:15) [4]


> ЕМНИП, в качестве Sender может Action вернуться. Так что
> аккуратнее с этим...


Там что хошь может вернуться. Проверка на класс остаёться домашним заданием :-).


 
Плохиш ©   (2008-03-26 15:20) [5]


> Проверка на класс остаёться домашним заданием

и на нил тоже ;-)


 
Kolan ©   (2008-03-26 15:50) [6]

Честно говоря никогда не проверял на нил Sender как-то странно&#133 Сообщение есть, а отправителя нет&#133

ЗЫ
 Понято что если компонент написан через ж. то такое может случится&#133 Но стоит ли на это ассчитывать?


 
Ega23 ©   (2008-03-26 15:56) [7]


> Честно говоря никогда не проверял на нил Sender как-то странно…
> Сообщение есть, а отправителя нет…


????
myAction : TAction;
.....

myAction.OnExecute(nil);


 
Kolan ©   (2008-03-26 16:18) [8]

> myAction.OnExecute(nil);


А так никак нельзя?
myAction.Execute
?


 
Плохиш ©   (2008-03-26 16:26) [9]


> Kolan ©   (26.03.08 15:50) [6]
> Честно говоря никогда не проверял на нил Sender

Собственно, меня это у тебя как-то и не удивляет.


 
Ega23 ©   (2008-03-26 16:27) [10]


> myAction.Execute


Я сейчас точно не вспомню, но какие-то проблемы с этим были.


 
Ega23 ©   (2008-03-26 16:29) [11]

Короче, не в Action-ах дело.
А в том, что смотреть Sender у TMenuItem.OnClick - дело опасное.


 
Kolan ©   (2008-03-26 17:54) [12]

> Собственно, меня это у тебя как-то и не удивляет.

Почему это вдруг?


 
Kolan ©   (2008-03-26 17:55) [13]

> myAction.OnExecute(nil);

То есть ессно про такой вариант развитя событий я знаю, это и имел ввиду в ЗЫ[6]


 
Kolan ©   (2008-03-26 18:03) [14]

Есть варик решения, который я использую.

Если у нас есть списочег объектов предм. области и он отображен в виде меню(динамически), и по клику надо что то сделать, то я обычно пользую Tag.

Меню же мы сами генерим, так что его можно задать.

Что-то вроде:
var
 I: Integer;
 TempMenuItem: TMenuItem;
begin
 if Assigned(TheItems) then
 begin
   for I := 0 to TheItems.Count — 1 do
   begin
     TempMenuItem := AddDynamicItem(Section, TheItems[I]);
     TempMenuItem.Tag := I;
   end;
 end;
end;


А потом в этом обработчике вызывается функция procedure DoSmth(AObjectID: Integer);
куда и передается этот тэг.


 
{RASkov} ©   (2008-03-26 18:09) [15]

> [14] Kolan ©   (26.03.08 18:03)
> Есть варик решения, который я использую.

Вариантов - море. Начиная от нормальных и заканчивая извращенными. Но Sender=nil - это нормально :)


 
Kolan ©   (2008-03-26 18:18) [16]

> Но Sender=nil — это нормально :)

Если я пишу процедуру, куда передается объект, то в 99% случаев в первых строка проверяется что он Assugned. Но только не в случае с Sender у компонент. То, что он нил просто не может быть, так как:

Так:
1. myAction.OnExecute(nil);
  Я в жиси не напишу, бо экшен на то и нужен, что я не должен знать как работает и где находится его код&#133 Я его запускаю (Execute) и все.

2. OnClick(nil) тем более не напишу, бо елси код нужен в нескольких местах я сделаю Extract Method&#133

3. И остался случай — это когда из библиотеке пришел nil Sender — ну это значит хреновая библиотека&#133

Граблей еще ни разу небыло&#133

Видимо надо проверять от греха подальше&#133:)


 
Kolan ©   (2008-03-26 18:19) [17]

> жиси

жизни

я такого не писал, это все клиент :)


 
Ega23 ©   (2008-03-26 18:20) [18]


> Kolan ©   (26.03.08 18:03) [14]
>
> Есть варик решения, который я использую.


Я бы всё-таки на Action-ы заложился. Единожды их оформив, ты их не только в Main-menu, но и в PopupMenu, и на тулбаре использовать можешь. А Tag - он и у Action имеется.
Да, и единый OnExecute им всем присвоить, типа
procedure OnMyActionExecute(Sender : TObject);
begin
 if Assigned(Sender) then
   if (Sender is TAction) then
     DoSmth(TAction(Sender).Tag);
end;


 
Kolan ©   (2008-03-26 18:32) [19]

Дык генерится то меню динамически. И смысла в экшенах я не вижу.
Я для этих целей сдела компонент дин. меню. У него есть методы для постороения меню. Дал стрингы, и оно(меняю) само подобавляло айтимы.
И одно событие «нажали на динамически сгенеренный айтим».

Как тут помогут экшены — хз. Они для дизайн тайма хороши&#133


 
Ega23 ©   (2008-03-26 19:01) [20]


> Как тут помогут экшены — хз. Они для дизайн тайма хороши…


А очень просто. Ты единожды создав набор action-ов (Caption, Hint, ImageIndex) получаешь однотипные действия и из главного меню, и из любых popup, и из тулбара, и из чего-нибудь ещё.
А теперь секи момент: надо в одном состоянии программы запретить какое-то действие, а в другом - разрешить. Так тебе нужно либо в обработчиках это состояние проверять, либо запрещать действия и на главном меню и (тот же список).
А в случае экшена - Action.Enable. И всё. Он станет Enable(disable) во всех местах, где используется.


 
Kolan ©   (2008-03-27 10:25) [21]

> [20] Ega23 ©   (26.03.08 19:01)

Это, я знаю зачем нужны экшены.


> А теперь секи момент: надо в одном состоянии программы запретить
> какое-то действие, а в другом — разрешить.
>А в случае экшена — Action.Enable

Я, если действительно состояние меняется значительно, обычно присвоения Action.Enable тид засовываю в объект. Типа «перспективы» получается.

Но ты объясни как ты «получаешь однотипные действия и из главного меню, и из любых popup, и из тулбара, и из чего-нибудь ещё» при дин. генерации.
Что всем им назначить 1 и тоже экшен? А какой?
Ну допустим назначили, а что он еще где-то будет использоваться? Нет конечно&#133 Ну и смысл в чем?


 
Игорь Шевченко ©   (2008-03-27 11:27) [22]

Ega23 ©   (26.03.08 16:29) [11]


> А в том, что смотреть Sender у TMenuItem.OnClick - дело
> опасное.


Олег, не пугай народ.
Ничего опасного в этом нет.


 
Ega23 ©   (2008-03-27 11:43) [23]


> Ничего опасного в этом нет.


Не опасное, просто аккуратно надо. И понимать, что делаешь.


 
Игорь Шевченко ©   (2008-03-27 11:46) [24]

Ega23 ©   (27.03.08 11:43) [23]


> просто аккуратно надо. И понимать, что делаешь.


Это не только к проверке Sender в MenuItem.OnClick относится :)


 
Ega23 ©   (2008-03-27 11:58) [25]


> Это не только к проверке Sender в MenuItem.OnClick относится  :)


Само-собой.


 
tesseract ©   (2008-03-27 14:21) [26]


> Что всем им назначить 1 и тоже экшен? А какой? Ну допустим
> назначили, а что он еще где-то будет использоваться? Нет
> конечно… Ну и смысл в чем?


-А суть то где ?
-А суть они в песок.  

Красивость + переносимость кода получаеться. В больших проектах TActionList просто незаменим. Да и в инспекторе действия назначать удобне..


 
korneley ©   (2008-03-27 18:18) [27]


> Ega23 ©   (26.03.08 18:20) [18]

Двумя руками за.

> Дык генерится то меню динамически
> ...
> И одно событие
> ...
> Как тут помогут экшены — хз.
А как и в [18] по тагам. "Динамически" создавая элемент меню, присваивать ему нужный TAction (с тагом), который и определит дальнейшее поведение приложения, в случае OnClick. У этих разных экшенов один обработчик, который по TAction(Sender).Tag и рулит.


 
Семеныч   (2008-03-27 18:26) [28]

Какая содержательная дискуссия...


 
korneley ©   (2008-03-27 19:38) [29]

Удалено модератором
Примечание: Флудить завязываем


 
MsGuns ©   (2008-03-27 20:34) [30]

>korneley ©   (27.03.08 18:18) [27]
>А как и в [18] по тагам. "Динамически" создавая элемент меню, присваивать ему нужный TAction (с тагом), который и определит дальнейшее поведение приложения, в случае OnClick. У этих разных экшенов один обработчик, который по TAction(Sender).Tag и рулит.

Очень недальновидно. Любое изменение в экшнлисте ведет к необходимости правки тэгов, о чем программист, поднявший проект годичной давности, просто может не знать или напрочь забыть.


 
Ega23 ©   (2008-03-27 22:03) [31]

Я вообще-то про динамическое создание экшенов с тагом говорил.


 
korneley ©   (2008-03-27 22:53) [32]


> Любое изменение в экшнлисте ведет...
Какое такое "любое"? Типа, взял, и все теги переопределил? Тогда да. Продолжаю утверждать, что простор для манипуляций, с экшенами побольше: и сам TAction и OnExecute его,  и возможность управлять всеми использующими его (TAction) контролами "одним движением". А по теме, предлагается  не строки сравнивать, а целые. Которые и есть MenuAction.Tag , и при этом неважно даже динамически он (TAcnion) создавался или нет. Семеныч, таки прав. Ходим вокруг одних и тех же яиц и сравниваем их в фас и  в профиль.



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

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

Наверх




Память: 0.55 MB
Время: 0.018 c
3-1196229406
ROMQA
2007-11-28 08:56
2008.04.20
DELPHI SQL запрос в файл!


15-1204884874
matt
2008-03-07 13:14
2008.04.20
Exception Conference #07


2-1204039868
nusik1990
2008-02-26 18:31
2008.04.20
ввод в TEdit


15-1204562520
necromancer
2008-03-03 19:42
2008.04.20
Взятие информации о проигрываемой музыки


2-1206126773
smartleds
2008-03-21 22:12
2008.04.20
Как бы из Сендера индекс текущего компонента получить