ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Listar submenus em um form

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
juninoguitarr
Novato
Novato


Registrado: Terça-Feira, 18 de Abril de 2006
Mensagens: 10

MensagemEnviada: Seg Mai 13, 2013 12:50 pm    Assunto: Listar submenus em um form Responder com Citação

Olá Galera tudo bem?

É o seguinte, aqui na empresa temos um sistema muito grande e cada aba do menu tem um item Relatórios que tem vários itens de relatórios... e dessa forma temos ai acredito que mais ou menos 100 relatórios porém todos separados em todos os menus....

Pensei em otimizar isso fazendo um form só para menus.

Usei abas e em cada aba quero colocar os relatorios que contém em cada menu. Porém para que eu não precise toda vez que adicionar um novo relatório vir nessas abas e adicionálo também, gostaria que isso fosse feito altomáticamente.

Para isso gostaria de uma função que listasse todas os items dos relatórios não sei se me entenderam.

qualquer dúvida estou aguardando, abraços a todos.


fiz mais ou menos isso mas ainda não funcionou por que parece que estou trabalhando com o menu e não submenus...



Código:

procedure TFrmRelatoriosGerais.cxTabSheet2Enter(Sender: TObject);

var
Lista : TStringList;
ii : integer;

  procedure BuscaItem(Menu : TmenuItem; Nome: String);
  var i,ii : integer;
  ItemLista : string;

  begin
    for i:=0 to Menu.Count -1 do
      begin
        ItemLista:= StringReplace('>'+Menu.Items[i].Caption,'&','',[]);
        BuscaItem(Menu.Items[i],ItemLista);
        Lista.Add(ItemLista);
      end;

    Lista := TstringList.Create;

    for ii := 0 to Menu.Count -1 do
      begin
        BuscaItem(Menu.Items[ii],Menu.Items[ii].Caption);
      end;

     cxListBox1.items := Lista;
     ListBox1.Items := Lista;
     Label2.Caption := ItemLista;


  end;

begin


end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Batera
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Julho de 2008
Mensagens: 4899
Localização: Maringá

MensagemEnviada: Seg Mai 13, 2013 8:39 pm    Assunto: Responder com Citação

Boa noite!
Bacana a sua iniciativa, só não entendi muito bem como você gostaria de estruturar o visual.
Teria como postar uma imagem?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
labambamogi
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 4 de Novembro de 2011
Mensagens: 120

MensagemEnviada: Sex Mai 31, 2013 4:40 pm    Assunto: Responder com Citação

Onde você está colocando os itens que serão exibidos ? O ideal seria numa lista em TXT no servidor ou até mesmo numa tabela do seu banco de dados e a rotina varreria essa lista criando automaticamente os itens dos menus; pois pelo que parece (BuscaItem(Menu : TmenuItem...) você já está digitando os novos itens em tempo de projeto então não entendi onde estaria o automatismo.
Caso você opte pela solução que citei, você terá que criar 2 procedures. Uma MenuAddItem que criará os itens no Menu

Código:


function MenuAddItem(Sender: TMainMenu; ItemList: TStrings; Registro: integer; Clique: TNotifyEvent): TMenuItem;
var
   EsteItem, Item, NovoItem: TMenuItem;
   I: Integer;
begin
   Item := nil;

   for I := 0 to ItemList.Count -1 do
   begin
      EsteItem := MenuFindItem(Sender, Item, ItemList[i]);

      if EsteItem <> nil then
         Item := EsteItem
      else
      begin
         if I < Itemlist.count -1 then
         begin
            if I = 0 then
            begin
               Item := TMenuItem.Create(Sender);
               Item.Caption := Itemlist[i];
               Sender.Items.Add(Item);
            end
            else
            begin
               NovoItem := TMenuItem.Create(Item);
               NovoItem.Caption := StringReplace(Itemlist[i],'!','',[rfReplaceAll]);
               NovoItem.Enabled := Itemlist[i][1]<>'!';
               NovoItem.Visible := Itemlist[i][1]<>'*';
               Item.Add(NovoItem);
               Item := NovoItem;
            end;
         end else
         begin
            if I = 0 then
            begin
               Item := TMenuItem.Create(Item);
               Item.Caption := Itemlist[i];
               Item.Tag := Registro;
               Item.OnClick := Clique;
               Sender.Items.Add(Item);
            end
            else
            begin
               NovoItem := TMenuItem.Create(Item);
               NovoItem.Caption := StringReplace(Itemlist[i],'!','',[rfReplaceAll]);
               NovoItem.Enabled := Itemlist[i][1]<>'!';
               NovoItem.Visible := Itemlist[i][1]<>'*';
               NovoItem.Tag := Registro;
               NovoItem.OnClick := Clique;
               Item.Add(NovoItem); //ChildObject(Node, Itemlist[i], Bookmark);
               Item := NovoItem;
            end;
         end;
      end;
   end;
   Result := Item;
end;



Código:



function MenuFindItem(Sender: TMainMenu; Item: TMenuItem; Name: String): TMenuItem;
var
   i: integer;
   filho: TMenuItem;
begin
   filho := nil;

   if (Item <nil> 0) then
   begin
      filho := nil;
      for i := 0 to Item.Count-1 do
         if Item.Items[i].Caption = Name then
         begin
            filho := Item.Items[i];
            break;
         end;
   end
   else
   if (Item = nil) then
      for i := 0 to Sender.Items.Count-1 do
         if Sender.Items[i].Caption = Name then
         begin
            filho := Sender.Items[i];
            break;
         end;

  Result := filho;
end;


e oura que chamará o evento do item clicado

Código:

procedure TfrmPrincipal.MenuItemBaseClick(Sender: TObject);
var
  Rotina: TMethod;
  Executar: TExecutar;
  nPos: word;
  cTexto: string;
begin
  //Aqui o meu ClientDataSet cdsMenuSistema é quem guarda as rotinas lidas do menu do usuário ou do banco de dados
  //o campo Funcao é o que guarda a rotina a ser chamada
  cdsMenuSistema.RecNo := TComponent(Sender).Tag;

  if cdsMenuSistemaFuncao.AsString = 'Sair' then
    Close;

  Rotina.Data := Pointer(TForm(Self));
  Rotina.Code := TForm(Self).MethodAddress(cdsMenuSistemaFuncao.AsString);

  if Rotina.Code <> nil then
  begin
    Screen.Cursor := crHourGlass;
    Executar := TExecutar(Rotina);
    Executar;

    Screen.Cursor := crDefault;
  end;
end;



Como é tudo abstrato, parece um monte de código, mas na verdade é bastante simples.
Abraços e boa sorte.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB