Ver Mensaje Individual
  #4  
Antiguo 08-04-2010
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Reputación: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Unos detallitos:
Código Delphi [-]
VAR
  Variable: TClase;
El código anterior define una referencia a un objeto. No es un objeto, sino una referencia. El objeto no existe hasta que lo creas.

Código Delphi [-]
  Variable := TClase.Create;
Con esto estás creando un objeto, no "asignando el constructor de la variable". Ahora "Variable" hace referencia al objeto recién creado.

Código Delphi [-]
  Variable1 := TClase.Create;
  Variable2 := Variable1;
  Variable2.Trabaja;
Con esto Variable1 y Variable2 hacen referencia al mismo objeto. No estás clonando (copiando) el objeto. Al ser referencias al mismo objeto, ejecutar "Variable2.Trabaja" es exactamente lo mismo que ejecutar "Variable1.Trabaja". Recuerda lo que he dicho al principio: Son referencias a objetos, no objetos.

Código Delphi [-]
  Variable1 := TClase.Create;
  Variable2 := Variable1;
  Variable1.Free;
  Variable2.Trabaja;
Si hemos dicho que Variable1 y Variable2 hacen referencia al mismo objeto, resulta lógico pensar que tras ejecutar "Variable1.Free" tampoco podemos usar Variable2, ya que el objeto al que referencia no existe, por lo que resulta en una violación de acceso.

Por cierto: nunca hay que llamar al destructor (Destroy). Para destruir un objeto hay que utilizar "Free".

Código Delphi [-]
  PROCEDURE Ejemplo;
  VAR
    Objeto: TClase;
  BEGIN
    Objeto: TClase.Create;
  END;
En el código anterior, definimos una referencia a un objeto y luego lo creamos, pero no lo destruimos. Al terminar el procedimiento, la refencia al objeto es eliminada, pero el objeto sigue existiendo. Por eso podemos hacer cosas como la siguiente:

Código Delphi [-]
  FUNCTION CreaObjeto: TClase;
  VAR
    Objeto: TClase;
  BEGIN
  { Crea el objeto. }
    Objeto: TClase.Create;
  { Devuelve la referencia al objeto. }
    RESULT := Objeto;
  END;

  PROCEDURE Trabaja (aObjeto: TClase);
  BEGIN
  { Utilizamos la referencia recibida. }
     aObjeto.HazAlgo;
  END;

VAR
  ReferenciaObjeto: TClase;
BEGIN
   ReferenciaObjeto := CreaObjeto;
   Trabaja (ReferenciaObjeto);
   ReferenciaObjeto.Free;
END.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 08-04-2010 a las 12:44:55. Razón: Errores, errores y más errores...
Responder Con Cita