Chamando formulários de arquivos BPL

Artigo que aborda a idéia de compilar Packages com formulários contidos nele, e depois faze-lo chamar dinamicamente.

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:

Artigos relacionados