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

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

PopupMenu - определить какой Item вызвал событие OnClik [D7, WinXP]


Страницы:   1 2

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]


Страницы:   1 2

Наверх

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