Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-11-2013
Comandant Comandant is offline
Miembro
NULL
 
Registrado: ago 2012
Ubicación: Salta
Posts: 34
Poder: 0
Comandant Va por buen camino
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;
y en el edit2 me aparece aun la propiedad. Esta bien esto?
Responder Con Cita
  #2  
Antiguo 13-11-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Comandant.

Aunque delphi te ofrece el "azúcar sintáctico" de omitirlo, la definición completa tu clase es:
Código Delphi [-]
type
  TRecuadro = class(TObject)
   private
    FRect: TRect;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Dibujar(Pain: TPaintBox);
    property Recta: TRect read FRect;
  end;
lo que indica que TRecuadro deriva de TObject, clase de la que, directa o indirectamente derivan todas las clases en Delphi.

Cuando invocas a:
Código Delphi [-]
mar.Free;
el destructor heredado se ejecutará (aún sin reescribirlo), como podrás comprobar haciendo unos pequeños cambios en tu código:
Código Delphi [-]
procedure TForm1.sButton1Click(Sender: TObject);
var mar: TRecuadro;
begin
  mar:= TRecuadro.Create;
  Edit1.Text:= mar.ClassName;  // TRecuadro
  mar.Dibujar(PaintBox1);
  mar.Free;
  edit2.Text:= mar.ClassName;  // ¡ Error !
end;
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:
Código Delphi [-]
  mar.Free;
  mar := nil;

ó:
Código Delphi [-]
  FreeAndNil(mar);

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 14-11-2013
Comandant Comandant is offline
Miembro
NULL
 
Registrado: ago 2012
Ubicación: Salta
Posts: 34
Poder: 0
Comandant Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 14-11-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Comandant.
Cita:
Empezado por Comandant Ver Mensaje
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?
Así es , perdón por la errata.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 18:04:58.


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
Copyright 1996-2007 Club Delphi