delphi - Alterar propriedades de um componente contido em um módulo do sistema - Stack Overflow em Português
Estou modulando um sistema desenvolvido em Delphi XE3. Um dos meus módulos denomidados Default possui um dmDados com uma conexão. Na minha aplicação principal, no onShow do meu Form principal estou carregando o módulo e tentando desconectar o meu componente de conexão:
LoadPackage('modules/Default.bpl');
dm_Connection.ZConnection.Disconnect;
Mas estou recebendo uma mensagem de Access Violation. Acredito que não estou fazendo da maneira correta. Como devo fazer?
editada 3/05/14 às 23:26
Possivelmente quando você carrega a bpl, o seu datamodule ainda não esteja carregado. se vc fizer dm_Connection := TdmDados.Create(Application); – Caputo 4/05/14 às 2:03
O que instancia os forms e datamodules em uma aplicação Delphi é o código contido no corpo do programa principal (arquivo .DPR). O Delphi coloca este código de forma automática cada vez que um novo form ou datamodule é adicionado ao projeto, quando se trata de um projeto para gerar um .EXE.
Quando se trata de uma projeto de package no entanto, tal código não é automaticamente incluído.
Será necessário que você instancie manualmente todos os objetos que desejar dentro de um package. Isso é especialmente verdade quando o programador decide fazer a carga do runtime package manualmente, como parece que é o que você está fazendo (chamando LoadPackage).
Uma forma de pré-inicializar uma série de objetos dentro do package é escolher uma unit e adicionar o código para a criação das instância no initialization desta unit.
Quando um package é carregado, o código existente dentro da sessão initialization de todas as units é executado em alguma ordem sem controle. Quando o package é descarregado, o código existente dentro das sessões finalization de todas as units é executado, novamente sem uma garantia de ordem.
Recomendo a leitura um artigo interessante que pode ser de boa valia para você. Este artigo faz uma comparação entre o uso de DLLs e packages e mostra como estes últimos são mais fáceis e diretos, pois todos os tipos declarados dentro dele ficam disponíveis para uso tão logo o package seja carregado.
67033 medalhas de prata1111 medalhas de bronze
Só uma dúvida, para pré-inicializar um objeto é apenas Application.CreateForm(TDF001a, DF001a);, por exemplo? – Thiago Thaison 5/05/14 às 15:06
@ThiagoThaison: o método Application.CreateForm é indicado para a criação de forms, datamodules, frames e seus descendentes (mas funciona com qualquer componente). Para instanciar uma classe que não seja um destes (uma instância de TUsuario, por exemplo) usa-se o constructor diretamente. Até mesmo para forms se poderia usar o constructor diretamente. O que o método em questão faz é instanciar e atribuir para a variável passada como segundo parâmetro. – AlexSC 5/05/14 às 18:25