Controle de Acesso por Usuário

Delphi

Firebird

26/04/2021

Galera bom dia, eu queria realizar o controle de acesso as telas por usuário, eu não queria usar nenhum componente externo apenas os da VLC mesmo. A minha ideia era cadastrar as telas no BD, e a permissão S / N do usuário, porém quando eu faço um for p/ percorrer todos os itens do MainMenu ele não pega os itens do SubMenu, para isso acontecer eu sempre tenho que ficar criando for em baixo de for... tem alguma maneira de fazer ele sempre percorrer todos os itens independente de quantos SubMenu exista? Ou então um outro jeito de criar o controle de usuários? Estou usando Delphi + FB
Paulo

Paulo

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

26/04/2021

veja se o item de menu tem subitens e os leia, em cascata.


GOSTEI 0
Paulo

Paulo

26/04/2021

veja se o item de menu tem subitens e os leia, em cascata.


E como validar essa condição? Não encontrei nenhuma condição para validar se o item tem submenu ou não, como fazer isso? O problema de fazer isso é que cada vez que eu acrescentar um novo submenu eu teria que fazer um novo for né?
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

26/04/2021


publique aqui o código que você usa para pegar o item do menu
GOSTEI 0
Paulo

Paulo

26/04/2021


publique aqui o código que você usa para pegar o item do menu


  for i:=0 to MainMenu1.Items.Count-1 do begin
    MainMenu1.Items[i].Name
  end;


Estou fazendo assim...
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

26/04/2021

Estou fazendo assim...

não. não está.
esse código que você postou não faz nada.

de qualquer forma, seguem duas formas de fazer (o princípio é o mesmo, só muda a apresentação):
var
  arrayItems: array of string;
  i: integer;
  mensagem: string;

  function iif(condition: boolean; iftrue: variant; iffalse: variant): variant;
  begin
    if condition then
      result := iftrue
    else
      result := iffalse;
  end;

  procedure PegaItems(Item: TMenuItem);
  var
    j: integer;
  begin
    SetLength(arrayItems, Length(arrayItems)+1);
    arrayItems[High(arrayItems)] := Item.Caption;
    if Item.Count > 0 then
      for j := 0 to Item.Count-1 do
        PegaItems(Item.Items[j]);
  end;

  procedure PegaItems2(Pai: string; Item: TMenuItem);
  var
    j: integer;
  begin
    SetLength(arrayItems, Length(arrayItems)+1);
    arrayItems[High(arrayItems)] := iif(Pai>'',Pai+'>','')+Item.Caption;
    if Item.Count > 0 then
      for j := 0 to Item.Count-1 do
        PegaItems2(iif(Pai>'',Pai+'>','')+Item.Caption,Item.Items[j]);
  end;
begin
  for i := 0 to MainMenu1.Items.Count-1 do
     PegaItems(MainMenu1.Items[i]);

  mensagem := '';
  for i := Low(arrayItems) to High(arrayItems) do
    mensagem := mensagem + arrayItems[i] + ', ' + #13

  MessageDlg(mensagem, mtWarning, [mbOk], 0);

  SetLength(arrayItems, 0);
  for i := 0 to MainMenu1.Items.Count-1 do
     PegaItems2('', MainMenu1.Items[i]);

  mensagem := '';
  for i := Low(arrayItems) to High(arrayItems) do
    mensagem := mensagem + arrayItems[i] + ', ' + #13

  MessageDlg(mensagem, mtWarning, [mbOk], 0);

end;
GOSTEI 0
Paulo

Paulo

26/04/2021

Estou fazendo assim...

não. não está.
esse código que você postou não faz nada.

de qualquer forma, seguem duas formas de fazer (o princípio é o mesmo, só muda a apresentação):
var
  arrayItems: array of string;
  i: integer;
  mensagem: string;

  function iif(condition: boolean; iftrue: variant; iffalse: variant): variant;
  begin
    if condition then
      result := iftrue
    else
      result := iffalse;
  end;

  procedure PegaItems(Item: TMenuItem);
  var
    j: integer;
  begin
    SetLength(arrayItems, Length(arrayItems)+1);
    arrayItems[High(arrayItems)] := Item.Caption;
    if Item.Count > 0 then
      for j := 0 to Item.Count-1 do
        PegaItems(Item.Items[j]);
  end;

  procedure PegaItems2(Pai: string; Item: TMenuItem);
  var
    j: integer;
  begin
    SetLength(arrayItems, Length(arrayItems)+1);
    arrayItems[High(arrayItems)] := iif(Pai>'',Pai+'>','')+Item.Caption;
    if Item.Count > 0 then
      for j := 0 to Item.Count-1 do
        PegaItems2(iif(Pai>'',Pai+'>','')+Item.Caption,Item.Items[j]);
  end;
begin
  for i := 0 to MainMenu1.Items.Count-1 do
     PegaItems(MainMenu1.Items[i]);

  mensagem := '';
  for i := Low(arrayItems) to High(arrayItems) do
    mensagem := mensagem + arrayItems[i] + ', ' + #13

  MessageDlg(mensagem, mtWarning, [mbOk], 0);

  SetLength(arrayItems, 0);
  for i := 0 to MainMenu1.Items.Count-1 do
     PegaItems2('', MainMenu1.Items[i]);

  mensagem := '';
  for i := Low(arrayItems) to High(arrayItems) do
    mensagem := mensagem + arrayItems[i] + ', ' + #13

  MessageDlg(mensagem, mtWarning, [mbOk], 0);

end;


Era exatamente isso que eu precisava, vou adaptar o código para meu uso. Muito Obrigado.
GOSTEI 0
POSTAR