Fórum nvel de acesso aos menus interno do sistema #453745
31/08/2013
0
boa noite estou usando o seguinte codigo para controlar o acesso dos usuarios ao menu principal do sistema, como vcs podem ver carrego os menu de forma dinamica gostaria de saber como posso fazer isso com as acoes interna do formulario uso action em todos os forms.
procedure TFrmNivelAcesso.LoadDefault;
var i : Integer;
begin
With TClientDataSet(dsTreeView.DataSet) do
begin
close;
CreateDataSet;
EmptyDataSet;
for I := 0 to Pred(FAcoes.ActionCount) do
begin
Append;
FieldByName('id').AsInteger := i +1;
FieldByName('categoria').asString := TAction(FAcoes.Actions[i]).Category;
FieldByName('nome').AsString := TAction(FAcoes.Actions[i]).Name;
FieldByName('caption').AsString := TAction(FAcoes.Actions[i]).Caption;
FieldByName('permissao').AsString := 'N';
post;
end;
end;
*---------------------------------------------*
Var
No, NoFilho : TTreeNode;
UltNo : String;
I : integer;
begin
with TClientDataSet(Tabela) do
begin
First;
TreeView1.Items.Clear;
UltNo := FieldByName('Categoria').AsString;
No := TreeView1.Items.AddChild(nil,UltNo);
while not eof do
begin
if UltNo <> FieldByName('Categoria').AsString then
begin
UltNo := FieldByName('Categoria').AsString;
No := TreeView1.Items.AddChild(nil,UltNo);
if not No.HasChildren then
begin
No.ImageIndex := 1;
No.SelectedIndex := 1;
end;
end;
if FieldByName('categoria').AsString = UltNo then
NoFilho := TreeView1.Items.AddChild(No,FieldByName('Caption').AsString);
if not NoFilho.HasChildren then
begin
NoFilho.ImageIndex := 0;
NoFilho.SelectedIndex := 0;
end;
next;
end;
end;
procedure TFrmNivelAcesso.LoadDefault;
var i : Integer;
begin
With TClientDataSet(dsTreeView.DataSet) do
begin
close;
CreateDataSet;
EmptyDataSet;
for I := 0 to Pred(FAcoes.ActionCount) do
begin
Append;
FieldByName('id').AsInteger := i +1;
FieldByName('categoria').asString := TAction(FAcoes.Actions[i]).Category;
FieldByName('nome').AsString := TAction(FAcoes.Actions[i]).Name;
FieldByName('caption').AsString := TAction(FAcoes.Actions[i]).Caption;
FieldByName('permissao').AsString := 'N';
post;
end;
end;
*---------------------------------------------*
Var
No, NoFilho : TTreeNode;
UltNo : String;
I : integer;
begin
with TClientDataSet(Tabela) do
begin
First;
TreeView1.Items.Clear;
UltNo := FieldByName('Categoria').AsString;
No := TreeView1.Items.AddChild(nil,UltNo);
while not eof do
begin
if UltNo <> FieldByName('Categoria').AsString then
begin
UltNo := FieldByName('Categoria').AsString;
No := TreeView1.Items.AddChild(nil,UltNo);
if not No.HasChildren then
begin
No.ImageIndex := 1;
No.SelectedIndex := 1;
end;
end;
if FieldByName('categoria').AsString = UltNo then
NoFilho := TreeView1.Items.AddChild(No,FieldByName('Caption').AsString);
if not NoFilho.HasChildren then
begin
NoFilho.ImageIndex := 0;
NoFilho.SelectedIndex := 0;
end;
next;
end;
end;
Daniel Thomaz
Curtir tópico
+ 0
Responder
Posts
14/09/2013
Rodrigo Cordeiro
Veja de uma olhada como eu fiz no TUCControls (componente segundário do pacote usercontrol) e veja se atende sua necessidade.
A ideia na época foi justamente controlar acesso a objetos vinculados a TAction's (depois eu acabei incluindo TFields também mas no início eu só havia pensado em actions mesmo)
Como ele funciona... em design time você seleciona quais actions vc vai querer controlar. E o que o UCControls faz por baixo dos panos é incluir as actions que você selecionou na propriedade ExtraRights do UserControl (componente principal). Nessa eu aproveito para separar em categorias também, pois ao incluir eu sei de qual form ele veio. Se não fosse assim seria uma bagunça, os actions seriam exibidos todos no mesmo nível do treeview para seleção de permissão.
A aplicação das permissões do UCControls durante o login é bastante similar ao do componente principal... Ao ser carregado (após a construção do form onde ele está) o UCControls varre os componentes controlados, procura no banco de dados a permissão e se não encontrar bloqueia (visible ou enable) (tfields readonly, etc)
Recentemente precisei voltar a mexer com delphi e fiz uma modificação no UCControls. Para suportar incluir mais de um UCControls no mesmo form ou datamodule. Assim essa classificação por categorias fica mais organizada ainda. Fiz isso para controlar permissões "especiais" que digam para o usuário porque ele não tem acesso a determinado recurso e não somente ocultar ou desabilitar o botão, item de menu, etc. Então eu criei um datamodule só com essas actions especiais. Na tela de seleção de permissões está tudo bem dividido (ex: permissões avançadas (habilitar/desabilitar registros no db) / informações sigilosas(ocultar/exibir valores) / desfazer lançamentos (controlar exclusões em cascata) enfim, operações que o usuário deixa de ter acesso a partir de determinada etapa do processo, mas que sempre haverá um supervisor, gerente, etc que tenha necessidade e permissão de fazer. (afinal, o sistema pode ser nosso, mas os dados são deles....)
Um abraço
Rodrigo Cordeiro - QmD
qmd@usercontrol.com.br
A ideia na época foi justamente controlar acesso a objetos vinculados a TAction's (depois eu acabei incluindo TFields também mas no início eu só havia pensado em actions mesmo)
Como ele funciona... em design time você seleciona quais actions vc vai querer controlar. E o que o UCControls faz por baixo dos panos é incluir as actions que você selecionou na propriedade ExtraRights do UserControl (componente principal). Nessa eu aproveito para separar em categorias também, pois ao incluir eu sei de qual form ele veio. Se não fosse assim seria uma bagunça, os actions seriam exibidos todos no mesmo nível do treeview para seleção de permissão.
A aplicação das permissões do UCControls durante o login é bastante similar ao do componente principal... Ao ser carregado (após a construção do form onde ele está) o UCControls varre os componentes controlados, procura no banco de dados a permissão e se não encontrar bloqueia (visible ou enable) (tfields readonly, etc)
Recentemente precisei voltar a mexer com delphi e fiz uma modificação no UCControls. Para suportar incluir mais de um UCControls no mesmo form ou datamodule. Assim essa classificação por categorias fica mais organizada ainda. Fiz isso para controlar permissões "especiais" que digam para o usuário porque ele não tem acesso a determinado recurso e não somente ocultar ou desabilitar o botão, item de menu, etc. Então eu criei um datamodule só com essas actions especiais. Na tela de seleção de permissões está tudo bem dividido (ex: permissões avançadas (habilitar/desabilitar registros no db) / informações sigilosas(ocultar/exibir valores) / desfazer lançamentos (controlar exclusões em cascata) enfim, operações que o usuário deixa de ter acesso a partir de determinada etapa do processo, mas que sempre haverá um supervisor, gerente, etc que tenha necessidade e permissão de fazer. (afinal, o sistema pode ser nosso, mas os dados são deles....)
Um abraço
Rodrigo Cordeiro - QmD
qmd@usercontrol.com.br
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)