Delphi: Destruindo formulário herdado

Olá, hoje vamos aprender a como destruir um formulário herdado já que FreeAndNil(Self) ou foHerdado := nil, não destrói o mesmo.

Para isso vamos usar o projeto proposto na postagem "Trabalhando com herança" e a modificaremos.
Na unit uFoPadrao:

Evento OnClick do BtFechar, manteremos o código:
procedure TFoPadrao.BtFecharClick(Sender: TObject);
begin
  Self.close;
end;
Vamos criar um ponteiro da classe TFoPadrao.
type
  PonteiroPadrao = ^tfopadrao;
  TFoPadrao = class(TForm)

 Agora vamos criar uma variável do tipo PonteiroPadrao.
private
    { Private declarations }
    Ponteiro : PonteiroPadrao;

 Agora vamos adicionar uma procedure pública para criar os formulários.
procedure TFoPadrao.pCriaFormulario(out Formulario; FormClass: TFormClass);
begin
   If TForm(Formulario) = Nil Then
      TForm(Formulario) := FormClass.Create(Application);

   If TForm(Formulario) Is TFoPadrao Then
      // Passa o endereco do formulario
      TFoPadrao(Formulario).Ponteiro := @TForm(Formulario);

   TForm(Formulario).Show;
end;
Ainda no ufopadrao teremos que criar um método para destruir uma classe filha.
// Vai liberar o objeto da memória, override para que o metodo seja disparado na classe filha
Destructor Destroy(); override; 
destructor TFoPadrao.Destroy;
begin
   inherited Destroy;
   // Se o endereço não tiver destruido destroi o mesmo
   if TForm(Ponteiro) <> nil  then
      Ponteiro^ := nil;
end;
No OnClose do fopadrao adicionaremos a chamada para o método destruidor, desta forma todos os formulários serão liberados da memória após serem fechados.
procedure TFoPadrao.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   Destroy;
end;
No onClick do botão CriaHerdeiro de foPrincipal, adicione o seguinte código:
procedure TFoPrincipal.BtCriaHerdeiroClick(Sender: TObject);
begin
   // Passar o nome do formulario a ser criado
   FoPadrao.pCriaFormulario(FoHerdado,TFoHerdado);
end;



Nenhum comentário:

Postar um comentário