Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-06-2014
Fita Fita is offline
Miembro
 
Registrado: jul 2003
Ubicación: Pilar - Argentina
Posts: 216
Poder: 21
Fita Va por buen camino
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
__________________
No te vayas sin irte
Responder Con Cita
  #2  
Antiguo 05-06-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #3  
Antiguo 05-06-2014
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
En el evento onclose ademas de action:=cafree debes asignar nil a la variable

Código Delphi [-]
action:=cafree;
frmDatosFam:=nil
Responder Con Cita
  #4  
Antiguo 05-06-2014
Fita Fita is offline
Miembro
 
Registrado: jul 2003
Ubicación: Pilar - Argentina
Posts: 216
Poder: 21
Fita Va por buen camino
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
__________________
No te vayas sin irte
Responder Con Cita
  #5  
Antiguo 06-06-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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;
Responder Con Cita
  #6  
Antiguo 06-06-2014
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por duilioisola Ver Mensaje
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problemas de memoria al cerrar FORM mRoman OOP 1 09-03-2012 04:20:06
Form no libera de memoria Paulao Varios 1 03-03-2009 17:24:48
Eliminar De Memoria Form Mdi citlalliDgp Varios 9 11-12-2007 21:32:15
Eliminar ciertos datos de la memoria RAM dec Seguridad 63 30-03-2007 03:42:29
Eliminar del memoria los querys Aura OOP 4 01-04-2004 17:40:40


La franja horaria es GMT +2. Ahora son las 06:21:57.


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
Copyright 1996-2007 Club Delphi