Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) TMainMenu - Controle de acesso por usuario


pimpocvl007

Pergunta

Boa noite,

[DUVIDA]

Como posso automatizar a liberação do MENU (TMainMenu, enable = True) quando o usuário tem acesso ao Form vinculado ao item do menu? (passando somente o nome do FORM).

[APRESENTAÇÃO DO PROBLEMA]

Na minha aplicacao o usuario acessa o sistema digitando USUÁRIO / SENHA / EMPRESA, os FORM's estão disponíveis através de um TMainMenu que inseri no Form Principal, exemplo da hierarquia do menu:


ADMINISTRAÇÃO
ADMINISTRAÇÃO / MANUTENÇÃO
ADMINISTRAÇÃO / MANUTENÇÃO / 001 - Cadastro Usuário (chama o Form "Cadastro Usuário")
ADMINISTRAÇÃO / MANUTENÇÃO / 002 - Cadastro Parâmetro (...mesma idéia citada acima)
ADMINISTRAÇÃO / MANUTENÇÃO / 003 - Cadastro Formulário
ADMINISTRAÇÃO / PROCESSO / 004 - Equivalência de usuário
ADMINISTRAÇÃO / PROCESSO / 005 - Alteração Senha

...etc

Tenho uma TABELA onde gravo os dados relevantes do Form, Nome, localização no MENU (TMainMenu), etc, tenho outra TABELA que gravo os Form's que o usuário tem acesso.

Sei que posso fazer uma validação usando IF ou CASE, mas toda vez que criar um novo FORM terei que entrar no código fonte e incluir esse IF para o usuário ganhar acesso a esse componente (desde que tenha permissão), também sei que toda vez que criar um novo FORM terei que entrar no código fonte e criar o novo menu ou item de menu manualmente.

...mas,

...também sei que e possível automatizar este código para deixa-lo dinâmico mais inteligente, só que, não estou conseguindo fazer isso sozinho, não tenho conhecimento para desenvolver essa validação por isso recorro aos colegas, quem tiver uma sugestão será bem vinda.

Editado por Jhonas
Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0
também sei que e possível automatizar este código para deixa-lo dinâmico mais inteligente

O melhor metodo para esse tipo de controle seria usar a propriedade TAG

do componente.

for i := 0 to MainMenu1.Items.Count -1 do

begin

if UserLevel < MainMenu1.Items[i].Tag then

MainMenu1.Items[i].Visible := False

else

MainMenu1.Items[i].Visible := True;

for j := 0 to MainMenu1.Items[i].Count -1 do

if UserLevel < MainMenu1.Items[i].Items[j].Tag then

MainMenu1.Items[i].Items[j].Visible := False

else

MainMenu1.Items[i].Items[j].Visible := True;

end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Perceba que a propriedade TAG dos formularios ou outros componentes terá um valor numerico.. através desse valor é que voce vai liberar os itens e subitens de menu para o usuário.

if UserLevel < MainMenu1.Items[i].Tag then
   MainMenu1.Items[i].Enabled := False
else
   MainMenu1.Items[i].Enabled:= True;

digamos que o nivel do usuario seja 3, então se algum formulario estiver com a TAG = 4, esse formulário ficara desabilitado para esse usuário ... entendeu ?

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Tu teria idéia de como eu poderia liberar o menu através do nome que dei para ele na propriedade NAME do TMainMenu?

é só trocar o nome ... exemplo

if UserLevel < MeuMenu.Items[i].Tag then
   MeuMenu.Items[i].Enabled := False
else
   MeuMenu.Items[i].Enabled:= True;
if NivelUsuario < NomedoMeuMenu.Items[i].Tag then
   NomedoMeuMenu.Items[i].Enabled := False
else
   NomedoMeuMenu.Items[i].Enabled:= True;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

...acho que me expressei errado, estava pensando em algo como:

NomedoMeuMenu.Items[NomeItemMenu].Enabled := False
else
   NomedoMeuMenu.Items[NomeItemMenu].Enabled:= True;

...em vez de utilizar o "i" passando um valor inteiro, utilizaria uma opção passando o o nome do item menu que seria string. Sei que a opção "Items" espera um valor Inteiro por isso não consigo utilizar, será que existe algum outro parâmetro que permita fazer a validação através de um nome (string)?

obrigado

Olimpio

Link para o comentário
Compartilhar em outros sites

  • 0

if UserLevel < (MainMenu1.Items.Find('NomeItemMenu').Tag) then
   MainMenu1.Items.Find('NomeItemMenu').Enabled := False
else
   MainMenu1.Items.Find('NomeItemMenu').Enabled:= True;
Jhonas, Boa noite, Verifiquei que não e possível informar uma variável do tipo String no lugar do: 'NomeItemMenu', é possível fazer isso de alguma forma? ...eu tentei criar uma função da seguinte forma:
function nomecomponente : String;
begin
Return := nm_componente;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i             : integer;
teste       : String;
begin

carregaComponenteUsuario;

for i := 0 to queryConsultaBanco.RecordCount - 1 do
  if teste = '' then
    begin
      nm_componente := queryConsultaBancoNM_COMPONENTE.Text;
      menuPrincipal.Items[0].Items[0].Find(nomecomponente).Enabled := False;
      queryConsultaBanco.Next;
    end;

...então quando passa a primeira vez pelo FOR, funciona beleza, porem quando vai passar a segunda vez sendo que na variavel "nm_componente" já esta carregado outro nome de componente da este erro:

Acces violation at address 0047AEDF in module 'Project1.exe' Read of address 00000039

...ai não funcionou =).

Obrigado

Olimpio

Editado por pimpocvl007
Link para o comentário
Compartilhar em outros sites

  • 0

Amigo, voce precisa ter o habito de ler o help do delphi

veja o seu comando:

menuPrincipal.Items[0].Items[0].Find(nomecomponente).Enabled := False;

apesar de não ocorrer erro na compilação, haveria erro na execução

a propriedade Items ... sozinho é um TMenuItem que descreve o elemento do Menu, ou seja o seu nome.

a propriedade Items[index] é o indice ( numero ) relativo a posição desse elemento na lista do Menu

o seu comando acima não é correto, porque no indice [0] já existe um elemento do Menu declarado, e o metodo find

serve para localizar um item de Menu na ordem de propriedade pelo nome ou cabeçalho.

então voce tem que optar por um ou outro método ... se voce quer usar strings terá que fazer varios IFIs

caso contrário poderá usar os indices, que é muito mais prático

exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var i,j, userlevel : integer;  NomeItemMenu : string;
begin

   userlevel := -1;
   NomeItemMenu := 'aaa';
   if UserLevel < (MainMenu1.Items.Find(NomeItemMenu).Tag) then
      MainMenu1.Items.Find(NomeItemMenu).Enabled := False
   else
      MainMenu1.Items.Find(NomeItemMenu).Enabled:= True;

end;

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...