No se cierra el formulario

676 views
Skip to first unread message

Ricardo Pina

unread,
Feb 23, 2012, 9:41:38 AM2/23/12
to Grupo VFP
Hola Gente.

Tengo un formulario que al apretar un boton para cerrarlo (ejecuta el release del form), pero no llega al destroy por lo que me queda abierto.
Este formulario se cerraba correctamente, la diferencia ahora es que puse un addobject y un removeobject de un container que tiene una grilla.
puse un set step en el release antes de los comandos que tiene el metodo y display status pero no veo nada que haga que no se cierre.
Alguien se le ocurre que puede estar pasando o como forzar el cierre ?
 
Saludos y Gracias

--
            

                   Ricardo Pina

Desarrollo y Servicios Informáticos

                  Profesionales
               www.dsip.com.ar

 

 


TheNewInquirer

unread,
Feb 23, 2012, 10:06:35 AM2/23/12
to Comunidad de Visual Foxpro en Español
Voy a pecar de ignorante...

Cuando, tuve que formatear e instalar por primera vez equipos de
cómputo y que podrían presentar fallas de arranque, etc.

me dieron este consejo: Prueba todo !! jeje

Gracias a eso, empecé a "distinguir" los fallos de memoria, de buses
dañados que no transmiten datos, de controladores, de bancos de
memoria, limpiar la CMOS via hardware "puenteando" los jumpers o
quitando la triste pila, etc.

Aunque ahora prefiero dejar los problemas de hardware, a alguien que
se dedique al hardware y ocuparme del software.

Así que, lo mismo te digo, Prueba todo !! , hasta la solución menos
pensada o la más simple:

RETURN, CLEAR EVENTS. ON SHUT DOWN, , Metodo UNLOAD, CLOSE ALL, CLOSE
DATABASES, etc.

Saludos y disculpa mi ignorancia..!

edgar suarez kummers

unread,
Feb 23, 2012, 10:19:51 AM2/23/12
to publice...@googlegroups.com
Una secuencia de salida de un FORM
en el click del botón EXIT

use
close tables all
thisform.release()
release windows

saludos
edgar

--
edgar suarez kummers

Ricardo Pina

unread,
Feb 23, 2012, 10:20:27 AM2/23/12
to publice...@googlegroups.com
Hola
 
Toda idea es bienvenida, he probado de todo y no hay caso, el formulario no se destruye,
se ejecuta el codigo que tiene el metodo release pero debe quedar algo mal en el formulario que no permite el destroy del mismo.
No me doy cuenta que es lo que causa esto.
 
Saludos

Ricardo Pina

unread,
Feb 23, 2012, 10:26:39 AM2/23/12
to publice...@googlegroups.com
Hola Edgar
 
se llega a ejecutar el metodo release pero no destruye el formulario, hay algo que no lo permite, pero ya no se que buscar.
si entro y salgo del formulario sin traabajar en él  lo cierra bien, es desconcertante.
 
Saludos.

Victor Espina

unread,
Feb 23, 2012, 10:32:49 AM2/23/12
to publice...@googlegroups.com
La causa mas comun de ese problema es que tienes una propiedad o variable que mantiene una referencia al formulario.  Por ejemplo, si haces esto:

THISFORM.addProperty("me",THISFORM)

el formulario se cerrar sin problemas, pues VFP se encarga de liberar esas referencias automaticamente. Pero si haces esto:

THISFORM.addProperty("refs", CREATE("Custom"))
THISFORM.Refs.addProperty("form",THISFORM)

VFP no podra liberar la referencia al formulario almacenada en la propiedad "form" de "thisform.Refs", por lo que nunca se cerrara hasta que liberes la referencia almacenada en la propiedad "form":

THISFORM.Refs.Form = NULL

Tipicamente este codigo se coloca en el evento Release o Destroy, aunque yo prefiero crear un metodo particular que se encargue de cerrar el formulario y colocar alli el codigo de limpieza:

PROCEDURE closeForm
 THISFORM.Refs.Form = NULL
 THISFORM.Release()
ENDPROC

Si quieres una solucion mas estructural, te recomiendo leer mi articulo sobre Garbage Collection en VFP.

Saludos

Victor Espina

GeoSys Diseño de Software

unread,
Feb 23, 2012, 10:35:31 AM2/23/12
to publice...@googlegroups.com
Ricardo, ponle algo en el UNLOAD de formulario a ver si pasa por allí.

Por ejemplo yo para probar si el código pasa por allí, le pongo ejemplo:

En el DESTROY:

messagebox("Si pasé por el destroy")

En el UNLOAD:

messagebox("Si pasé por el unload")

