FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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:
Última edición por dec fecha: 09-03-2007 a las 10:07:34. |
#2
|
||||
|
||||
¿No recibes un aviso del compilador referente al destructor? Debería darlo ya que el destructor ha de declararse como "override".
|
#3
|
|||
|
|||
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; |
#4
|
|||
|
|||
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 :
Última edición por basti fecha: 09-03-2007 a las 11:44:50. |
#5
|
|||
|
|||
Gracias.
Teneís toda la´razón. |
#6
|
||||
|
||||
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.
__________________
[Crandel] |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Destroy en OnClose de MDIChild | ixMike | API de Windows | 6 | 05-10-2006 19:25:53 |
Otra de diferencias... (free y destroy) | FunBit | OOP | 3 | 03-09-2005 02:33:39 |
Destroy de mala madre... | Xianto | OOP | 9 | 31-03-2005 20:24:11 |
Diferencias entre FREE y DESTROY | bustio | OOP | 1 | 23-06-2004 05:48:35 |
Manejo Del Free Y El Destroy | Robert | SQL | 4 | 19-03-2004 15:11:34 |
|