Gravar em banco itens do MainMenu

Delphi

11/09/2011

Boa noite,

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***

Frederico Brigatte***

Curtidas 0

Respostas

Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Boa noite,

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?
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

11/09/2011

Você terá que fazer um Looping recursivo.
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!
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Você terá que fazer um Looping recursivo.
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;

GOSTEI 0
Gustavo Bretas

Gustavo Bretas

11/09/2011

E ae Frederico,

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.Open;
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!
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

E ae Frederico,

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.Open;
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.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

E ae Frederico,

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.Open;
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?
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

11/09/2011

Isso vc tinha dito no primeiro tópico, não precisava repetir.
O que eu quero fazer, é gravar os menus e sub-menus numa tabela e depois montar num treeview, é isso que preciso, fui claro agora?
 

Isso facilita a vida de quem quer te ajudar, ok?
 É 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.

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);
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Isso vc tinha dito no primeiro tópico, não precisava repetir.
O que eu quero fazer, é gravar os menus e sub-menus numa tabela e depois montar num treeview, é isso que preciso, fui claro agora?
 

Isso facilita a vida de quem quer te ajudar, ok?
 É 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.

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.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

E ae Frederico,

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.Open;
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.
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

11/09/2011

Que banco de dados vc usa?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Que banco de dados vc usa?


Access
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Que banco de dados vc usa?


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.
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

11/09/2011

Certo, eu não tenho o Access aqui, então te passo o conceito, e vc tera que adequar para seu ambiente!
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
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Certo, eu não tenho o Access aqui, então te passo o conceito, e vc tera que adequar para seu ambiente!
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?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Certo, eu não tenho o Access aqui, então te passo o conceito, e vc tera que adequar para seu ambiente!
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.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011



Certo, eu não tenho o Access aqui, então te passo o conceito, e vc tera que adequar para seu ambiente!
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.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011



Certo, eu não tenho o Access aqui, então te passo o conceito, e vc tera que adequar para seu ambiente!
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?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011



Certo, eu não tenho o Access aqui, então te passo o conceito, e vc tera que adequar para seu ambiente!
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...
GOSTEI 0
Gustavo Bretas

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...
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Se não for muito trabalhoso, os dois, mas o que você me sugere? To meio perdido, rs. Tem que se desculpar não, eu é que peço desculpa pela bagunça que causei, rs.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Caso queira responder por email: frederico.brigatte@itelefonica.com.br

Fique a vontade em escolher o melhor meio de comunicação.

Obrigado pela ajuda que está dando, Gustavo. Obrigado mesmo.
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

11/09/2011

Boa tarde Frederico,

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)
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

1º As funções do usuário são bem definidas?
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.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Gustavo, vamos fazer do jeito que você achar melhor, to meio perdido nisso, rs.
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

11/09/2011

Gustavo, vamos fazer do jeito que você achar melhor, to meio perdido nisso, rs.


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=132
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
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Gustavo,

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.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Quero por enquanto gravar os itens e subitens do menu numa tabela e depois montar o treeview com os dados. A rotina que vc me passou funcionou, só não sei como fazer o inverso, rs, ou seja, nó e subnó, sei lá se chama assim, rs.



GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Como vou saber quem é o nó pai e o nó filho qdo gravar no banco?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Gustavo,

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.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Como monto o treeview com dados da tabela?

Criei uma tabela com os campos:

Menu_Codigo
Menu_Caption
Menu_Name

Tirei o campo Tag.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Estou gravando na tabela usando essa rotina:

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);
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Gustavo,

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.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Ué, esqueceu de mim de novo, rs? Como faço para montar o treeview com dados do banco?
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

11/09/2011

Teste
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

11/09/2011

Calma homi!

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;
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

11/09/2011

Para montar a TreeView, não tem necessidade de montar pelo banco, as modificações que vc fizer no acesso, vc vai fazer o UPDATE usando o nome do Menu!

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;
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

11/09/2011

Na função que monta a árvore vc faz assim:

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;
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

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:

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!
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Este fórum tá doido. Antes quando eu respondia, ele ia para o topo da página, agora não está indo mais. Não sei porque.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Não recebo nada aqui também não. Tem como me mandar isso tudo ai num exemplo pronto por email?

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?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Gustavo,

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?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Não entendi porque não precisa montar pelo banco. Também não entendi a procedure onde você diz:

"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?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Gustavo,

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;
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

11/09/2011

Não entendi porque não precisa montar pelo banco.


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?

Também não entendi a procedure onde você diz: "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?


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.

campo Menu_Tag não estou usando:


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!
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Gustavo,

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?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Gustavo,

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.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Gustavo,

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.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Pô, esqueceram de mim??????
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

11/09/2011

Teria como mandar um exemplo disso pra mim? To precisando. Meu email é:

frederico.brigatte@gmail.com

Poderia ser? Tá muito complicado aqui. Ficaria muuuuito mais fácil de entender.
GOSTEI 0
POSTAR