CRIAR UM MENU APATIR DE UMA TABELA DO BANCO

Delphi

30/01/2009

Quero fazer um software onde o meu menu vai ser criado em tempo de execução através de uma tabela.

Na tabela vai ter os campos
NomeMenu Caption Nive1 Nivel2 Nivel3
Abaixo a tabela preenchida com alguns itens

NomeMenu Caption Nivel1 Nivel2 Nivel3
-------------------------------------------------------------------------
MnuCadastro Cadastro 1 0 0
MnuCadastroClientes Clientes 1 1 0
MnuCadastroProdutos Produtos 1 2 0
MnuLocalizar Localizar 2 0 0
MnuLocalizarClientes Clientes 2 1 0
MnuLocalizarProdutos Produtos 2 2 0
MnuRelatorio Relatorio 3 0 0
MnuRelatorioClientes Clientes 3 1 0
MnuRelatorioClientesDiario Diário 3 1 1
MnuRelatorioClientesMensal Mensal 3 1 2
MnuRelatorioProdutos Produtos 3 2 0
MnuRelatorioProdutosDiario Diário 3 2 1
MnuRelatorioProdutosMensal Mensal 3 2 2

Menu resultante

Cadastro Localizar Relatorio
Clientes Clientes Clientes--> Diário
Mensal
Produtos Produtos Produtos--> Diário
Mensal

Procedimento utilizado para criar o menu

procedure TForm.CriarMenu;
var
QryMenu:TQuery;
MenuPrincipal:TMainMenu;
ItemMenu:array of TMenuItem;
i,j:integer;
Rotina: procedure of object; // aqui começa a mudança
Begin
MenuPrincipal:=TMainMenu.Create(self); //Criar o menu
QryMenu:=TQuery.Create(self); //Criar a query
QryMenu.DatabaseName:=´sistema´; //Nome do meu alias(Em paradox)
//Selecionar todos os campos e ordenar de modo que crie um menu por vez
QryMenu.sql.Add(´select * from menus order by nivel1,nivel2,nivel3´);
QryMenu.Open;
SetLength(ItemMenu,QryMenu.RecordCount);//Define o tamanho do vetor de itens do menu
i:=0;
while not QryMenu.Eof do
begin
ItemMenu[i]:=TMenuItem.Create(self); //Criar item do menu
ItemMenu[i].Name:=QryMenu.FieldByName(´NomeMenu´).Value;
ItemMenu[i].Caption:=QryMenu.FieldByName(´Caption´).Value;

// aqui ´pega´ a procedure. note que a rotina deve estar no próprio formulário.
if QryMenu.FieldByName(´NomeMenu´).AsString <> EmptyStr then
begin
@Rotina := MethodAddress(QryMenu.FieldByName(´NomeMenu´).AsString);
// aqui verifica se a rotina existe.
if Assigned(Rotina) then
try
ItemMenu[i].OnClick:=TNotifyEvent(Rotina); //aqui atribui a rotina ao evento OnClick
except
end;
end;

if QryMenu.FieldByName(´nivel2´).Value=0 then //Se for menu
begin
MenuPrincipal.Items.Add(ItemMenu[i]); //Adiciona no principal
j:=i;
end
else
if QryMenu.FieldByName(´nivel3´).Value<>0 then //Se for item de submenu ex:Diário e mensal
ItemMenu[j+QryMenu.FieldByName(´nivel2´).AsInteger].Add(ItemMenu[i])
else //Se for comando de menu
ItemMenu[j].Add(ItemMenu[i]);
inc(i);
QryMenu.Next;
end;
end;

ATÉ AQUI BELEZA , AGORA IMPLEMENTEI NA TABELA UM NOVO CAMPO :
NIVEL4 E AI? COMO FICARIA A PROCEDURE,CONSIDERANDO QUE EXISTISSE UM 4 NIVEL DE MENU? JA TENTEI COMPLEMENTALA NA CONDIÇÃO DE EXITIR UM UM COMPO: NIVEL4 MAIS NAUM CONSIGO. PODES ME AJUDAR?


El-loeco

El-loeco

Curtidas 0

Respostas

Woinch

Woinch

30/01/2009

Amigo, não tive tempo de olhar seu código... mas vou lhe dar uma idéia...
Já ouviu falar em recursividade?

Faça uma tabela com o seguinte:

MENU CAPTION MENUPAI
-----------------------------
MnuCadastro Cadastro NULL
MnuCadastroCliente Cliente MnuCadastro
MnuCadastroProdutos Produtos MnuCadastro
MnuNivel4 Nível4 MnuCadastroProdutos

Entendeu?

Ai a função para montar o menu teria um parâmetro que seria o MenuPai. Na select ele buscaria todos os menus que tem aquele parâmetro como MenuPai e montaria os mesmos chamando (dentro do loop) novamente a função para montar o Menu passando agora como parâmetro o Menu que está sendo montado. Ai se o resultado da select não retornar nada ele sai da função. Se não entender posta ai que a gente tenta te dar algum exemplo.


Abraços...


GOSTEI 0
POSTAR