 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
juninoguitarr Novato

Registrado: Terça-Feira, 18 de Abril de 2006 Mensagens: 10
|
Enviada: Seg Mai 13, 2013 12:50 pm Assunto: Listar submenus em um form |
|
|
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 |
|
 |
Batera Colaborador


Registrado: Quarta-Feira, 23 de Julho de 2008 Mensagens: 4899 Localização: Maringá
|
Enviada: Seg Mai 13, 2013 8:39 pm Assunto: |
|
|
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 |
|
 |
labambamogi Aprendiz

Registrado: Sexta-Feira, 4 de Novembro de 2011 Mensagens: 120
|
Enviada: Sex Mai 31, 2013 4:40 pm Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|