Delphi: Criar MainForm em tempo de execução

Olá, hoje vou ensinar o seguinte caso:

Vamos criar uma aplicação qualquer com um formulário e um data module,  mas apenas o data module será criado automaticamente pela aplicação e não definiremos o formulário principal (Figura 1).



Figura 1

Se você tentar rodar sua aplicação, não funcionará. Ela fecha logo que compila, pois a propriedade Application.MainForm está vazia.

Como esta propriedade é somente leitura, não podemos definir um valor a ela, então vamos trocar este valor trabalhando diretamente com sua posição na memória.


Para isso, inicie um novo projeto e insira nele:


1 Form

Propriedade Name:= 'foPrincipal'
Salve como untFoPrincipal

1 DataModule

Propriedade Name:= 'dmPrincipal'
Salve como untDmPrincipal

Crie esta procedure no dmPrincipal:


procedure DefineFormMain(FormAtivo:TForm);

var
   TmpMain: ^TCustomForm; //Crio um ponteiro com classe TcustomForm
begin
   //Passa o endereço da memória do Application.MainForm para a variável
   TmpMain:= @Application.Mainform;
   //Troca o valor da propriedade direto na memória no endereço que esta o Application.MainForm
   TmpMain^:= FormAtivo;
end;

Declare na uses do dmPrincipal a unit untFoPrincipal  

Aí no evento OnCreate do dmPrincipal faça:

procedure TdmPrincipal.DataModuleCreate(Sender: TObject);

begin
   foPrincipal:= TfoPrincipal.Create(Application);
   DefineFormMain(foPrincipal);
   foPrincipal.Show;
end;

Se tiverem dúvidas, comentem aí e tentamos solucioná-la.


Download do projeto disponível neste link: https://www.dropbox.com/s/eflqnuhg80e33gg/Tutorial1.zip



Nenhum comentário:

Postar um comentário