GARANTIR DESCONTO

Fórum [OT] - Ajuda pra montar controle de Permissões do Sistema #325803

21/07/2006

0

Me passou uma idéia e gostaria da ajuda de vocês. Hoje quando o meu sistema inicia ele varre a tabela de permissões e vê o que o usuário tem ou não acesso, e vai colocando True e False nas propriedades Enabled dos componentes seja ele qual for. Eu gostaria de criar uma tabela tipo Permissões só que ela teria a seguinte estrutura:
Permissoes:
ID, (Autoincremental) IdNivel, (onde pego o codigo do nivel) IdUsuario, (onde pego o codigo do usuario) ItemMenu (onde pego o nome do item do menu) Caption (onde pego o Caption do Item) Status (onde digo se esta ou não habilitado)

Quando o sistema for iniciado eu gostaria varrer essa tabela e vê o que o usuário tem ou não acesso e vou liberando, mais gostaria de uma ajuda de vocês.

Como faço para jogar nessa tabela o nome dos Itens do Meu Menu pegando o nome e o Caption do mesmo.

Também como faço para mostrar em um TreeView os dados varridos da tabela, podendo Habilitar ou Desabilitar cada Item clicando sobre essa TreeView?

Alguém tem alguma Idéia?


Paullsoftware

Paullsoftware

Responder

Posts

21/07/2006

Aasn

Caro paullsoftware,

Todos os componentes do Delphi possuem a propriedade Tag do tipo numérico, então eu criei uma tabela com todos os direitos do sistema, atribuindo-as um código, este código é utilizado no preenchimento do Tag dos componentes.

Quando o usuário se loga ao sistema, este carrega uma tabela contendo os código a que ele tem direito de acesso e joga em um Array que está no form principal. Daí uma precedure faz uma varredura nos componentes com base no Tag dos mesmos a medida em que os forms forem abertos e vai habilitando ou não de acordo com a matriz.

Espero ter colaborado...

[]´s
AASN


Responder

Gostei + 0

22/07/2006

Titanius

Amigo, nao sei se voce conhece, mas tem uma biblioteca chamada UserControl, nela ele tem controle a MainMenu, ActionList, e em cada componente de cada form, ou seja, você deine os captions e tals, já tem tudo pronto... verifique ele, muito bom, uso ele a bastante tempo qq ajuda pode me falar...

[]s


Responder

Gostei + 0

23/07/2006

Paullsoftware

:arrow: :arrow: [b:db15fe02eb]Conheço sim titanius[/b:db15fe02eb]


mais prefiro eu mesmo fazer esse controle, pois, usando componentes de terceiros posso ficar amarrado a ele em uma possível atualização até onde sei eles já possuem biblioteca para BDS2006 mais por ironia do destino eles param o projeto e ai, fico sem poder migrar para uma futura versão... esse é um dos motivos pelo qual não gosto de usar esses componentes, até uso quando o cliente quer economizar no valor do sistema uso algums para diminuir o meu trabalho, mais aviso a ele que vou fazer isso, pois, tenho sempre o delphi 7 comigo e não penso em deixá-lo nem tão sedo...

valeu pela força, um abraço :wink:


Responder

Gostei + 0

23/07/2006

Nightshade

Cara da uma olhada na videoaula do Luciano Pimenta, ele explica algumas coisas sobre ActionList, se tu tem tempo t aconselho tu mesmo desenvolver um componente para controle de usuarios, se der erro os error serao de tua autoria, nao de terceiros..
eu sempre uso componentes proprios, ou testo muito bem os componentes de terceiros q uso qnd nao tenho tempo de codar um..


Responder

Gostei + 0

24/07/2006

Bruno Belchior

mais prefiro eu mesmo fazer esse controle
Acho uma sábia decisão. Em relação ao UserControl, eu baixei sua biblioteca, estudei seu código e reimplementei o mesmo, utilizando a ´idéia´ que ele propôs e adicionando alguns recursos.


Responder

Gostei + 0

24/07/2006

Titanius

Eu já não acho tão sábia assim esta idéia.... minha opinião...

Já que a biblioteca é open e free... se você quiser, você mesmo pode modificar, e no meu caso, eu mesmo migrei minha biblioteca pra BDS2006 antes de ´oficialmente´ sair... já que tenho os fontes...


Mas como eu disse, é minha opinião, reinventar a roda nos tempos de hoje é complicado. e esta biblioteca é muito boa, é claro que precisa melhorar e muito... :wink:


[]s


Responder

Gostei + 0

24/07/2006

Bruno Belchior

Bom, ai já entra num relacionamento um tanto complexo. Free X Confiável. Como mencionei acima, utilizei a idéia do projeto (que por sinal é excelente) e adicionei recursos dos quais eu necessito. Uma biblioteca Free e onde há uma implementação paralela e feita por muitos desenvolvedores (não digo que seja sempre!) tende a resultar em alguns códigos imprecisos e talvez não tão otimizados. Por isso cheguei a conclusão, visto que meu sistema também não pode ficar a boa vontade de pessoas que contribuem com o projeto sem fins lucrativos, já que não temos garantia de continuidade e nem suporte. Mas com o amigo bem disse, isso é questão de opinião pessoal.


Responder

Gostei + 0

24/07/2006

Paullsoftware

Eu cheguei a essa necessidade depois de ver um programador implementando essa ideia tive acesso a uma tabela dele chamada permissoes e ví q tudo era carregado dessa tabela botões das janelas, itens dos menus e etc e tals... então eu fiz put´s, eu faço tudo no braço tipo filtro a tabela de permissoes para o usuario atual e depois vou mandando true ou false para os itens então já pensou um sistema grande né? o trabalho que dá fazer assim, então é por isso que quero mudar a maneira de fazer e achei interessante a que ele usa, na tela de permissoes do sistema ele carrega toda tabela de permissoes com todas as opções do sistema que podem ser ´LIBERADAS´ ou ´BLOQUEDAS´ em um TreeView e vc vai clicando e ele coloca a imagem do Cadeado aberto ou fechado, achei bem interessante de se ´copiar a ideia´ então resolvi abrir esse tópico...

quanto ao uso da biblioteca UserControl é como eu já disse, nos meus sistemas uso apenas componentes da própria VCL, e somene um pago o [b:1d0f9cb750]RdPrint[/b:1d0f9cb750], mais no meu Delphi7 tenho vários componentes instalados, porem quando um cliente pede alguma coisa mais atrativa ele vai pagar a+++ por isso....

vlw pela participação :wink:

:arrow: vamos continuar... com as :idea: :idea:


Responder

Gostei + 0

25/07/2006

Titanius

Cara... seguinte, estive pensando...

é Só você salvar o nome do Form, e o nome do controle que você quer habilitar/desabilitar... aí é sh vc dar um for no componentscount do Form salvo, e verificar se esta na tal tabela, se estiver vc aplica o true ou false...

Assim, vc nao faria muita coisa, soh uma funcao que seria chamada no OnShow de cada Form...

Espero ter ajudado.


[]s


Responder

Gostei + 0

25/07/2006

Paullsoftware

Cara... seguinte, estive pensando... é Só você salvar o nome do Form, e o nome do controle que você quer habilitar/desabilitar... aí é sh vc dar um for no componentscount do Form salvo, e verificar se esta na tal tabela, se estiver vc aplica o true ou false... Assim, vc nao faria muita coisa, soh uma funcao que seria chamada no OnShow de cada Form... Espero ter ajudado. []s

Com certeza sempre ajuda, disso não tenha dúvida... :lol:
é exatamente isso que estou tentando fazer, eu já consegui guardar os itens do menu na minha tabela e carregá-los. encontrei uma função na net e estou tentando implementá-la as minhas necessidades.
Eis a função:
{
  Cria um "MainMenu" via banco de dados automaticamente
  -> Arquivo MENUS.DBF
  Campos -> Campo Character 20 -> Nome do campo
            Sequencia Character 1 -> 1,2,3,...
            Ordem Character 1 -> 1,2,3,...
            Flag Boolean -> .T. ou .F.
            CampoNN Character 20 -> Nome do SubCampo
            FlagNN Boolean -> .T. ou .F.
  -> Índice = ´Sequencia + Ordem´
  Desenvolvido em Clipper/Dbase, função Achoice()
  Convertido para Delphi 7.0 em 20/Agosto/2004
}
unit MenuPas;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, Menus, Grids, DBGrids,
  DB, DBTables, ExtCtrls, DBCtrls, Buttons;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Button1: TButton;
    BitBtn1: TBitBtn;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    DataSource1: TDataSource;
    Table1: TTable;
    Table1CAMPO: TStringField;
    Table1SEQUENCIA: TStringField;
    Table1ORDEM: TStringField;
    Table1FLAG: TBooleanField;
    Table1CAMPO01: TStringField;
    Table1CAMPO02: TStringField;
    Table1CAMPO03: TStringField;
    Table1CAMPO04: TStringField;
    Table1CAMPO05: TStringField;
    Table1FLAG01: TBooleanField;
    Table1FLAG02: TBooleanField;
    Table1FLAG03: TBooleanField;
    Table1FLAG04: TBooleanField;
    Table1FLAG05: TBooleanField;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  NewItem: TMenuItem;
  X, I, K: integer;
  XCampo: string;
  XFlag: Boolean;
begin
  Table1.First;
  K := Table1SEQUENCIA.AsInteger;
  while (K <= 1000) and not Table1.Eof do
  begin
    K := Table1SEQUENCIA.AsInteger;
    NewItem := TMenuItem.Create(MainMenu1);
    try
      NewItem.Caption := Table1CAMPO.Value;
      NewItem.Enabled := Table1FLAG.Value;
      MainMenu1.Items.Add(NewItem);
    except
      NewItem.Free;
      raise; { reraise the exception }
    end;
    Table1.Next;
    I := K;
    while (I = K) and not Table1.Eof do
    begin
      NewItem := TMenuItem.Create(Self);
      try
        NewItem.Caption := Table1CAMPO.Value;
        NewItem.Enabled := Table1FLAG.Value;
        MainMenu1.Items[K - 1].Add(NewItem);
        X := 1;
        while (X <= 5) do
        begin
          XCampo := ´´;
          XFlag := False;
          if (X = 1) then
          begin
            XCampo := Table1CAMPO01.Value;
            XFlag := Table1FLAG01.Value;
          end
          else if (X = 2) then
          begin
            XCampo := Table1CAMPO02.Value;
            XFlag := Table1FLAG02.Value;
          end
          else if (X = 3) then
          begin
            XCampo := Table1CAMPO03.Value;
            XFlag := Table1FLAG03.Value;
          end
          else if (X = 4) then
          begin
            XCampo := Table1CAMPO04.Value;
            XFlag := Table1FLAG04.Value;
          end
          else if (X = 5) then
          begin
            XCampo := Table1CAMPO05.Value;
            XFlag := Table1FLAG05.Value;
          end;
          if XCampo <> ´´ then
          begin
            NewItem := TMenuItem.Create(Self);
            try
              NewItem.Caption := XCampo;
              NewItem.Enabled := XFlag;
              MainMenu1.Items[K - 1].Items[Table1ORDEM.AsInteger - 1].Add(NewItem);
            except
              NewItem.Free;
              raise; { reraise the exception }
            end;
          end;
          Inc(X);
        end;
      except
        NewItem.Free;
        raise; { reraise the exception }
      end;
      Table1.Next;
      K := Table1SEQUENCIA.AsInteger;
    end;
  end;
end;

end.

estou a adapitando para minhas necessidades... :wink:


Responder

Gostei + 0

27/01/2008

Mcamilo.o

Caro Paulo, se você ainda não conseguiu fazer o que quer, pode me avisar que eu tenho tudo isso pronto para você


Responder

Gostei + 0

27/01/2008

Jpauloss

Dúvida: Porque OT no inicio da pergunta?


Responder

Gostei + 0

27/01/2008

Onjahyr

Dúvida: Porque OT no inicio da pergunta?


[b:92684c68e6][OT][/b:92684c68e6] - É quando se deseja falar alguma coisa que não está diretamente ligado com o assunto do fórum.

[b:92684c68e6][OT][/b:92684c68e6] --> Off Topic (traduzindo: Tópico desligado).

Não entendi por que ele colocou, uma vez que não se trata de um assunto fora do contexto do fórum, mas, cada um com sua loucura :lol:
Tudo é válido!

Blz.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar