PDA

Ver la Versión Completa : Liberar los formularios de la memoria


Lionel
26-03-2004, 09:32:09
Buenos dias a todos!!

Necesito saber cual es el procedimiento para cuando cierras un formulario se destruya completamente, liberando asi los recursos que ocupa en el sistema. En los formularios normales sobra con poner el Close?

En los formularios MDI tengo el problema que cuando los cerraba en vez de desaparecer se me hacian en una ventana pequeñita y seguian siendo visibles, ademas de eso si los intentaba destruir lo unico que me salian eran errores de memoria (esto tambien me pasa con los form normales).

¿Que diferencia hay entre el Free y el Destroy?

Enga muchas gracias y un saludo!! :rolleyes:

marto
26-03-2004, 09:46:57
Wop!

Destroy es el destructor del objeto, Free es un método de TObject que comprueba que la referencia No apunte a nil:


procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;

Se desaconseja el uso de Destroy, ya que no tiene el control de Free.

Existen dos maneras (por lo menos) de destruir un formulario. Form.Free y programar el evento OnClose, asignando al parametro Action el valor caFree.

Respecto a lo que comentas que te pasa con los forms MDI, te pego un trozo del help de delphi, en la página que explica el evento OnClose:


If a form is an MDI child form, and its BorderIcons property is biMinimize, then the default Action is caMinimize. If a MDI child form does not have these settings, the default Action is caNone, meaning that nothing happens when the user attempts to close the form.
Para finalizar, lo que comentas de los errores... no sé, ¿puede ser que los destriuyas en más de un sitio? ¿que accedas a la variable despues de destruirla?¿Que apliques los dos métodos antes mencionados sobre el mismo form? Si nos das más datos seguro que te podemos ayudar más...

gynch
26-03-2004, 10:57:28
En el método close cambia la accion por cafree


procedure TFSystem.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=cafree;
end;

Lepe
26-03-2004, 12:18:54
Y para crear un formulario hijo.
En project --> options --> forms, deben estar en Available

y crearlos de alguna de estas formas:


FrmPepe := TFrmPepe.Create(Self);

o bien

Application.CreateForm(FrmPepe, TFrmPepe);


si son formularios Hijos, se mostraran tan pronto se hayan creado sin tener que hacer un FrmPepe.Show, si por el contrario es un formulario normal, dependerá de su propiedad Visible si está a True o False (o eso creo).

Saludos