Fórum Criando um ActionMainMenu dinamicamente #380049
23/06/2010
0
Olá pessoal,
Vi numas das video aulas do Rodrigo Carreiro a criação do menu como o ActionManage e o ActionMainMenu direto no componente, só que em nossa aplicação criamos o menu dinamicamente baseado no módulo que o cliente esta vai usar segundo as definições armazenadas numa tabela de configuração existente no banco de dados.
Neste caso usamos o menu normal do delphi. Não conseguí criar usando o ActionManage adicionando as Actions e linkando com o ActionMainMenu.
Alguem já criou que possa nos ajudar?
Em nossa aplicação fazemos dessa forma:
procedure TfrmMain.MontaMenu(sModulo, sGrupo : string);var i : smallint; ItemMenu, ParentMenu, MenuModulo : TMenuItem; sLinha, sAtalho, sChamada, sCodigo, sOpcao, sStatus : string; sPrincipalList, sFuncoesList, sAcessoList : TStringList; function FindParent(Item : TMenuItem; sItemCod : string): TMenuItem; var i, j : smallint; begin sItemCod := copy(sItemCod, 1, length(sItemCod) - 3); while length(sItemCod) > 0 do begin i := strtoint(copy(sItemCod, 1, 2)); for j := 0 to Item.Count - 1 do if Item[j].MenuIndex = i then begin Item := Item[j]; break; end; sItemCod := copy(sItemcod, 4, length(sItemCod)); end; Result := Item; end;
begin
try
mnuMain.Items.Clear;
//********Montagem do Menu Principal******************* //Linhas do stringlist : 'CHAMADA|CODIGO|TEXTO_OPCAO|STATUS'
sPrincipalList := sGetMenuPrincipalList(sModulo, sGrupo); for i := 0 to sPrincipalList.count - 1 do begin sLinha := sPrincipalList.strings[i]; sAtalho := copy(sLinha, 1, pos('|', sLinha) - 1); sLinha := copy(sLinha, pos('|', sLinha) + 1, Length(sLinha)); sChamada := copy(sLinha, 1, pos('|', sLinha) - 1); sLinha := copy(sLinha, pos('|', sLinha) + 1, Length(sLinha)); sCodigo := copy(sLinha, 1, pos('|', sLinha) - 1); sLinha := copy(sLinha, pos('|', sLinha) + 1, Length(sLinha)); sOpcao := copy(sLinha, 1, pos('|', sLinha) - 1); sLinha := copy(sLinha, pos('|', sLinha) + 1, Length(sLinha)); sStatus := sLinha; ItemMenu := TMenuItem.Create(mnuMain); ItemMenu.Caption := sOpcao; if trim(sAtalho) <> '' then ItemMenu.ShortCut := TextToShortCut(sAtalho); ItemMenu.Hint := sChamada; ItemMenu.OnClick := pMenuClick; ItemMenu.Enabled := sStatus = 'H'; ParentMenu := FindParent(mnuMain.Items, sCodigo); if ParentMenu <> nil then ParentMenu.Add(ItemMenu) else mnuMain.Items.Add(ItemMenu); end;
//********Montagem do Menu de Funções Gerais / Janelas******************* //Linhas do stringlist : 'TEXTO_OPÇÃO|CHAMADA'
sFuncoesList := sGetMenuFuncoesList; if sFuncoesList.Count <> 0 then //O modulo gerenciador nao carrega o menu acesso begin MenuModulo := TMenuItem.Create(mnuMain); MenuModulo.Caption := 'Janelas'; for i := 0 to sFuncoesList.Count - 1 do begin sLinha := sFuncoesList[i]; //Lista de itens do menu acesso ItemMenu := TMenuItem.Create(mnuMain); ItemMenu.Caption := copy(sLinha, 1, pos('|', sLinha) - 1); ItemMenu.Hint := copy(sLinha, pos('|', sLinha) + 1, length(sLinha)); ItemMenu.OnClick := pMenuClick; MenuModulo.Add(ItemMenu); end; if mnuMain.Items.Find('Miscelânea') <> nil then begin mnuMain.Items.Find('Miscelânea').Add(MenuModulo); MenuModulo.MenuIndex := 0; end else mnuMain.Items.Add(MenuModulo); end;
//********Montagem do Menu Acesso******************* //Linhas do stringlist : 'TEXTO_OPÇÃO|CHAMADA'
sAcessoList := sGetMenuAcessoList(sGrupo); if sAcessoList.Count <> 0 then //O modulo gerenciador nao carrega o menu acesso begin MenuModulo := TMenuItem.Create(mnuMain); MenuModulo.Caption := 'Acesso'; for i := 0 to sAcessoList.Count - 1 do begin sLinha := sAcessoList[i]; //Lista de itens do menu acesso ItemMenu := TMenuItem.Create(mnuMain); ItemMenu.Caption := copy(sLinha, 1, pos('|', sLinha) - 1); ItemMenu.Hint := copy(sLinha, pos('|', sLinha) + 1, length(sLinha)); ItemMenu.OnClick := pMenuClick; MenuModulo.Add(ItemMenu); end;
if mnuMain.Items.Find('Sistema') <> nil then begin mnuMain.Items.Find('Sistema').Add(MenuModulo); MenuModulo.MenuIndex := 0; end else mnuMain.Items.Add(MenuModulo); end;
except mnuMain.Items.Clear; end;
end;
procedure TfrmMain.pMenuClick(Sender : TObject);begin pExecuteChamada(TMenuItem(Sender).Hint);end;
Estou querendo aperfeiçoar nossa aplicação.
Emiliano Fernandes
Vi numas das video aulas do Rodrigo Carreiro a criação do menu como o ActionManage e o ActionMainMenu direto no componente, só que em nossa aplicação criamos o menu dinamicamente baseado no módulo que o cliente esta vai usar segundo as definições armazenadas numa tabela de configuração existente no banco de dados.
Neste caso usamos o menu normal do delphi. Não conseguí criar usando o ActionManage adicionando as Actions e linkando com o ActionMainMenu.
Alguem já criou que possa nos ajudar?
Em nossa aplicação fazemos dessa forma:
procedure TfrmMain.MontaMenu(sModulo, sGrupo : string);var i : smallint; ItemMenu, ParentMenu, MenuModulo : TMenuItem; sLinha, sAtalho, sChamada, sCodigo, sOpcao, sStatus : string; sPrincipalList, sFuncoesList, sAcessoList : TStringList; function FindParent(Item : TMenuItem; sItemCod : string): TMenuItem; var i, j : smallint; begin sItemCod := copy(sItemCod, 1, length(sItemCod) - 3); while length(sItemCod) > 0 do begin i := strtoint(copy(sItemCod, 1, 2)); for j := 0 to Item.Count - 1 do if Item[j].MenuIndex = i then begin Item := Item[j]; break; end; sItemCod := copy(sItemcod, 4, length(sItemCod)); end; Result := Item; end;
begin
try
mnuMain.Items.Clear;
//********Montagem do Menu Principal******************* //Linhas do stringlist : 'CHAMADA|CODIGO|TEXTO_OPCAO|STATUS'
sPrincipalList := sGetMenuPrincipalList(sModulo, sGrupo); for i := 0 to sPrincipalList.count - 1 do begin sLinha := sPrincipalList.strings[i]; sAtalho := copy(sLinha, 1, pos('|', sLinha) - 1); sLinha := copy(sLinha, pos('|', sLinha) + 1, Length(sLinha)); sChamada := copy(sLinha, 1, pos('|', sLinha) - 1); sLinha := copy(sLinha, pos('|', sLinha) + 1, Length(sLinha)); sCodigo := copy(sLinha, 1, pos('|', sLinha) - 1); sLinha := copy(sLinha, pos('|', sLinha) + 1, Length(sLinha)); sOpcao := copy(sLinha, 1, pos('|', sLinha) - 1); sLinha := copy(sLinha, pos('|', sLinha) + 1, Length(sLinha)); sStatus := sLinha; ItemMenu := TMenuItem.Create(mnuMain); ItemMenu.Caption := sOpcao; if trim(sAtalho) <> '' then ItemMenu.ShortCut := TextToShortCut(sAtalho); ItemMenu.Hint := sChamada; ItemMenu.OnClick := pMenuClick; ItemMenu.Enabled := sStatus = 'H'; ParentMenu := FindParent(mnuMain.Items, sCodigo); if ParentMenu <> nil then ParentMenu.Add(ItemMenu) else mnuMain.Items.Add(ItemMenu); end;
//********Montagem do Menu de Funções Gerais / Janelas******************* //Linhas do stringlist : 'TEXTO_OPÇÃO|CHAMADA'
sFuncoesList := sGetMenuFuncoesList; if sFuncoesList.Count <> 0 then //O modulo gerenciador nao carrega o menu acesso begin MenuModulo := TMenuItem.Create(mnuMain); MenuModulo.Caption := 'Janelas'; for i := 0 to sFuncoesList.Count - 1 do begin sLinha := sFuncoesList[i]; //Lista de itens do menu acesso ItemMenu := TMenuItem.Create(mnuMain); ItemMenu.Caption := copy(sLinha, 1, pos('|', sLinha) - 1); ItemMenu.Hint := copy(sLinha, pos('|', sLinha) + 1, length(sLinha)); ItemMenu.OnClick := pMenuClick; MenuModulo.Add(ItemMenu); end; if mnuMain.Items.Find('Miscelânea') <> nil then begin mnuMain.Items.Find('Miscelânea').Add(MenuModulo); MenuModulo.MenuIndex := 0; end else mnuMain.Items.Add(MenuModulo); end;
//********Montagem do Menu Acesso******************* //Linhas do stringlist : 'TEXTO_OPÇÃO|CHAMADA'
sAcessoList := sGetMenuAcessoList(sGrupo); if sAcessoList.Count <> 0 then //O modulo gerenciador nao carrega o menu acesso begin MenuModulo := TMenuItem.Create(mnuMain); MenuModulo.Caption := 'Acesso'; for i := 0 to sAcessoList.Count - 1 do begin sLinha := sAcessoList[i]; //Lista de itens do menu acesso ItemMenu := TMenuItem.Create(mnuMain); ItemMenu.Caption := copy(sLinha, 1, pos('|', sLinha) - 1); ItemMenu.Hint := copy(sLinha, pos('|', sLinha) + 1, length(sLinha)); ItemMenu.OnClick := pMenuClick; MenuModulo.Add(ItemMenu); end;
if mnuMain.Items.Find('Sistema') <> nil then begin mnuMain.Items.Find('Sistema').Add(MenuModulo); MenuModulo.MenuIndex := 0; end else mnuMain.Items.Add(MenuModulo); end;
except mnuMain.Items.Clear; end;
end;
procedure TfrmMain.pMenuClick(Sender : TObject);begin pExecuteChamada(TMenuItem(Sender).Hint);end;
Estou querendo aperfeiçoar nossa aplicação.
Emiliano Fernandes
Emiliano Fernandes
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)