Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Clases: Create and destroy (https://www.clubdelphi.com/foros/showthread.php?t=41194)

jlrbotella 09-03-2007 10:01:07

Clases: Create and destroy
 
Hola amigos:

Tengo creada una clase con un constructor create y un destructor destroy. Lo que sucede es cuando hago un free de esta clase no la elimina.

¿Tengo que crear un método free?.

Ej:

Código Delphi [-]
TConsultarCliente = class
  private
    Conexion : TIfxConnection;
  public
    function ConsultarCliente(empresa : integer; cliente :integer) : TDataset;
    constructor Create(Conexion : TIfxConnection);
    destructor Destroy;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  ConsCli : TConsultarCliente;
  Dataset : TDataset;
begin
  ConsCli := TConsultarcliente.Create(form1.IfxConnection1); 
  Dataset := ConsCli.ConsultarCliente(1,5);
  ConsCli.Free;
end;

Ñuño Martínez 09-03-2007 10:56:43

¿No recibes un aviso del compilador referente al destructor? Debería darlo ya que el destructor ha de declararse como "override".

jlrbotella 09-03-2007 11:06:08

Hola:

La única forma de liberar la clase es llamando al método destroy, que a su vez hace free.

¿Porqué es necesario crear un destructor de clase?.

Aquí tienes el código completo:

Código Delphi [-]
TConsultarCliente = class
private
Conexion : TIfxConnection;
public
function Buscar(empresa : integer; anyo integer) : TDataset;
constructor Create(Conexion : TIfxConnection);
destructor Destroy;
end;

constructor TConsultarCliente.Create(Conexion: TIfxConnection);
begin
self.Conexion := conexion;
end;

destructor TConsultarCliente.Destroy;
begin
self.free;
end;

function TConsultarCliente.Buscar(empresa : integer; cliente : integer) : TDataset;
begin
....
result := consulta;
end;

// La llamado desde una clase tform
procedure TForm1.Button1Click(Sender : TObject)
var
ConsultarCliente : TConsultarCliente;
Dataset : TDataset;
begin
ConsultarCliente := TConsultarCliente.Create(IfxConnection);
Dataset := ConsultarCliente.Buscar(1,5);
showmessage(Dataset.fieldbyname('razon'.asstring);

// ConsultarCliente.Free -> No hace nada
Consultarcliente.Destroy; // Libera la clase
end;

basti 09-03-2007 11:41:31

Es al revés, es free el que llama a Destroy, y lo hace de forma automática. Además la declaración de Destroy, como bien dijo Nuño, debería ser:

destructor Destroy; override;

No es obligatorio crear un destructor de clase, ya que si no vas a hacer nada en él (como es este caso) utilizará el destructor de la clase TObject. El problema es que al no declarar Destroy como override, lo que estás haciendo es ocultar el Destroy de la clase antecesora (TObject en este caso) y por lo tanto Consultarcliente.Free, no llamará a Destroy de TObject y no te liberará el objeto.

Me olvidaba, si quieres usar destroy, aparte de definirlo como override, tendrás que poner al final inherited, para que llame al Destroy de la clase antecesora :
Código Delphi [-]
destructor TConsultarCliente.Destroy;
begin
  // lo que sea
  inherited;
end;

jlrbotella 09-03-2007 11:55:25

Gracias.

Teneís toda la´razón.

Crandel 09-03-2007 13:11:06

En el Constructor tambien es recomendable poner inherited.

Ten en cuenta que en el Constructor el inherited va antes de lo que queres hacer, en el destroy despues.


La franja horaria es GMT +2. Ahora son las 17:35:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi