[OT] - Ajuda pra montar controle de Permissões do Sistema
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:
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?
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
Curtidas 0
Respostas
Aasn
21/07/2006
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
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
GOSTEI 0
Titanius
21/07/2006
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
[]s
GOSTEI 0
Paullsoftware
21/07/2006
: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:
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:
GOSTEI 0
Nightshade
21/07/2006
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..
eu sempre uso componentes proprios, ou testo muito bem os componentes de terceiros q uso qnd nao tenho tempo de codar um..
GOSTEI 0
Bruno Belchior
21/07/2006
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.GOSTEI 0
Titanius
21/07/2006
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
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
GOSTEI 0
Bruno Belchior
21/07/2006
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.
GOSTEI 0
Paullsoftware
21/07/2006
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:
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:
GOSTEI 0
Titanius
21/07/2006
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
é 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
GOSTEI 0
Paullsoftware
21/07/2006
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:
GOSTEI 0
Mcamilo.o
21/07/2006
Caro Paulo, se você ainda não conseguiu fazer o que quer, pode me avisar que eu tenho tudo isso pronto para você
GOSTEI 0
Jpauloss
21/07/2006
Dúvida: Porque OT no inicio da pergunta?
GOSTEI 0
Onjahyr
21/07/2006
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.
GOSTEI 0