FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
El Destructor "destruye" las propiedades?
Hola a todos y tengo una duda y es justamente si el destructor destruye todos los objetos y propiedades heredados o tengo que hacerlo manualmente aquí les dejo un ejemplo sencillo que veo que aun puedo acceder a la propiedad TRect.
Código:
type TRecuadro = class private FRect: TRect; public constructor Create; destructor Destroy; override; procedure Dibujar(Pain: TPaintBox); property Recta: TRect read FRect; end; ..... constructor TRecuadro.Create; begin inherited; FRect.Top:= 0; FRect.Bottom:= 50; FRect.Left:= 0; FRect.Right:= 50; end; destructor TRecuadro.Destroy; begin //aqui hago manualmente la destruccion 1 x 1? pense que era automático inherited; end procedure TRecuadro.Dibujar(Pain: TPaintBox); begin Pain.Canvas.Rectangle(0,0,50,50); end; procedure TForm1.sButton1Click(Sender: TObject); var mar: TRecuadro; begin mar:= TRecuadro.Create; edit1.Text:= IntToStr(mar.FRect.Right); mar.Dibujar(PaintBox1); mar.Free; edit2.Text:= IntToStr(mar.FRect.Right) end; |
#2
|
||||
|
||||
Hola Comandant.
Aunque delphi te ofrece el "azúcar sintáctico" de omitirlo, la definición completa tu clase es: lo que indica que TRecuadro deriva de TObject, clase de la que, directa o indirectamente derivan todas las clases en Delphi. Cuando invocas a: el destructor heredado se ejecutará (aún sin reescribirlo), como podrás comprobar haciendo unos pequeños cambios en tu código: pero TObject no tiene conocimiento de las declaraciones ni la memoria que ha ocupado uno de sus descendientes, en esos casos declaras el constructor para poder liberar la memoria que ocupó el descendiente e invocar al destructor heredado. Pero en tu clase sólo hay atributos simples, no veo la necesidad de definir un constructor. Cuando creas una instancia de clase y la liberas, el apuntador (objeto) mantiene el valor. Entonces si lo que deseas es que no se pueda acceder a ellos, tenes que asignarle nil, ya sea luego de liberarlo con Free o usando FreeAndNil en su lugar:
ó:
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#3
|
|||
|
|||
Ok entendido ahora comprendo porque muchos autores recomendaban FreeAndNil en vez de Free.
Lo que me quedo "picando" es que dijiste "Pero en tu clase sólo hay atributos simples, no veo la necesidad de definir un constructor." creo que quisiste decir un destructor? Ha y muchas gracias ecfisa siempre tan claro y atento. Te dejo puntines :-) +10 |
#4
|
||||
|
||||
Hola Comandant.
Cita:
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Usar TServerSocket y TClientSocket para enviar "streams" más o menos "grandes" | dec | Internet | 9 | 04-08-2015 16:11:50 |
Como cambiar valores en la ventana "General" propiedades del sistema | JuanErasmo | API de Windows | 52 | 17-02-2012 17:42:20 |
cómo agregar propiedades "published" a un componente desde afuera del mismo? | poyo | OOP | 7 | 14-02-2009 01:26:07 |
Cómo acceder a las propiedades de un "Parent" | NeoAnderson | API de Windows | 14 | 12-02-2008 21:13:46 |
Necesito llamar a métodos de clases "hija" desde su clase "padre" | Flecha | OOP | 17 | 20-04-2007 00:03:53 |
|