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. Crie um Pacote e coloque um formulário nele. Certifique-se de que o formulário está em modo fsMDIChild.
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: