Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Liberar el DataModule (https://www.clubdelphi.com/foros/showthread.php?t=70247)

Cañones 09-10-2010 03:38:21

Liberar el DataModule
 
Buenas a todos.
Tengo una duda sobre como liberar el módulo de datos.
Tengo una ventana principal que llama a otra ventana.
La segunda ventana en el evento onCreate crea un datamodule. Cuando a la segunda ventana la libero con el método free, también se libera el datamodule que había creado?
Así creo la segunda ventana.
Código Delphi [-]
procedure TfrmMain.Actualizar1Click(Sender: TObject);
var
  FPuestos:TfrmPuestos;
begin
  // actualizacion de los puestos
  FPuestos:=TfrmPuestos.Create(self);
  try
    FPuestos.ShowModal;
  finally
    FPuestos.Free;
  end;
end;
Así creo el datamodule en el form FPuestos
Código Delphi [-]
procedure TfrmPuestos.FormCreate(Sender: TObject);
begin
  inherited;
  dm:=TdmPuestos.Create(self);
end;

Desde ya muchas gracias a todos por la ayuda.

Al González 09-10-2010 06:32:29

Cita:

Empezado por Cañones (Mensaje 378853)
Cuando a la segunda ventana la libero con el método free, también se libera el datamodule que había creado?

Así es Cañones, ya que das a Self (el segundo formulario) como dueño de la instancia de módulo de datos que creas.

Cuando un objeto de clase derivada de TComponent (como lo es un formulario) es destruido, éste se encarga de destruir (liberar) también a todos los otros componentes que adueña.

Sin entrar en detalles de metodologías, estilo o eficiencia, la implementación que haces es correcta. Solamente ten en cuenta que la variable dm seguirá "apuntando" al cadáver del módulo de datos cuando éste sea destruido como parte de la destrucción del segundo formulario.

Si existe de tu parte el permiso para que alguna sección del programa acceda a esa variable sin que necesariamente exista ese segundo formulario, convendría entonces asignarle Nil en algún evento propicio de éste último, como OnDestroy.

Espero haber ayudado. :)

Al González.

Casimiro Notevi 09-10-2010 15:11:17

Corríjeme si me equivoco, Al, pero lo que comentas puede ser suplido con FreeAndNil, no?

Código:

FPuestos:=TfrmPuestos.Create(self);
try
  FPuestos.ShowModal;
finally
  FreeAndNil( FPuestos )
end;


Al González 09-10-2010 17:16:04

Cita:

Empezado por Casimiro Notevi (Mensaje 378877)
Corríjeme si me equivoco, Al, pero lo que comentas puede ser suplido con FreeAndNil, no?

Código:

FPuestos:=TfrmPuestos.Create(self);
try
  FPuestos.ShowModal;
finally
  FreeAndNil( FPuestos )
end;


El FreeAndNil que has puesto no pone en blanco la variable dm, solamente la variable FPuestos (un componente no tiene manera de conocer a qué variables se han asignado sus componentes adueñados). El FreeAndNil no está demás con FPuestos, pero si lo hicieras también con dm (en lugar de simplemente asignarle Nil a esa variable en, digamos, el evento OnDestroy de TfrmPuestos), sería un tanto innecesario, puesto que la vida de dm ya está ligada a la vida del formulario FPuestos (y es como se quiere).

En concreto, FreeAndNil es para liberar la instancia a la que apunta una variable y poner esa variable en blanco, y, dado este caso, la variable dm ya tendrá lo primero, pero no lo segundo (lo cual se puede hacer con un simple dm := Nil en el evento apropiado).

Saludos.

Al González. :)

Casimiro Notevi 09-10-2010 21:04:38

Tienes razón, los "restos" de DM apuntará a lo que exista en el sitio al que apuntaba. No había comprendido bien la pregunta de Cañones.

Cañones 13-10-2010 12:40:17

Cita:

Empezado por Al González (Mensaje 378859)
Si existe de tu parte el permiso para que alguna sección del programa acceda a esa variable sin que necesariamente exista ese segundo formulario, convendría entonces asignarle Nil en algún evento propicio de éste último, como OnDestroy.

Espero haber ayudado. :)

Al González.

Muchas gracias Al González, voy a hacer esto que me dices para optimizar mi proyecto.
Gracias Casimiro Notevi, por la colaboración.

Saludos.


La franja horaria es GMT +2. Ahora son las 08:21:24.

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