Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Duda sobre creación de clase (Free y Destroy) (https://www.clubdelphi.com/foros/showthread.php?t=25136)

adlfv 13-09-2005 19:00:26

Duda sobre creación de clase (Free y Destroy)
 
Hola a todos.

Estoy haciendo una clase, y la verdad tengo poca experiencia creando clases y componentes, pues solía usarlas más que crearlas... Y al crearlas, uno "vé" otras cosas que no veía antes... Mi duda es sobre la redefinición de métodos. Concretamente Destroy, y si debo redefinir también el método Free.

Código:

type
  TTipoHabitacion = class(TObject)
  private
        FId: string;
        FNota: TStrings;
        FPrefijo: string;
  public
        constructor Create;
        destructor Destroy; override;
        property Id: string read FId;
        property Nota: TStrings read FNota;
        property Prefijo: string read FPrefijo;
  end;
 
  TTiposHabitaciones = class(TObject)
  private
        FLista: TStrings;
        function GetItems(Index: Integer): TTipoHabitacion;
  public
        constructor Create;
        destructor Destroy; override;
        procedure Actualizar;
        property Items[Index: Integer]: TTipoHabitacion read GetItems; default;
        property Lista: TStrings read FLista;
  end;

TTiposHabitaciones es una lista con los tipos de habitación (por ejemplo, sencilla, doble, triple...). Como base para la lista, empleo un TStrings, donde el índice de la lista es numérico (más adelante también quiero incluir por tipo como tal, osea, Tipos['sencilla'].Prefijo...)

Ahora incluyo el código de la implementación (resumido) de TTiposHabitaciones:

Código:

constructor TTiposHabitaciones.Create;
 begin
  inherited Create;
  FLista := TStringList.Create;
  Actualizar;
 end;
 
 destructor TTiposHabitaciones.Destroy;
 begin
  inherited Destroy;
 end;
 
 procedure TTiposHabitaciones.Actualizar;
 var
  I: Integer;
  Qry: TMiQuery;
  TH: TTipoHabitacion;
 begin
  try
        Lista.Clear;
        // Aqui debo liberar FLista, incluido los objetos que ésta posea
          // Sé que debo usar Free, pero si Free no lo he redefinido,
          // Cómo se libera la lista realmente?
 
        Qry := BD.QryNuevo;
        with Qry do
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT *');
          SQL.Add('FROM TiposHab');
          Open;
          for i := 1 to RecordCount do
          begin
                TH := TTipoHabitacion.Create;
                TH.FID := FieldByName('Id').AsString;
                TH.FPrefijo := FieldByName('Prefijo').AsString;
  //          TH.FNota := ...
                Lista.AddObject(TH.FID, TH);
                Next;
          end;
        end;
  finally
        Qry.Free;
  end;
 end;
 
 function TTiposHabitaciones.GetItems(Index: Integer): TTipoHabitacion;
 begin
  Result := TTipoHabitacion(FLista.Objects[Index]);
 end;

La duda es que en el método Actualizar debo liberar la lista primero si tiene alguna información. He leido que se debe usar Free en lugar de Destroy, porque Free llama a Destroy, pero no debería entonces redefinir Free también? Entonces en el destructor tendría que poner algo así?

Código:

destructor TTiposHabitaciones.Destroy;
  begin
  FLista.Free;
    inherited Destroy;
  end;

Pero y qué pasa con los objetos asociados a la lista? Se liberan también? Porque voy almacenando objetos del tipo TTipoHabitación a medida que leo de la base de datos. Tal vez debería redefinir el método Clear?

Estoy medio confundido con eso :confused:. Si alguien me pudiera echar una manita, le estaría muy agradecido.

Muchas gracias de antemano.

Un cordial saludo a todos

delphi.com.ar 13-09-2005 19:32:06

Cita:

Empezado por adlfv
Pero y qué pasa con los objetos asociados a la lista? Se liberan también?

Cita:

Empezado por Ayuda de Delphi
The TStrings object does not own the objects in the Objects array. Objects added to the Objects array still exist even if the TStrings object is destroyed. They must be explicitly destroyed by the application.

Cita:

Empezado por adlfv
Tal vez debería redefinir el método Clear?

¿Oíste hablar de colecciones?

roman 13-09-2005 20:07:40

Cita:

Empezado por adlfv
Lista.Clear;
// Aqui debo liberar FLista, incluido los objetos que ésta posea
// Sé que debo usar Free, pero si Free no lo he redefinido,
// Cómo se libera la lista realmente?

Yo creo que tú mismo te estás contestando. Antes de llamar a Lista.Clear simplemente recorre rodos sus elementos y libera los objetos:

Código Delphi [-]
for I := 0 to Lista.Count - 1 do
  Lista.Objects[i].Free;

Lista.cLear;

// Saludos

Al González 09-10-2005 06:11:16

¡Hola a todos!

Cita:

Empezado por delphi.com.ar
¿Oíste hablar de colecciones?

En este caso tal vez sea mejor utilizar TObjectList en lugar de TCollection como clase padre de THabitaciones, por lo que comenta Román en este otro mensaje, aparentemente del mismo proyecto planteado por Adlfv.

Cuando un objeto TObjectList tiene su propiedad OwnsObjects en True, los objetos de la lista son destruidos (liberados) automáticamente cuando éstos son eliminados de la lista y cuando el objeto lista contenedor es destruido.

Espero esto sea de utilidad, seguimos en contacto.

Al González. :)


La franja horaria es GMT +2. Ahora son las 21:45:43.

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