Menus - controle de menu e botoes permissoes numa treeview

Top  Previous  Next

// Fazendo controle de menu/botões permissoes numa treeview 

 

// captura os items de um menu e coloca-os numa ATreeView (treeview com Checkbox)

procedure MenuItemsToTreeView

// habilita todos os itens de menu

procedure HabilitaMenusTudo

// habilita os items de menu a partir da treeview (check or not-checked)

procedure HabilitaMenusFromTreeView;

// habilita 1 item no menu apatir do seu nome

procedure HabilitaItemMenu;

// obtem o estado de todos os menus (enabled/disabled) atraves de StringList.

procedure GetMenusState; overload;

// obtem o estado de todos os nós/treeview (enabled/disabled) atraves de StringList.

procedure GetMenusState; overload; 

// coloca um "x" no nó passado como parametro (nome do menu)

procedure SetMarcaNode;

 

implementation

 

// captura os items de menus de uma mainmenu e coloca-os numa treeview na mesma hierarquia

procedure MenuItemsToTreeView(const Menu: TMainMenu; var Tree: TATreeView);

var

  I  : Integer;

  No1: TTreeNode;

  // funcao usada para pegar submenus

  procedure GetMenuSubItems(Menu: TMenuItem; var Node: TTreeNode);

  var

    I  : Integer;

    No2: TTreeNode;

  begin

    // For no Itens se o Items > 0  Faz recursividade

    for I := 0 to Pred(Menu.Count) do

    begin

      if (Menu.Items[I].Caption <> '-') then // adiciona nó com o nome do menu como .Data (pointer)

        Tree.Items.AddChildObject(Node, StrTran( Menu.Items[I].Caption, '&''' ), PChar(Menu.Items[I].Name ));

      // se ESTE item tem sub-menus seta o nó como este atual e entra novamente na funcao (recursividade)

      if Menu.Items[I].Count > 0 then

      begin

        No2 := Tree.Items[ Tree.Items.Count-1 ];

        GetMenuSubItems(Menu.Items[I], No2);

      end;

    end;

  end;

begin

  Tree.Items.Clear;

  for I := 0 to Pred(Menu.Items.Count) do    // percorre todos os itens de menu

  begin

    Tree.Items.AddObject(nil, StrTran( Menu.Items[I].Caption, '&''' ), PChar(Menu.Items[I].Name )); // adiciona os nós principais

    No1 := Tree.Items[ Tree.Items.Count-1 ]; // seta o nó como No1 e chama a funcao para pegar os subitens

    GetMenuSubItems(Menu.Items[I], No1);

  end;

  Tree.StateRecursion := False;              // Atualiza a tela (Xises)

  Tree.StateRecursion := True;

end;

 

// procedure Habilita todos Menus e botoes.

procedure HabilitaMenusTudo(Menu: TMainMenu; Habilita: Boolean = True; PainelBtns: TCustomPanel = nil);

var

  I: Integer;

  procedure GetMenus(Menu: TMenuItem);

  var

    I: Integer;

  begin

    for I := 0 to Pred(Menu.Count) do

    begin

      Menu.Items[i].Enabled := Habilita;

      GetMenus(Menu.Items[I]);

    end;

  end;

begin

  for I:= 0 to Pred(Menu.Items.Count) do  // percorre todos os menus

  begin

    Menu.Items[i].Enabled := Habilita;

    GetMenus(Menu.Items[I]);              // itens dentro do item (sub-menu)

  end;

  for I:= 0 to PainelBtns.ControlCount-1 do

    TmlABtn(PainelBtns.Controls[I]).Enabled := Habilita;

end;

 

// pega dados da treeview e coloca no menu e na barra de botões... (as marcadas ele habilita)

procedure HabilitaMenusFromTreeView(const Tree: TATreeView; Menu: TMainMenu; PainelBtns: TCustomPanel = nil);

var

  I, X: Integer;

  M   : TMenuItem;

begin

  // percorre todos os nós.

  for I := 0 to Tree.Items.Count-1 do

  begin

    M := TMenuItem(GetParentForm(Tree).FindComponent(StrPas(Tree.Items[I].Data))); // tenta achar o menu que possue o nome contido em Node.Data

    if M = nil then Continue;                     // nao achou Nó=Menu pula

    M.Enabled := (Tree.Items[I].StateIndex <> 2); // state 2 = habilitado

    if PainelBtns = nil then Continue;            // Tem barra de botões?

    for X := 0 to PainelBtns.ControlCount-1 do      // percorre os botões...

      // tem o mermo HelpContext? então é este mesmo...

      if (TmlABtn(PainelBtns.Controls[X]).HelpContext = M.HelpContext) and (TmlABtn(PainelBtns.Controls[X]).HelpContext > 0) then

      begin

        TmlABtn(PainelBtns.Controls[X]).Enabled := M.Enabled;

        Break;

      end;

  end;

