PDA

Ver la Versión Completa : Liberar y destruir realmente un formulario


GerTorresM
08-07-2010, 14:00:27
Hola a Tod@s

La situación que tengo en el día de hoy es siguiente

estoy probando con una aplicación en Delphi 6 Entreprise con dos formularios, a los dos les he puesto una imagen para que pueda ver realmente la memoria que utiliza al cargar cada uno de ellos.

a partir de un botón desde el primer formulario creo mediante código una instancia de del segundo.


procedure TForm1.BitBtn1Click(Sender: TObject);
Var Form_temporal : TForm2;
begin
Form_temporal:= TForm2.Create(self);
try
Form_temporal.ShowModal;
Finally
Form_temporal.Free;
End;
end;


En el segundo formulario tengo lo siguiente :

Una imagen, un TDatabase, una TTable, TDataSource y un DBGrid, que van a trabajar con una base de datos MSAccess mediante BDE.

bien para ver como esta funcionando las cosas el primer formulario cuando carga ocupa algo así como 23.000 Kb, algo normal si tengo en cuenta que posee una imagen algo pesada; al cargar el segundo formulario se ocupa en total algo así como 44.000 kb, pero si cargo los datos la memoria se sube a 47.500kb.

Cuando se cierra el segundo formulario, las cosas con la memoria pueden variar es decir si no utilice un boton que me carga los datos de la tabla el uso de la memoria me queda nuevamente en en los 23.000 kb que pesa el formulario inicial, pero si utilice los datos de tabla y descargue el formulario la memoria queda en 26.500 Kb.

En ese orden de ideas mi pregunta es ¿Se esta quedando abierta en memoria la conexión? , ¿Por que se queda ocupada más memoria si en teoría se destruyo el objeto?.

bien pensé que algo sucedía el intente hacer lo referente a los datos de la siguiente forma:


procedure TForm2.FormDestroy(Sender: TObject);
begin
DBGrid1.Free;
DataSource1.Free;
Table1.Close;
Table1.Free;
Database1.Connected:= False;
Database1.Close;
Database1.Free;
end;


pero las cosas siguen igual, ¿Como puede realmente cerrar el formulario sin perder o dejar por ahí parte del espacio utilizado en memoria por el formulario?

Mil gracias de antemano


gertorresm
Colombia

Neftali [Germán.Estévez]
08-07-2010, 16:06:33
En ese orden de ideas mi pregunta es ¿Se esta quedando abierta en memoria la conexión? , ¿Por que se queda ocupada más memoria si en teoría se destruyo el objeto?.


Hay que decir, que Windos no libera toda la memoria (o mejor dicho, no la marca como libre) cuando tú destruyes objetos. Es decir, cuando tú liberas el formulario, Windows puede no liberar (si no la necesita) esa memoria; Es una forma de ahorrar trabajo, simplemente la "marca" como utilizable.
Si el sistema la necesita, la utilizará, pero mientra no la necesite tal vez te aparezca como "no-liberada". No se si me he explicado...


bien pensé que algo sucedía el intente hacer lo referente a los datos de la siguiente forma...

Recuerda que los controles que pones en el formulario, no hace falta liberarlos (Free), lo hará el formulario al destruirse.

ecfisa
08-07-2010, 16:34:37
Hola.

No hay nada que agregar a la explicación de Neftali.

Pero para aportar un granito más a quién pueda interesarle, sumo un artículo de Ian Marteens que leí hace un tiempo.

http://www.marteens.com/trick42.htm

Saludos.