Menu dinâmico

08/12/2003

5

Como faço para associar funções a itens de um menu criado dinamicamente?

Se alguém puder me ajudar, agredeço.

Vivi


Responder

Posts

15/12/2003

Cebikyn

Evento := procedure

ex:
Item.OnClick := procedure;

em que procedure é o nome de uma procedure que tem os mesmos parâmetros do evento que se deseja criar.


Responder

15/12/2003

Nigro

Aqui vão duas dicas que na minha opinião são úteis:
Como adicionar items de menu dinâmicamente
Normalmente nós 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 TMainMenu no form.
2: Faça com que o menu tenha a seguinte estrutura.
Arquivo Editar
Abrir Copiar
Fechar Colar
Fontes
3: Coloque um TButton no form 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 indice começa em 0)
4: Ótimo, mas o que fazer com um item de menu que não tem funcinalidade?
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);

5: Escreva o seguinte código na sua nova procedure;

procedure TfMtCpPrMs.CapturaClick(Sender: TObject);
begin
ShowMessage(´Você escolheu a fonte: ´ + TMenuItem(Sender).Caption);
end;

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

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

7: 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;
------------------------------------------------------------------------------
{ Shows all Menu items from the MenuIndex on right-aligned.}

procedure TForm1.FormCreate(Sender: TObject);
const MenuIndex = 3;
var MII: TMenuItemInfo;
MainMenu: hMenu;
Buffer: array[0..50] of Char;
begin
MainMenu := GetMenu(Handle);
with MII do
begin
cbSize := SizeOf(MII);
fMask := MIIM_TYPE;
dwTypeData := Buffer;
cch := SizeOf(Buffer);
GetMenuItemInfo(MainMenu, MenuIndex, True, MII);
fType := fType or MFT_RIGHTJUSTIFY;
SetMenuItemInfo(MainMenu, MenuIndex, True, MII);
DrawMenuBar(Handle);
end;
end;


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira