In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Cerrar formularios

Foro público de Xailer en español
Responder
pacoelche2
Mensajes: 9
Registrado: Lun Jun 01, 2015 8:57 am

Cerrar formularios

Mensaje por pacoelche2 »

Buenos días:

Pregunta simple pero que me hace dudar.

¿Es mejor cerrar los formularios con ::END() o con ::CLOSE()?

Lo que pretendo es liberar todos los recursos que tenga el formulario y que me deje libre la memoria ocupada. He estado leyendo algo al respecto pero sinceramente no sé si es lo mismo una instrucción que otra.

Como siempre agradecidos por vuestra colaboración.

Un saludo
Francisco Martínez
Rich
Mensajes: 75
Registrado: Mar Mar 12, 2013 1:50 am
Contactar:

Re: Cerrar formularios

Mensaje por Rich »

Francisco, cuando quieres asegurarte de que todos los componentes del control serán completamente destruidos, el método apropiado es ::End(). Este método lo poseen todos aquellos controles que heredan de la super clase TComponenten. Por su parte, ::Close se utiliza en caso de que solo desees ocultar un formulario, para lo cual su propiedad lHideOnClose deberá estar con .T. ya que si su valor es .F., entonces este método se encargará de destruir todo sus componentes. Te invito a que visites nuestra página http://www.informaticaoverlisa.mx
Saludos amigos.
Rich
Mensajes: 75
Registrado: Mar Mar 12, 2013 1:50 am
Contactar:

Re: Cerrar formularios

Mensaje por Rich »

Corrijo, no es TComponenten, es TComponent
Saludos amigos.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Cerrar formularios

Mensaje por jfgimenez »

Lo que dice Rich es correcto. Tan sólo puntualizar una cosa... el método Close(), tan sólo cierra el formulario, o lo oculta. Lo que ocurra a continuación depende del valor de lHideOnClose. Si es .T., entonces sólo se oculta, y se puede volver a mostrar de nuevo llamando a Show(). Lógicamente, para destruirlo del todo hay que llamar a End().

Pero si lHideOnClose es .F., entonces al cerrarse el formulario se inicia también todo el proceso de destrucción del mismo. Este proceso va en dos fases: en la primera fase, se destruyen los controles a nivel del API de windows; esto es, los Handles de los controles dejan de ser válidos, pero las clases de Xailer que encapsulan a dichos controles están todavía vivas, y se puede consultar muchas de sus propiedades (siempre que no impliquen una llamada al API de windows del control correspondiente). P.ej., se puede obtener el valor de cText de un botón, pero no se puede obtener la lista de items de un treeview. Durante esta fase, también se asigna el valor de nModalResult del formulario, y si fue mostrado con ShowModal(), se retorna ese mismo valor.

En la segunda fase se destruyen las clases que encapsulan a los controles y al propio formulario. Esta segunda fase la inicia el recolector de basura de Harbour, y es necesario que no quede ninguna referencia viva al formulario ni a sus controles. P.ej., si tenemos una variable estática con el objeto del formulario, entonces nunca se liberará. Pero si el formulario estaba en una variable local o en un WITH OBJECT, entonces el recolector de basura lo tendrá en cuenta en cuanto abandonemos la función o procedimiento que lo contiene.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
pacoelche2
Mensajes: 9
Registrado: Lun Jun 01, 2015 8:57 am

Re: Cerrar formularios

Mensaje por pacoelche2 »

Muchas gracias por vuestros sabios consejos.

En conclusión, cerraré todos los formularios con :END(). Doy por conclusión que todos los controles que tenga ese formulario también son destruidos ¿no?

Por cierto Rich, agradecerte también el consejo que me diste sobre ERRORSYS. Ya he modificado el de mi viejo Clipper y funciona perfectamente (eso creo). La cuestión es que solo quería añarir que se hiciese una copia de la pantalla para aclarar mejor la resolución de los posibles errores.

De nuevo agradecido.
Un saludo
Francisco Martínez
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9440
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Cerrar formularios

Mensaje por ignacio »

Ojo, que se utilizas el método End() no se dispara el evento OnClose del formulario.

Saludos
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder