Fórum Modularização com Packages #358120

06/05/2008

0

amigos, depois de uma batalha com os packaes, minhas dúvidas é a seguinte...

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

Eniorm

Responder

Posts

07/05/2008

Eniorm

vou ter q mandar um up, pois ainda não encontrei na net a solução :(


Responder

Gostei + 0

07/05/2008

Thiago Vidal

para trabalhar com pacotes, a utilização é idência.

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.


Responder

Gostei + 0

07/05/2008

Eniorm

opa! e ai brother!
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


Responder

Gostei + 0

08/05/2008

Emerson Nascimento

coloque as cláusulas initialization/finalization em todas as units onde tenha algo a tornar público.
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;



Responder

Gostei + 0

12/05/2008

Eniorm

valew amigo vou tentar dessa forma...

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.... :(


Responder

Gostei + 0

14/05/2008

Eniorm

coloque as cláusulas initialization/finalization em todas as units onde tenha algo a tornar público. por exemplo, nas units de formulário, faça:
initialization
   RegisterClass(TFormX);

finalization
   UnRegisterClass(TFormX);
antes do ´end.´



a dúvida que ficou é, seria melhor instanciar pela classe, ou por procedimentos dentro de cada unit? atualmente eu faço dessa última forma!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar