Como transportar itens de um TreeView para um PopupMenu ?
Olá a todos,
Estou precisando preencher um popupMenu com os itens de um TreeView. Detalhe... devo obedecer no popupmenu a hierarquia dos nós do meu treeview, ou seja, quem for um nó pai no treeview deverá ser um menu pai no popupmenu, quem for filho deverá ser filhos e assim por diante.
Quem não entendeu é só falar que eu explico melhor.
Paulo Serra
Estou precisando preencher um popupMenu com os itens de um TreeView. Detalhe... devo obedecer no popupmenu a hierarquia dos nós do meu treeview, ou seja, quem for um nó pai no treeview deverá ser um menu pai no popupmenu, quem for filho deverá ser filhos e assim por diante.
Quem não entendeu é só falar que eu explico melhor.
Paulo Serra
Paulo-serra
Curtidas 0
Respostas
Nerdex
29/09/2005
Se você consegue pegar os dados (Strings) dos nós e dos sub-nós já um bom caminho andado... agora, fique sabendo que o TMainMenu possui métodos capazes de incluir(Insert) e excluir(Delete) itens de um menu...: :o
No exemplo incluirei 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.
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)
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.
5: Escreva o seguinte código na sua nova procedure;
6: Agora associe a procedure CapturaClick ao evento de cada item adicionado;
Adicione a seguinte linha ao laço For;
7: O código de inclusão do item de menu completo fica assim:
Abraço
No exemplo incluirei 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 índice 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; //Atenção, não passe parâmetros para a procedure //Modo incorreto. MainMenu1.Items[1].Items[2].Items[I].OnClick := CapturaClick(Sender);
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;
Abraço
GOSTEI 0
Paulo-serra
29/09/2005
Valeu... na verdade era algo parecido com isso que eu queria. Mas sua dica serviu para eu definir o que eu gostaria realmente.
Valeu mesmo.
Valeu mesmo.
GOSTEI 0
Paulo-serra
29/09/2005
Aê... peguei a dica do LTres e funcionou BLZ.
Cara pelo q entendi voce quer montar um menu como se fosse os nos do TreeView.. Bom ai vai um codigo q fiz q cria os itens de um pop menu exatamente igual ao q esta no TreeView.
var vMenuItens: array of TMenuItem; function CriaMenuItem(node: TTreeNode; menu: TMenuItem): TMenuItem; var n,z: integer; begin z := Length(vMenuItens); SetLength(vMenuItens, z+1); vMenuItens[z] := TMenuItem.Create(Form1); vMenuItens[z].Caption := node.Text; for n:=0 to node.Count-1 do CriaMenuItem(node.Item[n], vMenuItens[z]); Result := nil; if menu = nil then Result := vMenuItens[z] else menu.Add(vMenuItens[z]); end; procedure TForm1.Button1Click(Sender: TObject); var n: integer; begin for n:=0 to TreeView1.Items.Count-1 do begin if TreeView1.Items[n].Level = 0 then PopupMenu1.Items.Add(CriaMenuItem(TreeView1.Items[n], nil)); end; end;
GOSTEI 0