MainMenu Dinâmico?
Salve galera!
Estive pensando, num sistema meu que quero montar dividindo os módulos em [b:ad31d754bb]DLLs [/b:ad31d754bb]separadas.
Dae, no caso eu pensei em controlar os modulos pelo banco de dados. Onde teria uma tabela com o nome da dll, nome do menu-pai, e procedimento a ser executado, ex:
[b:ad31d754bb]dll:[/b:ad31d754bb][i:ad31d754bb]arquivo.dll[/i:ad31d754bb]
[b:ad31d754bb]menupai:[/b:ad31d754bb][i:ad31d754bb]relatorios[/i:ad31d754bb]
[b:ad31d754bb]itemdemenu:[/b:ad31d754bb][i:ad31d754bb]Relatório de &Clientes[/i:ad31d754bb]
[b:ad31d754bb]procedimento:[/b:ad31d754bb][i:ad31d754bb]rel_clientes[/i:ad31d754bb]
Supondo que na dll exista um procedimento chamado [b:ad31d754bb]rel_clientes[/b:ad31d754bb] que cuida de montar o relatório.
Isso teria que ser acrescentado no menu RELATÓRIOS, criando um item cujo caption seria ´Relatório de [u:ad31d754bb]C[/u:ad31d754bb]lientes´ e que, qdo clicado executasse o procedimento [b:ad31d754bb]rel_clientes[/b:ad31d754bb]
Dessa forma, eu poderia habilitar/desabilitar ou até mesmo incluir novos opções e módulos ao meu sistema sem ter que recompilar todo o projeto.
Não sei se essa idéia é viagem, mas será que algúem tem alguma dica ou algo a esclarecer??
Outra coisa que fiquei pensando!!! Criar um item de menu em runtime seria fácil, mas dai como relacionar o evento [b:ad31d754bb]OnClick[/b:ad31d754bb] desse item com um procedimento (da dll), sendo que no banco o nome do procedimento estaria gravado na forma de string(varchar);.
Falow galera!
Estive pensando, num sistema meu que quero montar dividindo os módulos em [b:ad31d754bb]DLLs [/b:ad31d754bb]separadas.
Dae, no caso eu pensei em controlar os modulos pelo banco de dados. Onde teria uma tabela com o nome da dll, nome do menu-pai, e procedimento a ser executado, ex:
[b:ad31d754bb]dll:[/b:ad31d754bb][i:ad31d754bb]arquivo.dll[/i:ad31d754bb]
[b:ad31d754bb]menupai:[/b:ad31d754bb][i:ad31d754bb]relatorios[/i:ad31d754bb]
[b:ad31d754bb]itemdemenu:[/b:ad31d754bb][i:ad31d754bb]Relatório de &Clientes[/i:ad31d754bb]
[b:ad31d754bb]procedimento:[/b:ad31d754bb][i:ad31d754bb]rel_clientes[/i:ad31d754bb]
Supondo que na dll exista um procedimento chamado [b:ad31d754bb]rel_clientes[/b:ad31d754bb] que cuida de montar o relatório.
Isso teria que ser acrescentado no menu RELATÓRIOS, criando um item cujo caption seria ´Relatório de [u:ad31d754bb]C[/u:ad31d754bb]lientes´ e que, qdo clicado executasse o procedimento [b:ad31d754bb]rel_clientes[/b:ad31d754bb]
Dessa forma, eu poderia habilitar/desabilitar ou até mesmo incluir novos opções e módulos ao meu sistema sem ter que recompilar todo o projeto.
Não sei se essa idéia é viagem, mas será que algúem tem alguma dica ou algo a esclarecer??
Outra coisa que fiquei pensando!!! Criar um item de menu em runtime seria fácil, mas dai como relacionar o evento [b:ad31d754bb]OnClick[/b:ad31d754bb] desse item com um procedimento (da dll), sendo que no banco o nome do procedimento estaria gravado na forma de string(varchar);.
Falow galera!
Eniorm
Curtidas 0
Respostas
Eniorm
05/08/2005
(sobe)
GOSTEI 0
Sistemald
05/08/2005
Rapaz, ja vi um sistema assim, que o menu era montato em cima de um arquivo texto, nesse arquivo texto continha o seguinte(eu acho que era o seguinte)
cabeçalho:
Tipo: sera menu principal, ou subtitulo
nome:Nome que devera aparecer
funcao: onde funcao informava qual form abrir
cabeçalho:
Tipo: sera menu principal, ou subtitulo
nome:Nome que devera aparecer
funcao: onde funcao informava qual form abrir
GOSTEI 0
Eniorm
05/08/2005
subindo :(
GOSTEI 0
Eniorm
05/08/2005
sobe
GOSTEI 0
Eniorm
05/08/2005
sobe
GOSTEI 0
Eniorm
05/08/2005
sobe
GOSTEI 0
Sistemald
05/08/2005
Não tentei aqui, mas tenta algo assim
guarde em um arquivo .ini os menus quais deverá aparecer
Tipo assim:
Tipo*Nome$menupai|Procedimento
M*CLiente$null|frmcliente
ao ler esta linha você deverá verificar a primeira letra
ao ler a primeira letra você saberá que é um menu principal
a segunda parte que vai do ´*´ até ´$´ é titulo.
a terceira parte só precisa le se for submenu.
a quarta parte é procediemnto nele contem o formulario que deverá ser aberto. use algo do tipo abaixo:
espero ter ajudado
guarde em um arquivo .ini os menus quais deverá aparecer
Tipo assim:
Tipo*Nome$menupai|Procedimento
M*CLiente$null|frmcliente
ao ler esta linha você deverá verificar a primeira letra
ao ler a primeira letra você saberá que é um menu principal
a segunda parte que vai do ´*´ até ´$´ é titulo.
a terceira parte só precisa le se for submenu.
a quarta parte é procediemnto nele contem o formulario que deverá ser aberto. use algo do tipo abaixo:
for i := 0 to application.ComponentCount - 1 do begin if application.Components[i] is TForm then begin if (application.Components[i] as Tform).name = nomeprocurado then (application.Components[i] as Tform).show; end; end;
espero ter ajudado
GOSTEI 0
Eniorm
05/08/2005
sobe
GOSTEI 0
Andremuller
05/08/2005
Essa idéia é tranquila de implementar. Eu fiz um framework que carrega os módulos e ítens de menu de acordo com o que eu colocar no banco. Pra isso eu exporto sempre a mesma assinaturma de método.
Você poderia, por exemplo, setar como Tag de cada ítem um código único onde tu tem na base qual dll executar, aí setar o OnClick pra disparar o mesmo evento para todos ítens, pegar pela Tag qual a dll a chamar e executar o método padrão para aquele módulo
Você poderia, por exemplo, setar como Tag de cada ítem um código único onde tu tem na base qual dll executar, aí setar o OnClick pra disparar o mesmo evento para todos ítens, pegar pela Tag qual a dll a chamar e executar o método padrão para aquele módulo
GOSTEI 0
Eniorm
05/08/2005
brothers!! hoje estou fazendo testes de modularização com BPL e não mais com dlls (desisti rsrssr) e estou achando muito mais prático trabalhar com os Bpls...
a dúvida quanto ao MainMenu Dinâmico persiste, supondo que na minha [b:38d84186e8]tabela [/b:38d84186e8]eu teria algo do tipo:
* todos varchar(string)
Onde [b:38d84186e8]´clientes.bpl´[/b:38d84186e8] seria o módulo a ser usado
Caption seria o [b:38d84186e8]Caption [/b:38d84186e8]a ser exibido no TMenuItem filho que será incluído no MainMenu
O método [b:38d84186e8]´abrecadastroclientes´[/b:38d84186e8] é o nome do procedimento [b:38d84186e8]exportado [/b:38d84186e8]de dentro do meu módulo que abre o form de cadastro.
a dúvida que fica é: como eu vou associar o método exportado ao evento OnClick do meu TMenuItem filho?
O compilador diz que MeuItem.OnClick deve receber um tal de [b:38d84186e8]TNotifyEvent[/b:38d84186e8]
abraços.
a dúvida quanto ao MainMenu Dinâmico persiste, supondo que na minha [b:38d84186e8]tabela [/b:38d84186e8]eu teria algo do tipo:
ModuloBpl: ´clientes.bpl´ Metodo: ´abrecadastroclientes´ Caption: ´&Cadastro Clientes´;
* todos varchar(string)
Onde [b:38d84186e8]´clientes.bpl´[/b:38d84186e8] seria o módulo a ser usado
Caption seria o [b:38d84186e8]Caption [/b:38d84186e8]a ser exibido no TMenuItem filho que será incluído no MainMenu
O método [b:38d84186e8]´abrecadastroclientes´[/b:38d84186e8] é o nome do procedimento [b:38d84186e8]exportado [/b:38d84186e8]de dentro do meu módulo que abre o form de cadastro.
a dúvida que fica é: como eu vou associar o método exportado ao evento OnClick do meu TMenuItem filho?
O compilador diz que MeuItem.OnClick deve receber um tal de [b:38d84186e8]TNotifyEvent[/b:38d84186e8]
abraços.
GOSTEI 0
Eniorm
05/08/2005
sobe
GOSTEI 0
Emerson Nascimento
05/08/2005
crie o método OnClick do item:
ao criar os itens de menu, os associe ao evento criado e ao registro da ´tabela´ de menu (use o tag ou alguma outra propriedade).
NovoItem.Tag := TabelaMenu.Recno;
NovoItem.OnClick := ItemMenuClick;
procedure TForm1.ItemMenuClick(Sender: TObject); var modulo: Hmodule; proc: procedure; begin // posiciona no registro TabelaMenu.Recno := TComponent(Sender).Tag; // agora você atribui à proc o procedimento apontado no registro modulo := LoadPackage(TabelaMenuModulo.AsString); @proc := GetProcAddress(modulo, TabelaMenuMetodo.AsString); proc; end;
ao criar os itens de menu, os associe ao evento criado e ao registro da ´tabela´ de menu (use o tag ou alguma outra propriedade).
NovoItem.Tag := TabelaMenu.Recno;
NovoItem.OnClick := ItemMenuClick;
GOSTEI 0
Eniorm
05/08/2005
Blza Emerson... já consegui ter uma ideia de como eu devo proceder, valeu pela ajuda!
GOSTEI 0