Форум: "Начинающим";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];
Вниз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 как-то странно… Сообщение есть, а отправителя нет…
ЗЫ
Понято что если компонент написан через ж. то такое может случится… Но стоит ли на это ассчитывать?
← →
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);
Я в жиси не напишу, бо экшен на то и нужен, что я не должен знать как работает и где находится его код… Я его запускаю (Execute) и все.
2. OnClick(nil) тем более не напишу, бо елси код нужен в нескольких местах я сделаю Extract Method…
3. И остался случай — это когда из библиотеке пришел nil Sender — ну это значит хреновая библиотека…
Граблей еще ни разу небыло…
Видимо надо проверять от греха подальше…:)
← →
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]Дык генерится то меню динамически. И смысла в экшенах я не вижу.
Я для этих целей сдела компонент дин. меню. У него есть методы для постороения меню. Дал стрингы, и оно(меняю) само подобавляло айтимы.
И одно событие «нажали на динамически сгенеренный айтим».
Как тут помогут экшены — хз. Они для дизайн тайма хороши…
← →
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 и тоже экшен? А какой?
Ну допустим назначили, а что он еще где-то будет использоваться? Нет конечно… Ну и смысл в чем?
← →
Игорь Шевченко © (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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.038 c