Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   LLamada a un Form (https://www.clubdelphi.com/foros/showthread.php?t=85414)

Miguel45 14-03-2014 09:50:30

LLamada a un Form
 
Hola compañer@s

Quiero plantear una duda que tengo desde hace tiempo.
Vengo de Delphi 7 y ahora estoy migrando a Delphi XE.
Hasta ahora, las llamadas a los distintos forms que componen cualquier aplicación, las hago de la siguiente manera:
Código Delphi [-]
        try
         form_consulta_clientes:=TForm_consulta_clientes.Create(self);
         form_consulta_clientes.showmodal;
        finally
         form_consulta_clientes.Label1.free;
         form_consulta_clientes.Nombre.free;
         form_consulta_clientes.Label2.free;
         form_consulta_clientes.nombre2.free;
         form_consulta_clientes.Label3.Free;
         form_consulta_clientes.ciudad.free;
         form_consulta_clientes.Select_clientes.free;
         form_consulta_clientes.DataSource1.free;
         form_consulta_clientes.DBGrid1.free;
         form_consulta_clientes.BitBtn1.free;
         form_consulta_clientes.BitBtn2.free;
         form_consulta_clientes.free;
         form_consulta_clientes:=nil;
        end;
Mi duda no está en la llamada al form, sino en la forma de cerrarlo y liberar el form de la memoria.
¿Es necesario liberar cada componente del form o simplemente basta con liberar el form (form_consulta_clientes.free y form_consulta_clientes:=nil)?

Un saludo a todos.

duilioisola 14-03-2014 11:19:34

Solo es necesario liberar los componentes que creas en tiempo de ejecución, a menos que al crearlos los asignes algún otro componente en la propiedad Parent.
El "Parent" se encarga de liberar a sus "componentes hijos".

Además de esto, puedes poner en el método OnClose del formulario creado Action := caFree

Código Delphi [-]
// Ejemplo de un componente creado en tiempo de ejecución
// Se liberará automáticamente cuando se libere el formulario FMPedidos
procedure TFMPedidos.FormCreate(Sender: TObject);
begin
  MTelefonos := TLFMemo.Create(Self);
  with MTelefonos do
  begin
     Visible := False;
     Parent := Self;
     BorderStyle := bsNone;
     Color := clInfoBk;
     ReadOnly := True;
     WordWrap := False;
  end;
  [...]

Código Delphi [-]
// Al establecer que la accion es caFree, se liberará la memoria al cerrar el formulario
procedure TFMPedidos.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  inherited;
  Action := caFree;
  [...]

dec 14-03-2014 11:36:52

Hola,

Cita:

Empezado por duilioisola (Mensaje 473750)
Solo es necesario liberar los componentes que creas en tiempo de ejecución, a menos que al crearlos los asignes algún otro componente en la propiedad Parent. El "Parent" se encarga de liberar a sus "componentes hijos".

Es correcto pero cambiando "Parent" por "Owner".

Miguel45 01-04-2014 17:48:57

Gracias a los dos.
Dudas resuelta.

Un saludo


La franja horaria es GMT +2. Ahora son las 18:00:39.

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