PDA

Ver la Versión Completa : Clases: Create and destroy


jlrbotella
09-03-2007, 10:01:07
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:


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 [-] (http://www.clubdelphi.com/foros/#)
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 :

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.