Gravar em banco itens do MainMenu
Estou precisando muito de uma ajuda. Preciso gravar numa tabela os itens e os subitens do MainMenu. Alguém poderia me ajudar, por favor?
Frederico Brigatte***
Respostas
Frederico Brigatte***
11/09/2011
Estou precisando muito de uma ajuda. Preciso gravar numa tabela os itens e os subitens do MainMenu. Alguém poderia me ajudar, por favor?
E como também montar o TreeView com os dados do banco?
Ninguém pra ajudar?
Gustavo Bretas
11/09/2011
Fiz um exemplo do looping, que é o caminho das pedras, mas você terá que criar o script para a gravação!
procedure TForm2.mtdLoopingRecursivo(aoMenuItem: TMenuItem);var i: Integer;begin for i := 0 to aoMenuItem.Count -1 do begin aoMenuItem.Items[i].Checked := not aoMenuItem.Items[i].Checked; // -> No lugar da linha acima, vc faz a rotina de acesso ao BD mtdLoopingRecursivo(aoMenuItem.Items[i]); end;end;
procedure TForm2.mtdMenuItemToTreeView(aoMenuItem: TMenuItem; aoNode : TTreeNode);var I: Integer;begin for I := 0 to aoMenuItem.Count -1 do begin mtdMenuItemToTreeView(aoMenuItem.Items[i], TreeView1.Items.AddChild(aoNode, AnsiReplaceStr(aoMenuItem.Items[i].Caption, '&', EmptyStr))); end;end;
E as Chamadas
procedure TForm2.btnArvoreClick(Sender: TObject);begin TreeView1.Items.Clear; mtdMenuItemToTreeView(MainMenu1.Items, nil);end; procedure TForm2.btnLoopingClick(Sender: TObject);begin mtdLoopingRecursivo(MainMenu1.Items);end;
Abraço!
Frederico Brigatte***
11/09/2011
Fiz um exemplo do looping, que é o caminho das pedras, mas você terá que criar o script para a gravação!
procedure TForm2.mtdLoopingRecursivo(aoMenuItem: TMenuItem);var i: Integer;begin for i := 0 to aoMenuItem.Count -1 do begin aoMenuItem.Items[i].Checked := not aoMenuItem.Items[i].Checked; // -> No lugar da linha acima, vc faz a rotina de acesso ao BD mtdLoopingRecursivo(aoMenuItem.Items[i]); end;end;
procedure TForm2.mtdMenuItemToTreeView(aoMenuItem: TMenuItem; aoNode : TTreeNode);var I: Integer;begin for I := 0 to aoMenuItem.Count -1 do begin mtdMenuItemToTreeView(aoMenuItem.Items[i], TreeView1.Items.AddChild(aoNode, AnsiReplaceStr(aoMenuItem.Items[i].Caption, '&', EmptyStr))); end;end;
E as Chamadas
procedure TForm2.btnArvoreClick(Sender: TObject);begin TreeView1.Items.Clear; mtdMenuItemToTreeView(MainMenu1.Items, nil);end; procedure TForm2.btnLoopingClick(Sender: TObject);begin mtdLoopingRecursivo(MainMenu1.Items);end;
Abraço!
Obrigado, Gustavo, pela resposta.
Não entendi essa parte:
for i := 0 to aoMenuItem.Count -1 do begin aoMenuItem.Items[i].Checked := not aoMenuItem.Items[i].Checked; // -> No lugar da linha acima, vc faz a rotina de acesso ao BD - Aqui uso a parte que grava no banco?
mtdLoopingRecursivo(aoMenuItem.Items[i]); end;
Tem como dar mais esse help? E como posso montar a tabela para a gravação?
Uso essa rotina para gravar:
dmData.Clientes.Open;
dmData.Clientes.Append;
dmData.ClientesDATACAD.AsString := Data_Cad.Text;
dmData.Clientes.Post;
showMessage('Inclusão efetuada com sucesso !');
dmData.Clientes.Close;
LimpaTela;
Gustavo Bretas
11/09/2011
Então, abrir e fechar um dataset a cada "passada" do looping não é um bom negócio, vc vai complicar a vida do seu servidor de banco... rs!
Esse script que vc colocou é só um exemplo?
dmData.Clientes.Append;
dmData.ClientesDATACAD.AsString := Data_Cad.Text;
dmData.Clientes.Post;
showMessage('Inclusão efetuada com sucesso !');
dmData.Clientes.Close;
LimpaTela;
Bom, no primeiro tópico vc disse que precisava gravar os Menus no banco, agora para te ajudar eu preciso que vc seja mais claro no que vc quer!
Frederico Brigatte***
11/09/2011
Então, abrir e fechar um dataset a cada "passada" do looping não é um bom negócio, vc vai complicar a vida do seu servidor de banco... rs!
Esse script que vc colocou é só um exemplo?
dmData.Clientes.Append;
dmData.ClientesDATACAD.AsString := Data_Cad.Text;
dmData.Clientes.Post;
showMessage('Inclusão efetuada com sucesso !');
dmData.Clientes.Close;
LimpaTela;
Bom, no primeiro tópico vc disse que precisava gravar os Menus no banco, agora para te ajudar eu preciso que vc seja mais claro no que vc quer!
Esse é um exemplo de como gravo numa tabela, rs.
Preciso saber como eu gravo na tabela os itens do menu usando a rotina que você me passou. Não entendi direito como fazer a linha em vermelho.
for i := 0 to aoMenuItem.Count -1 do begin aoMenuItem.Items[i].Checked := not aoMenuItem.Items[i].Checked; // -> No lugar da linha acima, vc faz a rotina de acesso ao BD
mtdLoopingRecursivo(aoMenuItem.Items[i]); end;
O que eu quero fazer, é gravar os menus e sub-menus numa tabela e depois montar num treeview, é isso que preciso, fui claro agora? É para fazer um controle de acesso para usuários.
Usuário Fulano, tem acesso ao Menu X, Y e Z. Usuário Y tem acesso somente ao Menu X. Desculpa se não fui claro.
Frederico Brigatte***
11/09/2011
Então, abrir e fechar um dataset a cada "passada" do looping não é um bom negócio, vc vai complicar a vida do seu servidor de banco... rs!
Esse script que vc colocou é só um exemplo?
dmData.Clientes.Append;
dmData.ClientesDATACAD.AsString := Data_Cad.Text;
dmData.Clientes.Post;
showMessage('Inclusão efetuada com sucesso !');
dmData.Clientes.Close;
LimpaTela;
Bom, no primeiro tópico vc disse que precisava gravar os Menus no banco, agora para te ajudar eu preciso que vc seja mais claro no que vc quer!
Esse é um exemplo de como gravo numa tabela, rs.
Preciso saber como eu gravo na tabela os itens do menu usando a rotina que você me passou. Não entendi direito como fazer a linha em vermelho.
for i := 0 to aoMenuItem.Count -1 do begin aoMenuItem.Items[i].Checked := not aoMenuItem.Items[i].Checked; // -> No lugar da linha acima, vc faz a rotina de acesso ao BD
mtdLoopingRecursivo(aoMenuItem.Items[i]); end;
O que eu quero fazer, é gravar os menus e sub-menus numa tabela e depois montar num treeview, é isso que preciso, fui claro agora? É para fazer um controle de acesso para usuários.
Usuário Fulano, tem acesso ao Menu X, Y e Z. Usuário Y tem acesso somente ao Menu X. Desculpa se não fui claro.
Agora expliquei melhor, rs?
Gustavo Bretas
11/09/2011
Isso facilita a vida de quem quer te ajudar, ok?
Muito bem, voltando ao procedimento.
Presumo que vc tenha criado a estrutura que vai armazenar os menus, então vc pega o DataSet da tabela, e substitui o comando na função, só que vc abre o dataset fora do looping.
DataSet.Open;for i := 0 to aoMenuItem.Count -1 dobegin DataSet.Append; DataSetNome.AsString := aoMenuItem.Items[i].Name; DataSetCaption.AsString := aoMenuItem.Items[i].Caption; // Se tiver mais campos, coloque aqui DataSet.Post; mtdLoopingRecursivo(aoMenuItem.Items[i]);end;DataSet.ApplyUpdates(0);
Frederico Brigatte***
11/09/2011
Isso facilita a vida de quem quer te ajudar, ok?
Muito bem, voltando ao procedimento.
Presumo que vc tenha criado a estrutura que vai armazenar os menus, então vc pega o DataSet da tabela, e substitui o comando na função, só que vc abre o dataset fora do looping.
DataSet.Open;for i := 0 to aoMenuItem.Count -1 dobegin DataSet.Append; DataSetNome.AsString := aoMenuItem.Items[i].Name; DataSetCaption.AsString := aoMenuItem.Items[i].Caption; // Se tiver mais campos, coloque aqui DataSet.Post; mtdLoopingRecursivo(aoMenuItem.Items[i]);end;DataSet.ApplyUpdates(0);
Vc quis dizer a tabela? Não, poderia me ajudar tbém qto a isso. Montar a tabela é uma das dúvidas. Queria montar uma tabela que não precisasse toda hora que criasse um item novo, criar um campo também.
Frederico Brigatte***
11/09/2011
Então, abrir e fechar um dataset a cada "passada" do looping não é um bom negócio, vc vai complicar a vida do seu servidor de banco... rs!
Esse script que vc colocou é só um exemplo?
dmData.Clientes.Append;
dmData.ClientesDATACAD.AsString := Data_Cad.Text;
dmData.Clientes.Post;
showMessage('Inclusão efetuada com sucesso !');
dmData.Clientes.Close;
LimpaTela;
Bom, no primeiro tópico vc disse que precisava gravar os Menus no banco, agora para te ajudar eu preciso que vc seja mais claro no que vc quer!
Esse é um exemplo de como gravo numa tabela, rs.
Preciso saber como eu gravo na tabela os itens do menu usando a rotina que você me passou. Não entendi direito como fazer a linha em vermelho.
for i := 0 to aoMenuItem.Count -1 do begin aoMenuItem.Items[i].Checked := not aoMenuItem.Items[i].Checked; // -> No lugar da linha acima, vc faz a rotina de acesso ao BD
mtdLoopingRecursivo(aoMenuItem.Items[i]); end;
O que eu quero fazer, é gravar os menus e sub-menus numa tabela e depois montar num treeview, é isso que preciso, fui claro agora? É para fazer um controle de acesso para usuários.
Usuário Fulano, tem acesso ao Menu X, Y e Z. Usuário Y tem acesso somente ao Menu X. Desculpa se não fui claro.
Foi mal, Gustavo. Desculpa, concordo com vc. Se não explico direito o que quero, fica difícil de ajudar mesmo. Agora fui mais claro?
Vc quis dizer a tabela? Não, poderia me ajudar tbém qto a isso. Montar a tabela é uma das dúvidas. Queria montar uma tabela que não precisasse toda hora que criasse um item novo, criar um campo também.
Gustavo Bretas
11/09/2011
Frederico Brigatte***
11/09/2011
Access
Frederico Brigatte***
11/09/2011
Access
Pode ser o script que monto aqui. Meu email é: frederico.brigatte@itelefonica.com.br caso queira contato além daqui.
Gustavo, agradeço pela ajuda, ok? Sem sua ajuda, não sei o que faria.
Gustavo Bretas
11/09/2011
Mas antes, vc já pesquisou sobre o componente UserControl? Eu nunca usei, mas vejo o pessoal falar bem dele, tem um tutorial aqui no DevMedia
https://www.devmedia.com.br/post-14827-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-1-3.htmlhttp://www.devmedia.com.br/post-14828-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-2-3-.htmlhttps://www.devmedia.com.br/post-14829-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-3-3--[FINAL].html
No PlanteDelphi tbm tem um tutorial pra usar elehttp://www.planetadelphi.com.br/ver_artigo.php?id=132http://www.planetadelphi.com.br/ver_artigo.php?id=133http://www.planetadelphi.com.br/ver_artigo.php?id=134http://www.planetadelphi.com.br/ver_artigo.php?id=135
Frederico Brigatte***
11/09/2011
Mas antes, vc já pesquisou sobre o componente UserControl? Eu nunca usei, mas vejo o pessoal falar bem dele, tem um tutorial aqui no DevMedia
https://www.devmedia.com.br/post-14827-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-1-3.htmlhttp://www.devmedia.com.br/post-14828-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-2-3-.htmlhttps://www.devmedia.com.br/post-14829-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-3-3--[FINAL].html
No PlanteDelphi tbm tem um tutorial pra usar elehttp://www.planetadelphi.com.br/ver_artigo.php?id=132http://www.planetadelphi.com.br/ver_artigo.php?id=133http://www.planetadelphi.com.br/ver_artigo.php?id=134http://www.planetadelphi.com.br/ver_artigo.php?id=135
Vou verificar os link, agradeço a dica. Ok, pode ser desse jeito eu adapto para o access, ok?
Frederico Brigatte***
11/09/2011
Mas antes, vc já pesquisou sobre o componente UserControl? Eu nunca usei, mas vejo o pessoal falar bem dele, tem um tutorial aqui no DevMedia
https://www.devmedia.com.br/post-14827-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-1-3.htmlhttp://www.devmedia.com.br/post-14828-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-2-3-.htmlhttps://www.devmedia.com.br/post-14829-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-3-3--[FINAL].html
No PlanteDelphi tbm tem um tutorial pra usar elehttp://www.planetadelphi.com.br/ver_artigo.php?id=132http://www.planetadelphi.com.br/ver_artigo.php?id=133http://www.planetadelphi.com.br/ver_artigo.php?id=134http://www.planetadelphi.com.br/ver_artigo.php?id=135
Vou verificar os link, agradeço a dica. Ok, pode ser desse jeito eu adapto para o access, ok?
E também quero aprender como fazer isso.
Frederico Brigatte***
11/09/2011
Mas antes, vc já pesquisou sobre o componente UserControl? Eu nunca usei, mas vejo o pessoal falar bem dele, tem um tutorial aqui no DevMedia
https://www.devmedia.com.br/post-14827-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-1-3.htmlhttp://www.devmedia.com.br/post-14828-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-2-3-.htmlhttps://www.devmedia.com.br/post-14829-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-3-3--[FINAL].html
No PlanteDelphi tbm tem um tutorial pra usar elehttp://www.planetadelphi.com.br/ver_artigo.php?id=132http://www.planetadelphi.com.br/ver_artigo.php?id=133http://www.planetadelphi.com.br/ver_artigo.php?id=134http://www.planetadelphi.com.br/ver_artigo.php?id=135
Vou verificar os link, agradeço a dica. Ok, pode ser desse jeito eu adapto para o access, ok?
E também quero aprender como fazer isso.
Gustavo, criei uma tabela com o nome de Menu e coloquei os campos:
Menu_Código: Número e como chave
Menu_Caption: Texto
Menu_Name: Texto
Menu_Tag: Número
Até que deu certo. Mas se deixo o campo Menu_Código como chave da duplicado, pois, estou gravando no campo Menu_Código sua Tag. Tá certo assim? Que dica vc me dá? E como monto o TreeView com os dados gravados? Faltou isso.
Frederico Brigatte***
11/09/2011
Mas antes, vc já pesquisou sobre o componente UserControl? Eu nunca usei, mas vejo o pessoal falar bem dele, tem um tutorial aqui no DevMedia
https://www.devmedia.com.br/post-14827-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-1-3.htmlhttp://www.devmedia.com.br/post-14828-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-2-3-.htmlhttps://www.devmedia.com.br/post-14829-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-3-3--[FINAL].html
No PlanteDelphi tbm tem um tutorial pra usar elehttp://www.planetadelphi.com.br/ver_artigo.php?id=132http://www.planetadelphi.com.br/ver_artigo.php?id=133http://www.planetadelphi.com.br/ver_artigo.php?id=134http://www.planetadelphi.com.br/ver_artigo.php?id=135
Vou verificar os link, agradeço a dica. Ok, pode ser desse jeito eu adapto para o access, ok?
E também quero aprender como fazer isso.
Gustavo, criei uma tabela com o nome de Menu e coloquei os campos:
Menu_Código: Número e como chave
Menu_Caption: Texto
Menu_Name: Texto
Menu_Tag: Número
Até que deu certo. Mas se deixo o campo Menu_Código como chave da duplicado, pois, estou gravando no campo Menu_Código sua Tag. Tá certo assim? Que dica vc me dá? E como monto o TreeView com os dados gravados? Faltou isso. To complicando?
Oi, Gustavo, esqueceu de mim, rs?
Frederico Brigatte***
11/09/2011
Mas antes, vc já pesquisou sobre o componente UserControl? Eu nunca usei, mas vejo o pessoal falar bem dele, tem um tutorial aqui no DevMedia
https://www.devmedia.com.br/post-14827-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-1-3.htmlhttp://www.devmedia.com.br/post-14828-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-2-3-.htmlhttps://www.devmedia.com.br/post-14829-Instalando-e-compreendendo-o-componente-UserControls-no-Delphi-7--PARTE-3-3--[FINAL].html
No PlanteDelphi tbm tem um tutorial pra usar elehttp://www.planetadelphi.com.br/ver_artigo.php?id=132http://www.planetadelphi.com.br/ver_artigo.php?id=133http://www.planetadelphi.com.br/ver_artigo.php?id=134http://www.planetadelphi.com.br/ver_artigo.php?id=135
Vou verificar os link, agradeço a dica. Ok, pode ser desse jeito eu adapto para o access, ok?
E também quero aprender como fazer isso.
Gustavo, criei uma tabela com o nome de Menu e coloquei os campos:
Menu_Código: Número e como chave
Menu_Caption: Texto
Menu_Name: Texto
Menu_Tag: Número
Até que deu certo. Mas se deixo o campo Menu_Código como chave da duplicado, pois, estou gravando no campo Menu_Código sua Tag. Tá certo assim? Que dica vc me dá? E como monto o TreeView com os dados gravados? Faltou isso. To complicando?
Oi, Gustavo, esqueceu de mim, rs?
O que acontece? Tava indo bem...
Gustavo Bretas
11/09/2011
Gustavo, criei uma tabela com o nome de Menu e coloquei os campos:
Menu_Código: Número e como chave
Menu_Caption: Texto
Menu_Name: Texto
Menu_Tag: Número
Até que deu certo. Mas se deixo o campo Menu_Código como chave da duplicado, pois, estou gravando no campo Menu_Código sua Tag. Tá certo assim? Que dica vc me dá? E como monto o TreeView com os dados gravados? Faltou isso. To complicando?
Oi, Gustavo, esqueceu de mim, rs?
O que acontece? Tava indo bem...
E ae Frederico, desculpa, foi um misto de coisas... rs! Esqueci de você, correria no trampo, e como o fórum não avisa quando alguém responde o post, passou batido... rs!
Mas então, no seu caso estou pensando em algo mais simples, para não te confundir.
Então vc pode eliminar os campo Codigo e Tag, vc vai usar somente os campos Name e Caption.
Vamos fazer um negocio simples e um pouco dinânmico, vc não precisará criar o registro na tabela toda vez que criar um novo menu!
Bom, para montar a TreeView vamos usar aquele primeiro Script que te passei, só melhora-lo um pouco para vincularmos o nó da TreeView ao Menu.
Vc vai controlar o acesso direto ao usuário, ou pretende criar Perfis?
Obs: Quando for responder, evitar "Citar" mensagem anterior completa, senão o Post vira uma linguiça só! rs...
Frederico Brigatte***
11/09/2011
Frederico Brigatte***
11/09/2011
Fique a vontade em escolher o melhor meio de comunicação.
Obrigado pela ajuda que está dando, Gustavo. Obrigado mesmo.
Gustavo Bretas
11/09/2011
Cara, vou te dar uma dica, nesse novo jeito de postar no fórum, evita digitar as coisa direto la no campo, ja é a segunda vez que a página da um refresh sozinha e limpou tudo que eu escrivi... rs!
Mas etnão, não acho que manter as duas formas seja um bom negocio, certeza que o usuário vai sempre configurar o perfil direto no usuário, isso se persarmos que tem os dois, quando tem só um, é aquele que ele vai usar e não tem conversa... rs! Só vai confundir a cabeça do povo!
Mas para escolher depende de alguns fatores:
1º As funções do usuário são bem definidas?
2º Muitos usuários terão o mesmo tipo de acesso?
3º O usuário no sistema é equivalente a um funcionário?
4º Tem muita rotativade de usuário? (Entra e sai da empresa, ou frequencia de troca de setor, e acesso)
Frederico Brigatte***
11/09/2011
Como assim? Não entendi.
2º Muitos usuários terão o mesmo tipo de acesso?
Pode acontecer.
3º O usuário no sistema é equivalente a um funcionário?
Sim.
4º Tem muita rotativade de usuário? (Entra e sai da empresa, ou frequencia de troca de setor, e acesso)
Ter a possibilidade de alteração do acesso e exclusão de usuário.
Quero fazer um sistema de acesso completo.
Frederico Brigatte***
11/09/2011
Gustavo Bretas
11/09/2011
Cara, vc esta perdido e meio... rs! (Brincadeira)
Então, do jeito que estamos fazendo aqui, vamos terminar esse controle de acesso próximo da Copa... rs!
Como vc tem muitas dúvidas de como fazer, então segue o tutorial abaixo na integra, la esta bem definido, e vc vai se familiarizando com o assunto!
No próximo controle de acesso que vc for fazer, garanto que ja estará apto a fazer do seu jeito!
http://www.planetadelphi.com.br/ver_artigo.php?id=133
http://www.planetadelphi.com.br/ver_artigo.php?id=134
http://www.planetadelphi.com.br/ver_artigo.php?id=135
Frederico Brigatte***
11/09/2011
Nesse link que vc me passou ta usando o UserControl, né? O que estou querendo é paracido com o UserControl, só que eu quero aprender como faz, é isso que quero. Me ajuda a montar o TreeView com os dados do banco por enquanto.
Frederico Brigatte***
11/09/2011
Frederico Brigatte***
11/09/2011
Frederico Brigatte***
11/09/2011
Pra acabar com a novela, rs, me ajuda então a gravar os dados do menu numa tabela e depois a montá-lo num treeview, com essa rotina que vc passou. Minha dúvida é como saber quem é o pai e quem é o filho na hora de montar o treeview pelo banco. É isso que quero, pra acabar com isso, rs.
Frederico Brigatte***
11/09/2011
Criei uma tabela com os campos:
Menu_Codigo
Menu_Caption
Menu_Name
Tirei o campo Tag.
Frederico Brigatte***
11/09/2011
procedure TForm1.mtdLoopingRecursivo(aoMenuItem: TMenuItem);
Minha dúvida é: Como montar o treeview com os dados da tabela?
Como adaptar essa rotina:
procedure TForm1.mtdMenuItemToTreeView(aoMenuItem: TMenuItem; aoNode : TTreeNode);
Frederico Brigatte***
11/09/2011
Me ajuda, quero montar o treeview com os dados da tabela.
Menu_Codigo
Menu_Caption
Menu_Name
Menu_Tag
Acho que o campo tag pode excluir, né? Gravei na tabela usando aquela rotina que vc me passou. Agora quero montar o treeview com os dados do banco.
Frederico Brigatte***
11/09/2011
Gustavo Bretas
11/09/2011
Gustavo Bretas
11/09/2011
Certo, vamo la!
Cria o campo Pai com tipo String la na tabela, dai vc alteaa o método que grava para setar o novo campo com:
DataSetNOME_PAI.AsString := aoMenuItem.Name;
Gustavo Bretas
11/09/2011
Vamos a mais uma modificação;
Declare a variável no formulário que a rotina será executada:
public vgoList : TStringList;
O Evento para criar a árvore vc cria essa nova variável:
procedure TForm2.btnArvoreClick(Sender: TObject); begin TreeView1.Items.Clear; if not Assigned(vgoList) then vgoList := TStringList.Create; vgoList.Clear; mtdMenuItemToTreeView(MainMenu1.Items, nil); end;
Gustavo Bretas
11/09/2011
procedure TfrmPrincipal.mtdMenuItemToTreeView(aoMenuItem: TMenuItem; aoNode : TTreeNode); var I: Integer; vloNode : TTreeNode; begin for I := 0 to aoMenuItem.Count -1 do begin vloNode := TreeView.Items.AddChild(aoNode, AnsiReplaceStr(aoMenuItem.Items[i].Caption, "&", EmptyStr)); vgoList.AddObject(vloNode.Text, aoMenuItem[i]); mtdMenuItemToTreeView(aoMenuItem.Items[i], vloNode); end; end;
Gustavo Bretas
11/09/2011
procedure TfrmPrincipal.mtdTreeViewMenuItem(aoTreeView: TTreeView); var I: Integer; begin for I := 0 to aoTreeView.Items.Count - 1 do begin ShowMessage(TMenuItem(vgoList.Objects[vgoList.IndexOf(aoTreeView.Items[i].Text)]).Name); // "update table NomeTabela Set Acesso = Parametro where Nome = " + TMenuItem(vgoList.Objects[vgoList.IndexOf(aoTreeView.Items[i].Text)]).Name; end; end;
Problema dessa função é que se tiver dois menus com o mesmo nome, ele sempre vai trazer o primeiro, sem choro! rs...
Cara, quando eu respondo o post vc recebe algum aviso? Eu não estou recebendo nada aqui!
E me desculpa fazer esse tanto de post, estava dando um erro aqui quando eu colocava o texto todo, o post não esta aceitando apóstrofe!
Frederico Brigatte***
11/09/2011
Frederico Brigatte***
11/09/2011
frederico.brigatte@itelefonica.com.br
Vou tentando fazer aqui também. Fica mais fácil de ter um exemplo pronto pra ver se fiz certo, pode ser?
Frederico Brigatte***
11/09/2011
Não entendi esse trecho:
procedure TfrmPrincipal.mtdTreeViewMenuItem(aoTreeView: TTreeView);
var
I: Integer;
begin
for I := 0 to aoTreeView.Items.Count - 1 do
begin
ShowMessage(TMenuItem(vgoList.Objects[vgoList.IndexOf(aoTreeView.Items[i].Text)]).Name);
// "update table NomeTabela Set Acesso = Parametro where Nome = " + TMenuItem(vgoList.Objects[vgoList.IndexOf(aoTreeView.Items[i].Text)]).Name;
end;
end;
Por isso que to falando pra enviar um exemplo, ok?
Frederico Brigatte***
11/09/2011
"E agora o pulo do gato é o seguinte, a variável vgoList "Linka" a árvore no menu, então para acessar o menu vc faz assim:", rs. Pode me explicar o que ela faz?
Frederico Brigatte***
11/09/2011
Tem como vc dar uma explicada rápida no que faz tudo isso que vc me passou, um passo a passo, por exemplo?
Essa parte eu não entendi:
procedure TfrmPrincipal.mtdTreeViewMenuItem(aoTreeView: TTreeView);
var
I: Integer;
begin
for I := 0 to aoTreeView.Items.Count - 1 do
begin
ShowMessage(TMenuItem(vgoList.Objects[vgoList.IndexOf(aoTreeView.Items[i].Text)]).Name);
// "update table NomeTabela Set Acesso = Parametro where Nome = " + TMenuItem(vgoList.Objects[vgoList.IndexOf(aoTreeView.Items[i].Text)]).Name;
end;
end;
Minha tabela Menu está assim:
Menu_Codigo - Número
Menu_Caption - Texto
Menu_Name - Texto
Menu_Tag - Numero
Menu_NomePai - Texto
Aqui, gravo na tabela Menu, campo Menu_Tag não estou usando:
procedure TForm1.mtdLoopingRecursivo(aoMenuItem: TMenuItem);
var
i: Integer;
begin
form1.Menu.Open;
for i := 0 to aoMenuItem.Count -1 do
begin
// aoMenuItem.Items[i].Checked := not aoMenuItem.Items[i].Checked;
// -> No lugar da linha acima, vc faz a rotina de acesso ao BD
form1.Menu.Append;
form1.MenuMenu_Codigo.AsInteger := i;
form1.MenuMenu_Caption.AsString := AnsiReplaceStr(aoMenuItem.Items[i].Caption, "&", EmptyStr);
form1.MenuMenu_Name.AsString := aoMenuItem.Items[i].Name;
form1.MenuMenu_NomePai.AsString := aoMenuItem.Items[i].Name;
// form1.MenuMenu_Tag.AsInteger := aoMenuItem.Items[i].Tag;
// Se tiver mais campos, coloque aqui
form1.Menu.Post;
mtdLoopingRecursivo(aoMenuItem.Items[i]);
end;
end;
Gustavo Bretas
11/09/2011
Pra que buscar no banco de dados uma coisa que esta no seu formulário principal?
Se pensarmos que todos os menus tem que estar disponível para vc habilitar ou desabilitar o acesso do usuário,
vc pode montar a treeview direto do menu, e então o acesso do usuário em questão vc busca no banco, entendeu?
Antes de te explicar o que ela faz, vamos alterar ela pra ficar mais funcional.
procedure TfrmPrincipal.mtdTreeViewMenuItem(aoTreeView: TTreeView); var I: Integer; begin for I := 0 to aoTreeView.Items.Count - 1 do begin ShowMessage(TMenuItem(vgoList.Objects[i]).Name); end; end;
Então, a função que monta a árvore linka na variável vgoList o menu do nó em questão, adicionando o objeto (ItemMenu), certo?
Como ela é uma lista, para sabermos o meu referente ao nó, usamos o índice absoluto do nó, ok?
Encontrado o índice, usamos o apontamento da lista para acessar as propriedades do menu, mas a lista armazena um Object, e o menu é um TMenuItem, certo?
Então a lista armazena, mas não permite usarmos o objeto como TMenuItem até dizermos pra ela que ele é um TMenuItem, então para acesso-lo usamos TMenuItem(vgoList.Objects[i]).
Utiliza esse conceito para fazer a rotina de gravação.
Se não esta usando, tira ele da tabela.
form1.MenuMenu_NomePai.AsString := aoMenuItem.Items[i].Name;
Isso esta errado, o "pai" nesse contexto é aoMenuItem.Name e não aoMenuItem.Items[i].Name.
form1.MenuMenu_NomePai.AsString := aoMenuItem.Name;
Acho que vc não vai precisar dessa função, mas só pra te mostar como acessar o Menu pelo Nó, sem loopnig.
// Adicione no evento OnDblClick da TreeView if TTreeView(Sender).Items.Count > 0 then begin ShowMessage(TMenuItem(vgoList.Objects[TTreeView(Sender).Selected.AbsoluteIndex]).Name); end;
Cara, pesquisa um pouco sobre Orientação a Objeto, isso vai abrir um pouco sua mente, ao contrário do que muitos pensam, da para programar no Delphi usando orientação a objeto!
Frederico Brigatte***
11/09/2011
Concordo com vc a respeito de gravar os dados do menu no banco. Mas e se caso, queira mostrar num treeview os itens que tal usuário pode acessar?
Frederico Brigatte***
11/09/2011
O que estou querendo fazer é isso:
Exemplo:
CodigoNo CodigoPaiNo Descricao
1 Administração
2 1 Cadastro Usuários
3 2 Perfil
4 1 Clientes
5 1 Fornecedores
6 Consultar
7 6 Usuários
8 6 Clientes
9 6 Fornecedores
10 Relatórios
11 10 Teste
12 Sistema
13 12 Trocar Usuário
14 12 Alterar Senha
15 Sair
CodigoNo - AutoNumeração
CodigoPaiNo - Texto
Descricao - Texto
Preciso que os dados da tabela acima, fossem colocados numa TreeView, ou seja, nós Pai e filhos. Os valores do campo CodigoPaiNo foram colocados na mão. Os valores em branco no campo CodigoPaiNo, são os nós Pai. Como fazer esse tipo de gravação na tabela? Não sei como fazer isso.
Frederico Brigatte***
11/09/2011
O que estou querendo fazer é isso:
Exemplo:
CodigoNo CodigoPaiNo Descricao
1 Administração
2 1 Cadastro Usuários
3 2 Perfil
4 1 Clientes
5 1 Fornecedores
6 Consultar
7 6 Usuários
8 6 Clientes
9 6 Fornecedores
10 Relatórios
11 10 Teste
12 Sistema
13 12 Trocar Usuário
14 12 Alterar Senha
15 Sair
CodigoNo - AutoNumeração
CodigoPaiNo - Texto
Descricao - Texto
Preciso que os dados da tabela acima, fossem colocados numa TreeView, ou seja, nós Pai e filhos. Os valores do campo CodigoPaiNo foram colocados na mão. Os valores em branco no campo CodigoPaiNo, são os nós Pai. Como fazer esse tipo de gravação na tabela? Não sei como fazer isso.
Frederico Brigatte***
11/09/2011
Frederico Brigatte***
11/09/2011
frederico.brigatte@gmail.com
Poderia ser? Tá muito complicado aqui. Ficaria muuuuito mais fácil de entender.