TCOMPONET / qualquer outra superclasse e sua detecção de itens infantis
Pergunta
Eu tenho controle de menu pop -up no formulário (GRR, provavelmente vou torná -lo dinâmico - odeio ferramentas estáticas). Tem item com submenu. O submenu possui três itens de menu (classe Tmenuitem).
Preciso verificar tomando o param do remetente em if.. então a instrução sempre que o procedimento for chamado pelo item com itens submenu ou submenu.
Tentei vraiações diferentes com operações de tipcasting e superclasse, mas sem sorte. Eu acho que é possível para algo assim:
if FindControl(MenuItemWithSubMenu.Handle) = TControl(Sender as TComponent).Parent then ...
Mas, é claro, com a TypeCasting e comandos corretos.
Quaisquer idéias apreciadas.
Informações adicionais por solicitação da comunidade:
O código itsef (se eu simplesmente verificar por nome de nome do componente) se parece com o seguinte:
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;
O problema é que é um caminho para a abordagem fraca e precisa de codificação adicional se o usuário do Programm quiser adicionar / arrastar o componente ou inserção ou controle ou objeto no Runetime. Dessa maneira
On (estático) Form1 é (estático) PopUpActionBar1. Tem quatro itens. A Forth Item tem submenu - com três itens.
O quarto item com itens de submenu (PopUpActionBar1.Items [3]) e três itens submenu (PopUpActionBar1.Items [3] .Items [0 .. 2] Os manipuladores de eventos ONCLICK estão definidos como procedimentos que contêm se ... a declaração escreveu acima.
Tarefa - aovelando o parâmetro do remetente e usando seus recursos OOP - Verifique se o procedimento foi chamado de PopUpActionBar1.Items [3] Item de menu ou seus itens de submenu (PopUpActionBar1.items [3] .items [0] ou PopUpActionBar1.Items [3] .Items [1] ou PopUpActionBar1.items [3] .items [2]).
Eu tentei várias sintaxes ... também tentei manipulações de tipo de tipo com tcontrol, twincontrol, tcomponent .. (sem uso de tabjos, não tem pai (excl. Ole) ..
Solução
Você não precisa encontrar o item, já é o remetente. Ou seja, você pode fazer
procedure TForm1.MyItem1Click(Sender: TObject);
begin
if Sender = MyItem1 then
[...]
else if Sender = MyItem2 then
Eu geralmente uso a propriedade TAG para diferenciar o menuitem que desencadeou o manipulador. Não é elegante, mas funciona.
procedure TForm1.Item1Click(Sender: TObject);
begin
case TMenuItem(Sender).Tag of
0: [..];
1: [..];
[..]
É preciso lembrar de definir os eventos OnClick do item de todos os itens para apontar para o mesmo manipulador. Isso é algo que não me lembro até ver clicar em um não tem efeito ..