2010-01-24 7 views
0

У меня есть меню всплывающего меню в форме (grr, я скорее всего сделаю его динамичным - ненавижу статические инструменты). У него есть Item with SubMenu. SubMenu имеет три элемента меню (класс TMenuItem).TComponet/любой другой суперкласс и его обнаружение дочерних элементов

Мне нужно проверить, взяв параметр Sender в if..then, всякий раз, когда процедура была вызвана элементом с SubMenu или элементами SubMenu.

Я пробовал разные отклонения с приведением типов и суперклассами, но не повезло. Я думаю, что можно что-то вроде этого:

if FindControl(MenuItemWithSubMenu.Handle) = TControl(Sender as TComponent).Parent then ... 

, но, конечно же, с правильной типажей и команды ..

Любые идеи оценили.

Дополнительная информация по запросу сообщества:

Кодекса itsef (если я просто проверить с помощью компонента имя реквизита) выглядит следующим образом:

procedure TForm1.xClick(Sender: TObject); // procedure that has attached onClick from PopupActionBar1 Items 
begin  
if ((TComponent(Sender).Name = 'Unloadresources1') or // PopupActionBar1.Items[3] 
    (TComponent(Sender).Name = 'VKPCache11')  or // PopupActionBar1.Items[3].Items[0] 
    (TComponent(Sender).Name = 'VKPCache21')  or // PopupActionBar1.Items[3].Items[1] 
    (TComponent(Sender).Name = 'AllCache31')  or // PopupActionBar1.Items[3].Items[2] 
    (ActLoadVal = 2)) and (PopupActionBar1.Items[3].Caption = 'Delete VKP Cache') then begin .. end; 
end; 

Проблема заключается в том, что это путь слабого подхода и требует дополнительного кодирования, если пользователь программы хочет добавить/drag'n'drop/insert компонент или элемент управления или объект во время выполнения. Таким образом, сама программа автоматически прекратила бы работу на моем месте - знайте, что звонить и когда :)

Вкл. (Статический) Форма1 является (статическим) PopupActionBar1. Он имеет четыре элемента. Четвертый элемент имеет SubMenu - с тремя элементами.

Оба четвертого элемента с элементами подменю (PopupActionBar1.Items [3]) и три элемента подменю (PopupActionBar1.Items [3] .Items [0 .. 2] Обработчики событий OnClick установлены в процедуру, содержащую оператор If..Then написано выше.

Задача - путем определения параметра Sender и использования его возможностей OOP - проверьте, вызвана ли процедура из PopupActionBar1.Items [3] Элемент меню или его элементы SubMenu (PopupActionBar1.Items [3] .Items [0] или PopupActionBar1.Items [3] .Интемы [1] или PopupActionBar1.Items [3] .Интемы [2]).

Я пробовал различный синтаксис ... также пробовал манипуляции с приведением типов с помощью TControl, TWinControl, TComponent .. (без использования TObject это не имеет родителя (за исключением OLE).

+0

В каком событии находится ваш код? Также я не уверен, чего вы пытаетесь достичь. Не могли бы вы рассказать? –

+1

Каким образом? Код snipp? Диаграмма? –

+0

Пожалуйста, добавьте более сложный код, поскольку ваш вопрос кажется (на основе обсуждения под ответом Сертака) намного сложнее, чем он сформулирован сейчас. –

ответ

2

Вам не нужно искать Предмет, это уже отправитель. То есть вы можете сделать

procedure TForm1.MyItem1Click(Sender: TObject); 
begin 
    if Sender = MyItem1 then 
    [...] 
    else if Sender = MyItem2 then 

Обычно я использую свойство тега, чтобы дифференцировать MenuItem, вызвавший обработчик. Не элегантный, но работает.

procedure TForm1.Item1Click(Sender: TObject); 
begin 
    case TMenuItem(Sender).Tag of 
    0: [..]; 
    1: [..]; 
    [..] 

Надо помнить, чтобы установить OnClick события все пункт меню, чтобы указать на тот же обработчик. Это то, что я не помню, пока не увижу, что щелчок на нем не влияет.

+0

Да, я знаю - это самый простой способ и обеспечивает статическое обнаружение и, следовательно, приложение не имеет назначения и динамики отправителя. Вот ситуации - пользователь добавляет новый элемент путем перетаскивания, - с помощью WM (хакеров и т. Д.), или любым другим способом, с которыми я не справился или просто не могу знать его характеристики без передовых мышей и VCL. WM Processing, но что ANYWAY должен быть обработан одной процедурой. Это причина, по которой мне нужно определить их как дедов/детей родительского TMenuItem. Спасибо за идею тега, но это просто другой способ, и только реальная разница в том, что Tag является общедоступным. :) –

+0

@HX_unbanned: Я до сих пор не понимаю. Было бы полезно, например, если вы обработали клики в обработчике WM_COMMAND, вы могли бы найти элемент «MyItem: = PopupMenu1.FindItem (Message.ItemID, fkCommand);». Но если вы используете обработчик OnClick, то «Sender» * - ваш * Item. –

+0

Да, это мой пункт. Итак, я проверяю, является ли этот Item (= Sender) Item с SubMenus или Item внутри SubMenu :) if..then инструкция в хромовом и базовом (нединамическом) подходе выглядит так: if (ТСотропепЬ (Sender) .Name = 'MenuWithSubMenus') или (ТСотропепЬ (Sender) .Name = 'MenuWithSubMenus_SubMenu1') или ТСотропепЬ (Sender) .Name = 'MenuWithSubMenus_SubMenu2') ... тогда ... Но если я проверяю что Sender является MenuWithSubMenus, или это любой SubMenu из MenuWithSubMenus, я могу получить автоматическое подключение к необходимым предметам, просто назначив событие OnClick во время разработки или времени выполнения. Теперь ясно? –