Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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 как-то странно&#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.046 c
15-1204975614
Михаил
2008-03-08 14:26
2008.04.20
Диалог выбора типа линии


2-1206508766
@!!ex
2008-03-26 08:19
2008.04.20
Определить, что текущая раскладка Ru или не Ru


15-1203501625
www
2008-02-20 13:00
2008.04.20
как в убунте расшарить папку


15-1204502666
Поп Гапон
2008-03-03 03:04
2008.04.20
А как китайцы набирают текст


15-1204961097
buzb
2008-03-08 10:24
2008.04.20
Где реально можно найти работу для программиста на delphi?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский