![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PopupMenu - определить какой Item вызвал событие OnClik [D7, WinXP]
Gavrila © (2008-03-26 13:37:00)Всем добрый день. Подскажите, плз, по следующему вопросу:
popupmenu состоит из динамически изменяемых Items, у всех на событие OnClik стоит одна процедура:
Procedure TForm1.PM_OnClik(Sender: TObject);
Begin
...
End;
как внутри PM_OnClik узнать какой именно Item(Name) вызвал событие?
korneley (2008-03-27 22:53:00) [1]
> Любое изменение в экшнлисте ведет...
Какое такое "любое"? Типа, взял, и все теги переопределил? Тогда да. Продолжаю утверждать, что простор для манипуляций, с экшенами побольше: и самTActionиOnExecuteего, и возможность управлять всеми использующими его (TAction) контролами "одним движением". А по теме, предлагается не строки сравнивать, а целые. Которые и естьMenuAction.Tag, и при этом неважно даже динамически он (TAcnion) создавался или нет. Семеныч, таки прав. Ходим вокруг одних и тех же яиц и сравниваем их в фас и в профиль.
Ega23 (2008-03-27 22:03:00) [2]Я вообще-то про динамическое создание экшенов с тагом говорил.
MsGuns (2008-03-27 20:34:00) [3]>korneley © (27.03.08 18:18) [27]
>А как и в [18] по тагам. "Динамически" создавая элемент меню, присваивать ему нужный TAction (с тагом), который и определит дальнейшее поведение приложения, в случае OnClick. У этих разных экшенов один обработчик, который по TAction(Sender).Tag и рулит.
Очень недальновидно. Любое изменение в экшнлисте ведет к необходимости правки тэгов, о чем программист, поднявший проект годичной давности, просто может не знать или напрочь забыть.
korneley (2008-03-27 19:38:00) [4]Удалено модератором
Примечание: Флудить завязываем
Семеныч (2008-03-27 18:26:00) [5]Какая содержательная дискуссия...
korneley (2008-03-27 18:18:00) [6]
> Ega23 © (26.03.08 18:20) [18]
Двумя руками за.
> Дык генерится то меню динамически
> ...
> И одно событие
> ...
> Как тут помогут экшены — хз.
А как и в [18] по тагам. "Динамически" создавая элемент меню, присваивать ему нужныйTAction(с тагом), который и определит дальнейшее поведение приложения, в случаеOnClick.У этих разных экшенов один обработчик, который поTAction(Sender).Tagи рулит.
tesseract (2008-03-27 14:21:00) [7]
> Что всем им назначить 1 и тоже экшен? А какой? Ну допустим
> назначили, а что он еще где-то будет использоваться? Нет
> конечно… Ну и смысл в чем?
-А суть то где ?
-А суть они в песок.
Красивость + переносимость кода получаеться. В больших проектах TActionList просто незаменим. Да и в инспекторе действия назначать удобне..
Ega23 (2008-03-27 11:58:00) [8]
> Это не только к проверке Sender в MenuItem.OnClick относится :)
Само-собой.
Игорь Шевченко (2008-03-27 11:46:00) [9]Ega23 © (27.03.08 11:43) [23]
> просто аккуратно надо. И понимать, что делаешь.
Это не только к проверке Sender в MenuItem.OnClick относится :)
Ega23 (2008-03-27 11:43:00) [10]
> Ничего опасного в этом нет.
Не опасное, просто аккуратно надо. И понимать, что делаешь.
Игорь Шевченко (2008-03-27 11:27:00) [11]Ega23 © (26.03.08 16:29) [11]
> А в том, что смотреть Sender у TMenuItem.OnClick - дело
> опасное.
Олег, не пугай народ.
Ничего опасного в этом нет.
Kolan (2008-03-27 10:25:00) [12]> [20] Ega23 © (26.03.08 19:01)
Это, я знаю зачем нужны экшены.
> А теперь секи момент: надо в одном состоянии программы запретить
> какое-то действие, а в другом разрешить.
>А в случае экшена Action.Enable
Я, если действительно состояние меняется значительно, обычно присвоения Action.Enable тид засовываю в объект. Типа «перспективы» получается.
Но ты объясни как ты «получаешь однотипные действия и из главного меню, и из любых popup, и из тулбара, и из чего-нибудь ещё» при дин. генерации.
Что всем им назначить 1 и тоже экшен? А какой?
Ну допустим назначили, а что он еще где-то будет использоваться? Нет конечно Ну и смысл в чем?
Ega23 (2008-03-26 19:01:00) [13]
> Как тут помогут экшены — хз. Они для дизайн тайма хороши…
А очень просто. Ты единожды создав набор action-ов (Caption, Hint, ImageIndex) получаешь однотипные действия и из главного меню, и из любых popup, и из тулбара, и из чего-нибудь ещё.
А теперь секи момент: надо в одном состоянии программы запретить какое-то действие, а в другом - разрешить. Так тебе нужно либо в обработчиках это состояние проверять, либо запрещать действия и на главном меню и (тот же список).
А в случае экшена - Action.Enable. И всё. Он станет Enable(disable) во всех местах, где используется.
Kolan (2008-03-26 18:32:00) [14]Дык генерится то меню динамически. И смысла в экшенах я не вижу.
Я для этих целей сдела компонент дин. меню. У него есть методы для постороения меню. Дал стрингы, и оно(меняю) само подобавляло айтимы.
И однособытие «нажали на динамически сгенеренный айтим».
Как тут помогут экшены хз. Они для дизайн тайма хороши
Ega23 (2008-03-26 18:20:00) [15]
> 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:19:00) [16]> жиси
жизни
я такого не писал, это все клиент :)
Kolan (2008-03-26 18:18:00) [17]> Но Sender=nil это нормально :)
Если я пишу процедуру, куда передается объект, то в 99% случаев в первых строка проверяется что он Assugned. Но только не в случае с Sender у компонент. То, что он нил просто не может быть, так как:
Так:
1. myAction.OnExecute(nil);
Я в жиси не напишу, бо экшен на то и нужен, что я не должен знать как работает и где находится его код Я его запускаю (Execute) и все.
2. OnClick(nil) тем более не напишу, бо елси код нужен в нескольких местах я сделаю Extract Method
3. И остался случай это когда из библиотеке пришел nil Sender ну это значит хреновая библиотека
Граблей еще ни разу небыло
Видимо надо проверять от греха подальше :)
{RASkov} (2008-03-26 18:09:00) [18]> [14] Kolan © (26.03.08 18:03)
> Есть варик решения, который я использую.
Вариантов - море. Начиная от нормальных и заканчивая извращенными. Но Sender=nil - это нормально :)
Kolan (2008-03-26 18:03:00) [19]Есть варик решения, который я использую.
Если у нас есть списочег объектов предм. области и он отображен в виде меню(динамически), и по клику надо что то сделать, то я обычно пользую 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);
куда и передается этот тэг.
Kolan (2008-03-26 17:55:00) [20]> myAction.OnExecute(nil);
То есть ессно про такой вариант развитя событий я знаю, это и имел ввиду в ЗЫ[6]