Así me doy cuenta si el código que está en los eventos se ejecuta.

El UNLOAD lo uso mucho, lo creo más efectivo.


Saludos

Anthony Contreras Peralta

Costa Rica.

Guillermo Gimenez

unread,
Feb 23, 2012, 10:36:44 AM2/23/12
to publice...@googlegroups.com
Noooooooooooooo!!! que grande!!!!, luz resplandeciente que ilumina la mas oscura ignorancia de "nosotros" (los principiantes). Gracias maestro, siga asi por el bien de la comunidad!!!...
 
Un abrazo
 
Guille

--- El jue 23-feb-12, Victor Espina <vesp...@gmail.com> escribió:

Viktor Velazquez

unread,
Feb 23, 2012, 10:44:17 AM2/23/12
to publice...@googlegroups.com

muy buen articulo.. gracias tocayo...eres un genio...

Date: Thu, 23 Feb 2012 07:36:44 -0800
From: guille...@yahoo.com.ar
Subject: Re: [vfp] Re: No se cierra el formulario
To: publice...@googlegroups.com

Ricardo Pina

unread,
Feb 23, 2012, 10:47:59 AM2/23/12
to publice...@googlegroups.com
Hola Victor
 
Creo que algo de eso hay!!!
En un momento lo pruebo y te confirmo,
 
Saludos y Gracias

edgar suarez kummers

unread,
Feb 23, 2012, 10:53:49 AM2/23/12
to publice...@googlegroups.com
Buenas Ricardo:

Creo que pusiste fácil la solución ...

Cuando yo tengo código en alguna parte de un FORM, tal como abrir y cerrar tablas y visitar otros FORMS entonces cada vez que se sale de alguna tareita se coloca:

use
close tables all
release windows

sin importar que enseguida haya que abrir por ejemplo otra table.

Parece redundante pero lo salva a uno de errores tales como que abra una tabla y pase derecho sin mirar que un poco antes se le había dicho que abriera un FORM.

O sea para resumir ...

Cada vez que hagas algo diferente, no importa que haya que dictarle cien veces seguidas entonces le dictas ...

use
close tables all
release windows

En la última ya se sale definitívamente ...

Ahora revisa bien que el FORM
--
edgar suarez kummers

marcelobu...@gmail.com

unread,
Feb 23, 2012, 11:56:15 AM2/23/12
to publice...@googlegroups.com
A manera de prueba...

Borra todo lo que hay en los eventos
release y destroy

De ahi comenza la busqueda

Saludos
MarceloBuenosAires
________________________

Ricardo Pina

unread,
Feb 23, 2012, 6:10:16 PM2/23/12
to publice...@googlegroups.com
Hola
 
Hoy pase un momento por la oficina y alcance a hacer unas pruebas con la solución propuesta por Victor, por ahora el formulario sigue sin destruirse, mañana voy a seguir probando, ya que al momento de invocar el release del formulario el contenedor en cuestión ya fue removido, pero me inclino a pensar que le debe haber quedado alguna referencia al formulario.
Mañana comento alguna novedad.
 
Saludos

Ricardo Pina

unread,
Feb 24, 2012, 11:12:11 AM2/24/12
to publice...@googlegroups.com
Hola a todos
 
Hoy segui haciendo distintas pruebas con el collectgarbage y no pude sacar el error, sigue sin irse el formulario.
Opte por incluir el contenedor en el formulario en vez de hacerle el addobject y se soluciona de esa manero pero me queda la intriga que es lo que no permitía destruirse al formularios
 
Saludos y Gracias a todos por sus ugerencias

Victor Espina

unread,
Feb 24, 2012, 11:16:10 AM2/24/12
to publice...@googlegroups.com
Igual te recomiendo que apliques el metodo collectGarbage en todas tus clases, ya que a veces es mas facil tomar la prevision de liberar cualquier referencia externa que tengamos en una clase dentro de ese metodo, porque asi sabemos que luego no olvidaremos liberarlas y que el metodo collectGarbage sera invocado en el momento adecuado.

Saludos

Victor Espina

Ricardo Pina

unread,
Feb 24, 2012, 11:44:33 AM2/24/12
to publice...@googlegroups.com
Hola Victor
 
Estoy seguro que con el collectgarbage se podria solucionar este error pero no tengo tiempo de seguir haciendo pruebas, lo mas probable que lo este aplicando mal.
Con más tiempo lo implementaré en todas las clases, la idea es muy buena y seguramente el error esta en la manera que lo estoy aplicando,
En este caso lo solucionó incluyendo el container, más adelante seguiré con las pruebas
 
Saludos y gracias
Reply all
Reply to author
Forward
0 new messages