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) ..

Foi útil?

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 ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top