quarta-feira, 6 de maio de 2009

Exibir itens de MainMenu em TreeView

Bom, certamente alguma vez você já pensou em implementar um módulo de segurança em seu sistema, onde você iria listar todos os itens do seu menu em uma árvore (TreeView) e permitir que um administrador faça a manutenção das permissões, mas como listo todos estes itens do menu no TreeView? É o que veremos agora.

Crie uma nova aplicação e adicione ao formulário os seguintes componentes:
- Um componente MainMenu onde deverá criar uma pequena estrutura de itens, por exemplo:
| Arquivo | Cadastros | Ajuda
:Abrir....|:Cidades...|:Sobre o Sistema
:Salvar...|:Clientes
:Sair.....|:Produtos


- Um Button ao topo do formulário que utilizaremos para a listagem dos itens de menu na TreeView;

- Um componente TreeView que será utilizado para exibir os itens do menu.

Acesse o código da aplicação e faça a declaração da seguinte
procedure que será a encarregada de ler os itens do menu e adicionar os nodes na TreeView:
procedure PreencherMenus(Menu: TMainMenu);

Em seguida, utilizando as teclas Ctrl+Shift+C faça a implementação do procedimento adicionando a ele o código a seguir:
procedure TForm1.PreencherMenus(Menu: TMainMenu);
var
i,j,p,imgS: integer;
a,b: string;
mI,mS: TMenuItem;
n,sn: TTreeNode;
begin
TreeView1.Items.Clear;
sn := nil;
for i := 0 to Menu.Items.Count - 1 do
begin
mI := Menu.Items[i];
a := mI.Caption; // Titulos do menus
p := pos('&',a);
if p > 0 then
Delete(a,p,1);
n := TreeView1.Items.Add(sn,a); //nó
for j := 0 to mI.Count - 1 do
begin
mS := mI.Items[j];
b := mS.Caption; // Titulos dos sub-menus
p := pos('&',b);
if p > 0 then
Delete(b,p,1);
if b <> '-' then
begin
TreeView1.Items.AddChild(n,b);
end;
end;
end;
for I := 0 to TreeView1.Items.Count - 1 do
if TreeView1.Items[i].Level <> 0 then
TreeView1.Items[i].StateIndex := 1;
end;


Implementado o procedimento que lê os itens de menu um a um e cria nós a serem adicionado no TreeView vamos chamar o procedimento no evento OnClick do botão, adicionando a ele o seguinte código:
procedure TForm1.Button1Click(Sender: TObject);
begin
PreencherMenus(MainMenu1);
TreeView1.FullExpand;//Abre toda a lista de itens
end;


Bom, dessa forma você poderá implementar agora sua próprias funcionalidades à sua aplicação integrando os componentes MainMenu e TreeView. Abraço e até o próximo post.

6 comentários:

Marlon disse...

Parabéns, você é fodástico, ia demorar um tempinho fazendo isso...

Vlew

Marlon disse...

kra, tu não é fodastico não, tua função só consegui ir até o primeiro nivel do menu, passou de 1 nivel fudeu. Uma pena, vou fazer ela funcionar. Abraços.

Marlon disse...

Pronto, arrumei. Algo semelhante abaixo cria a treeview recursivamente e com todas as quebras de menu. Abraços.


procedure TfrmAtalhos.CarregaMenu(Menu: TMenuItem;Node: TTreeNode);
Var
iCont : Integer;
NodePai : TTreeNode;
begin
for iCont := 0 to Menu.Count-1 do
begin

NodePai := trvMenus.Items.AddChild(Node,StringReplace(Menu.Items[iCont].Caption,'&','',[rfReplaceAll, rfIgnoreCase]));

if Menu.Items[iCont].Count > 0 then
CarregaMenu(Menu.Items[iCont],NodePai);

end;
end;

Maikel Scheid disse...

Prezado Marlon, acho que dessa vez a questão não foi eu não ser tão "fodástico", mas você poderia ter sido pouco mais esperto e ver o post que fiz logo após a esse que você leu, onde mostrei como ler os itens com o método recursivo.

Veja no link:
http://maikelscheid.blogspot.com/2009/05/exibir-itens-de-mainmenu-em-treeview_06.html

Mesmo assim, vou testar tua função, parece mais simplificada que o método que usei. Um ótimo 2011.

Frederico Brigatte disse...

Como inserir um checkbox no treeview?

Frederico Brigatte disse...

Queria adicionar um checkbox no treeview.