end;

 

// habilita apenas 1 item do menu - usado após SELECT

procedure HabilitaItemMenu(const Form: TCustomForm; const NomeItemMenu: string; const Habilita: Boolean; PainelBtns: TCustomPanel = nil);

var

  X: Integer;

  M: TMenuItem;

begin

  M := TMenuItem(Form.FindComponent(NomeItemMenu)); // tenta achar o menu que possue o nome contido na var

  if M = nil then Exit;         // nao achou Menu pula

  M.Enabled := Habilita;

  if PainelBtns = nil then Exit;                  // Tem barra de botões?

  for X := 0 to PainelBtns.ControlCount-1 do      // percorre os botões...

    // tem o mermo HINT ou CAPTION? então é este mesmo...

    if ((TmlABtn(PainelBtns.Controls[X]).Hint = M.Hint) and (M.Hint <> '')) or

       (TmlABtn(PainelBtns.Controls[X]).Caption = M.Caption) then

    begin

      TmlABtn(PainelBtns.Controls[X]).Enabled := M.Enabled;

      Break;

    end;

end;

 

// retorna o estado de todos os itens do menu no formato arquivo1=S  novo1=S  salvar1=N

procedure GetMenusState(const Menu: TMainMenu; var Lista: TStringList); overload; 

var

  I: Integer;

  // funcao usada para pegar submenus

  procedure GetMenuSubItems(Menu: TMenuItem);

  var

    I: Integer;

  begin

    // For no Itens se o Items > 0  Faz recursividade

    for I := 0 to Pred(Menu.Count) do

    begin

      if (Menu.Items[I].Caption <> '-') then // adiciona nó com o nome do menu como .Data (pointer)

        Lista.Add(Menu.Items[I].Name + '=' + IfThen(Menu.Items[I].Enabled, 'S''N'));

      // se ESTE item tem sub-menus seta o nó como este atual e entra novamente na funcao (recursividade)

      if Menu.Items[I].Count > 0 then

        GetMenuSubItems(Menu.Items[I]);

    end;

  end;

begin

  Lista.Clear;

  for I := 0 to Pred(Menu.Items.Count) do    // percorre todos os itens de menu

  begin

    Lista.Add(Menu.Items[I].Name + '=' + IfThen(Menu.Items[I].Enabled, 'S''N'));

    GetMenuSubItems(Menu.Items[I]);

  end;

end;

 

// retorna o estado de todos os itens da TreeView no formato arquivo1=S  novo1=S  salvar1=N

procedure GetMenusState(const Tree: TATreeView; var Lista: TStringList); overload; 

var

  I: Integer;

begin

  Lista.Clear;

  for I := 0 to Pred(Tree.Items.Count) do    // percorre todos os itens da treeview

    Lista.Add(StrPas(Tree.Items[I].Data) + '=' + IfThen(Tree.Items[I].StateIndex <> 2'S''N'));

end;

 

// coloca um "x" no nó passado como parametro (nome do menu)

procedure SetMarcaNode(const Nome: string);

var

  I: Integer;

begin

  for I := 0 to ATree.Items.Count-1 do

    if StrPas(ATree.Items[I].Data) = Nome then

    begin

      ATree.Items[I].StateIndex := 2;

      Break;

    end;

end;

 

// Exemplos

 

// desabilita menu arquivo

HabilitaItemMenu(Self, 'mArquivo', False, Panel1);

 

// captura estados dos menus numa memo

procedure BtnClick(Sender: TObject);

var

  L: TStringList;

begin

  L := TStringList.Create;

  GetMenusState(MainMenu1, L);

  Memo1.Lines := L;

  L.Free;

end;

 

// TREEVIEW -> QUERY

// para gravar da TreeView para arquivo (só grava os ticados)

for I := 0 to ATree.Items.Count-1 do

  if ATree.Items[I].StateIndex = 2 then

    DM.Query.Execute('insert into acessos (menuativo) values (' + 

          QuotedStr(StrPas(ATree.Items[I].Data)) + ')');

           

// QUERY -> TREEVIEW

// carrega menus

MenuItemsToTreeView(MainSuperForm.Menu, ATree);

ATree.FullExpand;

ATree.Selected := ATree.Items[0];

// carrega configuracoes deste usuário

NenhumBtnClick(NenhumBtn); // desmarca todos nós

if DM.Query.Select('menuativo from acessos where cod_user=' + Cod_User) then

  while not DM.Query.Eof do

  begin

    SetMarcaNode(DM.Query.Campo('menuativo'));

    DM.Query.Next;

  end;