TComponet / любой другой суперкласс и обнаружение его дочерних элементов - PullRequest
0 голосов
/ 24 января 2010

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

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

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

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

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

Любые идеи приветствуются.

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

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

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;

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

On (статическая) Form1 является (статической) PopupActionBar1. У него есть четыре предмета. Четвертый пункт имеет SubMenu - с тремя пунктами.

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

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

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

1 Ответ

2 голосов
/ 24 января 2010

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

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

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

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

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

...