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;
|