Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Crear Frames dinamicamente (https://www.clubdelphi.com/foros/showthread.php?t=69913)

iktwo 17-09-2010 21:53:46

Crear Frames dinamicamente
 
hola, pues que he hecho un programa que tiene pestañas pero en una implementación propia con imagenes, en fin, el problema que tengo es a la hora de la creación y destrucción de mis frames, la idea es que al hacer click en una pestaña se cree un frame pero reviso si ya hay algún otro creado para liberar esa memoria.. si existe algún otro frame a liberarlo!!

si lo hago de esta forma:

Código Delphi [-]
ventana2:=TFrame2.Create(nil);


me deja crear y "destruir" sin problemas aparentemente, pero he visto que la memoria no se libera.

sin embargo si al crearlo lo creo así:

Código Delphi [-]
ventana2:=TFrame2.Create(self);


la memoria vaya que se libera, pero a la segunda vuelta al querer crearlo de nuevo me dice que ya existe.

al dar click a cada pestaña ejecuto algo como esto:
Código Delphi [-]
if ventana2<>nil then 
     begin
           ventana2.Free; 
     end;
La verdad que no se que estoy haciendo mal, pero ya me he desesperado, creo que aún no comprendo como crear y destruir objetos dinamicamente..

Gracias!!

ecfisa 17-09-2010 22:11:18

Hola iktwo.

Crealo con Owner = nil y probá con:
Código Delphi [-]
   FreeAndNil(ventana2);

Saludos. :)

iktwo 17-09-2010 22:22:41

Gracias ecfisa por tu pronta respuesta, de la forma que me dices la memoria ya no se satura, me refiero a que ahora al crear ya no vuelve a reservar esa memoria, pero sigue sin liberarla, el frame se destruye visualmente y me deja crearlo de nuevo sin problemas, pero no libera la memoria:(

Edito: La memoria la reviso con el administrador de tareas y para asegurarme que el frame tenga suficiente tamaño para que se note, le he puesto una imagen, no se si deba destruir la imagen aparte, pero el frame no tiene onClose, segun entiendo con destruir el frame debería liberar la memoria, no se si me equivoco en eso..

ecfisa 17-09-2010 22:51:14

Hola.

No sabía lo de la imágen, si usás un componente TImage probá de liberarlo antes del FreeAndNil.

Saludos. :)

iktwo 17-09-2010 23:18:13

Bueno gracias, pero lo que me dices no es opción por la cantidad de componentes que podría llegar a tener mi frame, aparte si al crearlos les pongo en vez de nil self no necesito liberar la imagen independientemente, uf no se que pasa pero no logro liberar esa memoria, de nuevo gracias :)

Lord Delfos 18-09-2010 00:03:25

Una aclaración.

El administrador de tareas es relativamente una mala idea para ver el consumo de memoria. Esto se debe a la forma en la que la memoria se asigna y libera en Windows. Puede ocurrir (de hecho es prácticamente 100% del tiempo) que vos liberes la memoria desde tu programa, pero que realmente no se esté liberando por el sistema de memoria que usa Windows.

Lo más seguro creo que sería usar FastMM. Que es un manejador de memoria muy potente que, entre otras cosas, te dice cuando hay goteos de memoria. Si estás usando, creo recordar, versiones anteriores a Delphi 2010, podés agregarlo a la uses de tu DPR y listo (y preparate para llevarte una sorpresa :)). En D2010 creo que ya viene incorporado así que no hay necesidad. Sólo tendrías que habilitarlo (supongo).

Otra cuestión, no pusiste el código que estás usando para liberar la memoria antes de crear un nuevo frame... Quizás está ahí el problema.

Saludongos.

iktwo 18-09-2010 00:14:24

Gracias de nuevo por la respuesta, antes que nada mi código para liberar:
Código Delphi [-]
if ventana2<>nil then
     begin
       //ventana2:=nil;
       //ventana2.Free;
       FreeAndNil(ventana2);
     end;

Bueno he probado primero nil y luego free, así como también FreeAndNil, uso delphi 2010, y aunque se que el administrador de tareas no es lo mejor para analizar si se ha liberado o no, lo raro es que si creo el frame así

Código Delphi [-]
ventana1:=TFrame1.Create(self);

en vez de con nil, eso si me libera inmediatamente la memoria se refleja al instante en el adminsitrador de memoria, es por eso la duda.. claro que al crearlos con self no me deja crearlos 2 veces me dice que el nombre del componente ya existe..

Gracias!!

iktwo 18-09-2010 01:30:51

Siento hacer doble post, no me dejaba editar el anterior, pues ya libera la memoria, lo he hecho con FreeAndNil pero el owner la propia forma e inmediatamente lo libera, Gracias por su ayuda!!:)


La franja horaria es GMT +2. Ahora son las 11:42:22.

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