2 de septiembre de 2013

Cómo evitar el mensaje: No puede salir de Visual FoxPro

Artículo original: How to avoid the Cannot Quit Visual FoxPro message
http://www.ml-consult.co.uk/foxst-07.htm

Autor: Mike Lewis
Traducido por: Esparta Palma

Ha desarrollado su aplicación y la ha enviado a su usario. Todo está bien. Entonces recibe una llamada telefónica. El usuario ha intentado cerrar la aplicación, pero todo lo que ha pasado fué que apareció un mensaje: "No puede salir de Visual FoxPro" o "Cannot Quit Visual FoxPro" (vea figura 1). Por qué la aplicación se encuentra aún en un ciclo de eventos.


Figura 1: El temido Mensaje No puede salir de Visual FoxPro.

En algún lugar de la aplicación, ha puesto un código como el siguiente:

DO MainMenu.MPR
READ EVENTS

Una vez que el programa ha sido puesto en un ciclo de eventos (que es lo que READ EVENTS hace), no podrá cerrar la ventana hasta que salga del ciclo de eventos. Esto lo realiza con el comando CLEAR EVENTS. Normalmente ejecuta CLEAR EVENTS en cualquier momento en que el usuario desea cerrar la aplicación -en el comando "Salir" desde el menú "Archivo por ejemplo.

Pero, ¿ que pasa si el usuario trata de cerrar la aplicación haciendo click en el botón cerrar de la barra de título? O al apagar la máquina windows (con Inicio -> Apagar Equipo) mientras la aplicación continúa ejecutándose? En estos casos, el programa no tiene la oportunidad de ejecutar el CLEAR EVENT. El ciclo de eventos continúa activo, es por ello que el mensaje "No puede salir.." aparece.
Para evitar esto, use el comando ON SHUTDOWN. Éste trabaja de la misma manera que cualquier otro comando "ON", tales como ON ERROR, en los que se especifica una acción a tomar cuando cierto evento ocurre. En este caso, el evento es cualquier intento de cerrar la aplicación, de la modo que fuere.

Así pues, todo lo que tiene que hacer es ejecutar ON SHUTDOWN CLEAR EVENTS. Puede hacerlo cerca del inicio del programa - en cualquier caso antos de READ EVENTS. Una vez que haya hecho esto, el usuario nunca volverá a ver el mensaje "No puede salir..." . Cuando el usuario toca el botón de Cerrar en la barra de título, el programa ejecutará el código de ON SHUTDOWN, el cual hará que se salga del ciclo de eventos y pasa el control a el código que se encuentra después de READ EVENTS. Fin del problema.

No pasa nada

Bueno, no en absoluto. Ahora trate de ejecutar la aplicación en en entorno de desarrollo de VFP. Cierre la aplicación. Entonces trate de salir de Visual FoxPro. Esto no tiene mucha diferencia si utiliza el comando Archivo -> Salir, hacer click en el botón cerrar o escribir QUIT en la Ventana de Comandos. El resultado es el mismo: No pasa nada.

¿Por qué? Debido a que el comando ON SHUTDOWN todavía está en efecto. En vez de cerrer, VFP está ejecutándo únicamente un CLEAR EVENTS, esto no tiene efecto si està en el ambiente de desarrollo y no hay ningun programa corriendo.

Para evitar esto, regrese a su aplicación, y agregue una vez más el comando ON SHUTDOWN. Esta vez, sólo ponga ON SHUTDOWN. Ponga esto en el código de limpieza, esto es, en algún lugar después de READ EVENTS. Su efecto será el de cancelar el primer ON SHUTDOWN.

Este par de comando -- ON SHUTDOWN CLEAR EVENTS y ON SHUTDOWN (sin nada mas) -- son lo mínimo que necesita para cerrar la aplicación con éxito. Pero, dependiendo en cómo la aplicación está estructurada, debería hacer algunas cosas más.

Limpiando

In sus aplicaciones, el comando Archivo -> Salir realiza ciera cantidad de limpieza antes de ejecutar el CLEAR EVENTS. Específicamente, iterar a través de la colección de formularios abiertos (esto es, la colección de Forms en _SCREEN), cerrando cada formulario en turno. Al hacer esto, avisar a el usuario para que trate con las ediciones de datos sin guardar. Hasta este punto, el usuario puede decidir si cancelar el cierre de la aplicación, en cualquier caso la rutina de salida dejará el formulario relevante abierto y regresará para limpiar el ciclo de eventos.

La aplicación necesita necesita ir a través de este mismo procedimiento sin importar cómo el usuario trata de cerrar. Para lograr esto, pondremos lo arriba descrito en un procedimiento, que llamaremos en la llamada de salida. El comando de salida en el menú Archivo llama a éste procedimiento con una simple llamada DO. Y entonces ejecutar el comando ON SHUTDOWN. En otras palabras, en vez de ejecutar ON SHUTDOWN CLEAR EVENTS, ejecutaremos ON SHUTDOW DO FileExit. De este modo, el procedimiento de cerrado es siempre el mismo, sin importar como el usuario lo haya iniciado.

8 comentarios :

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.