Criando um ActionMainMenu dinamicamente

Delphi

23/06/2010

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
Emiliano Fernandes

Emiliano Fernandes

Curtidas 0
POSTAR