Abrindo Forms MDI de um BPL

Crie um Projeto novo. Em seguida vá até as propriedades do projeto, na aba Packages ,e selecione: Build with runtime packages.

Isto dará uma drastica mudança de tamanho no executável. De 350k ele passa a ter 16k, mas o projeto fica dependente da rtlXX.bpl e VCL.bpl

Tudo bem. Certifique-se que o campo abaixo do check contenha apenas isso: vcl;rtl

Salve tudo e feche tudo com o Close All

Salve tudo e feche tudo com o Close All. Crie um Pacote e coloque um formulário nele. Certifique-se de que o formulário está em modo fsMDIChild.

Chamando formulários de arquivos BPL

Na ação OnClose do form, coloque isso:


procedure TFormMDIChildBPL.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

Agora adicione este procedimento:


procedure ExecutarChild;
begin
  TFormMDIChildBPL.Create(Application);
end;

Este procedimento fará com que quando ele for chamado, o mesmo abra o formulário que está guardado no BPL. Antes do END. adicione isto:


exports
  ExecutarChild; 

Fique atento! Para exportação de procedimentos vale a regra do CaseSensitive!

Pronto. O pacote está ok. Compile ele agora. e salve tudo. Depois feche tudo e volte para o aplicativo que abre o form do BPL.

Agora, no fomulário principal do aplicativo onde você vai chamar o form do BPL, escreva estes códigos nos seguintes setores.


type
  TExecutarChild = procedure; //tipo do procedimento de chamada do BPL
...

private
    ModuloDoPacote: HModule;
    ExecutarChild : TExecutarChild;
    procedure CarregarPacote;
end;

Adicione este procedimento para que possa ser chamado o package.


procedure TForm1.CarregarPacote;
begin
  //Tenta carregar o pacote...
  ModuloDoPacote := LoadPackage(`SeuPacote.bpl`);

  //se carregou, tenta localizar o procedure
  if ModuloDoPacote  <> 0 then
    try
      @ExecutarChild := GetProcAddress(ModuloDoPacote, `ExecutarChild`);
    except
      ShowMessage (Pacote não Encontrado);
    end;
end;

Pronto, agora está abrindo o pacote. Insira um botão na tela, e no evento OnClick, coloque o seguinte código:


  //Se o pacote não estiver carregado ele cerrega.
  if ModuloDoPacote = 0 then CarregarPacote;

  //se o procedimento estiver colocado na memória ele executa o procedimento
  if Assigned(ExecutarChild) then ExecutarChild;

E... o produto final:

Chamando formulários de arquivos BPL