Como adicionar itens de menu dinamicamente

Veja nesta dica de Adriano Santos, como adicionar dinamicamente itens de menu em um MainMenu.

Como adicionar itens de menu dinamicamente

 

Normalmente criamos nossos menus, diretamente no Delphi em time project. Mas e se por algum motivo quisermos incluir itens em um menu em runtime? Bom, o TMainMenu possui métodos capazes de incluir (Insert) e excluir (Delete) itens de um menu, como fazer isso? Fácil. No exemplo vamos incluir todas as fontes do Windows em um sub-menu.

1. Inicie um novo projeto e inclua um componente MainMenu no formulário.

2. Faça com que o menu tenha a seguinte estrutura.

Arquivo Editar

Abrir   Copiar

Fechar Colar

  Fontes

 

3. Coloque um Button no formulário e inclua o seguinte código no evento OnClick do mesmo.

 

procedure TfMtCpPrMs.Button1Click(Sender: TObject);

var

  I: Integer;

  NovoItem: TMenuItem;

begin

  for I := 0 to Screen.Fonts.Count - 1 do

  begin

NovoItem := TMenuItem.Create(MainMenu1);

NovoItem.Caption := Screen.Fonts[I];

MainMenu1.Items[1].Items[2].Insert(I, NovoItem);

  end;

  NovoItem.Free;

end;

 

Bom, beleza o menu será criado. Na linha MainMenu1.Items[1].Items[2].Insert(I,NovoItem);

Existe uma lógica, veja:

 

  MainMenu1.Items[1] = Menu Editar

  MainMenu1.Items[1].Items[2] = Item 3 de menu Editar, no caso Fontes

 

(Lembre-se que o índice começa em 0).

Ótimo, mas o que fazer com um item de menu que não tem funcionalidade? Para que nosso exemplo faça sentido, precisamos que o item clicado execute alguma ação. Para isso no momento da criação é necessário associar ao evento OnClick do mesmo uma ação, no nosso caso vamos criar uma procedure para ele. Crie uma procedure na área publica ou privada do seu form, algo como.

 

procedure CapturaClick(Sender: TObject);

 

Escreva o seguinte código na sua nova procedure;

 

procedure TfMtCpPrMs.CapturaClick(Sender: TObject);

begin

  ShowMessage('Você escolheu a fonte: ' + TMenuItem(Sender).Caption);

end;

 

Agora associe a procedure CapturaClick ao evento de cada item adicionado. Adicione a seguinte linha ao laço For;

 

//Atenção, não passe parâmetros para a procedure

MainMenu1.Items[1].Items[2].Items[I].OnClick := CapturaClick;

 

//Modo incorreto.

MainMenu1.Items[1].Items[2].Items[I].OnClick := CapturaClick(Sender);

 

O código de inclusão do item de menu completo fica assim:

 

procedure TfMtCpPrMs.Button1Click(Sender: TObject);

var

  I: Integer;

  NovoItem: TMenuItem;

begin

  for I := 0 to Screen.Fonts.Count - 1 do

  begin

NovoItem := TMenuItem.Create(MainMenu1);

NovoItem.Caption := Screen.Fonts[I];

MainMenu1.Items[1].Items[2].Insert(I, NovoItem);

MainMenu1.Items[1].Items[2].Items[I].OnClick := CapturaClick;

  end;

  NovoItem.Free;

end;

 

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados