Fórum Modularização com Packages #358120
06/05/2008
0
1) em meus módulos onde eu implemento os métodos para instanciar os forms, e onde eu exporto tais métodos?
2) onde que eu implemento tarefas a serem executadas no Initialization e Finalization de cada pacote?
3) ao carregar um pacote, um datamodule de tal pacote estará disponível ou tenho que o instanciá-lo.
Cordialmente,
Eniorm
Curtir tópico
+ 0Posts
07/05/2008
Eniorm
Gostei + 0
07/05/2008
Thiago Vidal
voce cria o projeto dpk que compila numa BPL, com as suas units. e depois, basta referenciá-las no seu executável como se fizessem parte do mesmo projeto, que o delphi se encarrega de ligar tudo.
por exemplo:
voce tem um pacote.dpk com as units uDM.pas e uForm.pas que contém respectivamente um datamodule e um form.
no seu projeto.dpr, voce tem apenas o arquivo uPrincipal.pas, cuja cláusula uses inclui uDM e uForm.
simplesmente se vc compilar assim, o Delphi irá embutir uDM.dcu e uForm.dcu dentro do seu projeto.exe, mesmo elas não fazendo parte deste projeto.
Para deixá-las separadas, vc deve ir em Component/Install Packages, ligar o check ´Build with runtime packages´ e para embutir TODOS os pacotes da VCL e deixar o link apenas com o seu pacote.dpk, vc apaga tudo e escreve apenas o nome do pacote (sem extensao bpl).
agora, ao recompilar o seu projeto.exe, ele nao incluira as units uDM e uForm, sendo necessário enviar o arquivo pacote.bpl junto para que funcione corretamente.
espero ter sido claro. qualquer se nao entendeu alguma coisa, pode perguntar por aqui que eu respondo! um abraço.
Gostei + 0
07/05/2008
Eniorm
então cara montar os pacotes e compilar eu já consegui, no entanto eu vou fazer a carga dinâmica deles atraves de LoadPackage.
A dúvida é saber onde executar os Initialization, onde exportar os procedimentos etc...
abraços
Gostei + 0
08/05/2008
Emerson Nascimento
por exemplo, nas units de formulário, faça:
initialization RegisterClass(TFormX); finalization UnRegisterClass(TFormX);
antes do ´end.´
depois, para abrir o form:
var Classe: TComponentClass; idModulo: hModule; FormCriado: TForm; begin idModulo:= LoadPackage(strPacote); if idModulo <= 0 then begin ShowMessage(´Não foi possivel carregar o pacote ´+strPacote); exit; end; FormCriado := nil; // verifico se o form já está criado, // pois não permito abrir um mesmo // form duas vezes (opcional) for i := 0 to Screen.CustomFormCount - 1 do if UpperCase(Screen.CustomForms[i].Name) = UpperCase(NomeDoForm) then begin FormCriado := TForm(Screen.CustomForms[i]); break; end; if FormCriado = nil then try Classe := TComponentClass(FindClass(NomeDaClasseDoForm)); FormCriado := TComponentClass(Classe).Create(Self) as TForm; with FormCriado do begin Caption := strCaption; Tag := idModulo; Show;// se necessário end; except Classe := nil; ShowMessage(´A classe ´+NomeDaClasseDoForm+´ não pertence ao pacote ´+strPacote); end; end;
Gostei + 0
12/05/2008
Eniorm
estou fazendo assim eu crio na unit um procedimento e exporto-o para instanciar e mostrar o form... mas tem acontecido algo estranho...
ao abrir o form contido num package até vai de boa, acontece que se a partir deste form eu abrir outro tbm contido no package, aparentemente ele perde alguns procedimentos herdados...
no meu caso da pra ilustrar assim
aplicação.exe | |-> dispara o form dentro de modulo.bpl | |-> este form tem um botao que chama outro form contido no mesmo pacote
achei estranho o fato que de em todos os meus forms, no evento OnClose, eu coloco o cod:
FreeAndNil(NomeDoForm)
no entando este último form, aberto por um click dentro de um form já aberto, este procedimento não é executado.... :(
Gostei + 0
14/05/2008
Eniorm
initialization RegisterClass(TFormX); finalization UnRegisterClass(TFormX);
a dúvida que ficou é, seria melhor instanciar pela classe, ou por procedimentos dentro de cada unit? atualmente eu faço dessa última forma!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)