Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas al eliminar form de memoria (https://www.clubdelphi.com/foros/showthread.php?t=86011)

Fita 05-06-2014 20:37:37

Problemas al eliminar form de memoria
 
Hola a todos.
El problema es el siguiente. Mi aplicacion tiene un formulario que se utiliza repetidamente.
Al hacer click en un botón "Editar" se ejecuta el siguiente código:
Código Delphi [-]
     Application.CreateForm(TfrmDatosFam, frmDatosfam);
     frmDatosFam.ShowModal;

Cuando cierran el formulario ejecuto un Close y en el evento OnClose ejecuto Action := caFree;
El tema es que el formulario no se borra y en cada llamada se crea una nueva instancia del mismo en memoria hasta que la aplicacion aborta por falta de espacio.
Si al llamar nuevamente el formulario ejecuto este código:
Código Delphi [-]
if Assigned(frmDatosFam) then
begin
       showmessage("esta en memoria");
end;
sale el mensaje.
Como puedo solucionar este tema?

Gracias por adelantado

duilioisola 05-06-2014 21:03:57

El mensaje saldrá aunque liberes la memoria. Una cosa es liberar la memoria y otra es que el puntero apunte a un lugar de esta.

Para probar que de verdad es ese el problema, deberías llamar al formulario como lo haces y luego volver a llamarlo pero sin crear el objeto (sin la primera línea).
Seguramente dará errores porque el formulario se ha liberado. El problema debe ser otro.

Código Delphi [-]
    // Creo el formulario
     Application.CreateForm(TfrmDatosFam, frmDatosfam);
    // Aquí frmDatosfam apunta al lugar de memoria del formulario

     frmDatosFam.ShowModal;

    // En este punto la memoria se ha liberado, pero frmDatosfam sigue apuntando a algún lugar de memoria

    // Esta siguiente línea debería lanzar una excepción.
     frmDatosFam.ShowModal;

Si este código falla, quiere decir que la memoria se consume en otro lugar de la aplicación.

Caminante 05-06-2014 21:58:16

En el evento onclose ademas de action:=cafree debes asignar nil a la variable

Código Delphi [-]
action:=cafree;
frmDatosFam:=nil

Fita 05-06-2014 23:03:43

Gracias por su respuesta, faltaba al nil aunque en un momento lo había puesto y me tiraba una excepcion.
Ahora funciona perfecto, habría algo mal en mi ordenador...

Nuevamenta Gracias!
Saludos

duilioisola 06-06-2014 01:45:47

Nunca debes asignar nil a un objeto dentro de si mismo. Ni siquiera en el evento que lo cierra. Puede ser que todavía se necesite a si mismo para cerrar otras cosas.

Si deseas que el valor sea nulo para poder hacer futuras comprobaciones deberás hacerlo fuera del objeto.
Código Delphi [-]
// Creo el formulario para utilizarlo
Application.CreateForm(TfrmDatosFam, frmDatosfam);
try
  // Utilizo el formulario
  frmDatosFam.ShowModal;
finally
  // Pase lo que pase, voy a liberar su memoria y lo voy a volver nulo
  frmDatosfam.Free;
  frmDatosFam := nil;
end;

roman 06-06-2014 02:24:07

Cita:

Empezado por duilioisola (Mensaje 477403)
Nunca debes asignar nil a un objeto dentro de si mismo.

^\||/

De hecho, más generalmente, no es buena práctica referirse a un objeto específico desde un método de una clase.

// Saludos


La franja horaria es GMT +2. Ahora son las 17:05:03.

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