Fernando D. Bozzo
unread,Aug 2, 2013, 8:18:55 AM8/2/13Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to publice...@googlegroups.com
Hola José:
Aunque la pregunta es fácil de responder, lo complejo puede llegar a ser cómo estés manejando el cierre de tu aplicación, que haga que siempre te quede algún proceso por cerrar.
Lo que te puede servir es que en modo Desarrollo la ventana principal sea visible para poder depurar y ver cualquier mensaje que se muestre en la misma y que no deba, y en modo Producción que te oculte la ventana para que sólo se vean las ventanas.
Esta es una estructura de directorios típica de proyecto FoxPro:
dir.raiz\
\datos
\config <== AQUI PONER EL CONFIG.FPW
\clases
\forms
\reportes
\include
\prgs
En el directorio raíz debe ir el proyecto y el programa principal (MAIN.PRG o como se llame), el resto de componentes conviene ponerlos en los subdirectorios correspondientes.
El CONFIG.FPW debería contener como mínimo esto:
SCREEN=OFF
RESOURCE=OFF
Tu proyecto PJX debe incluir el archivo CONFIG.FPW
Tu programa principal debería tener una estructura similar a esta:
* MAIN.PRG
SET PATH TO DATOS;CLASES;FORMS;REPORTES;PRGS;INCLUDE; && NO PONER EL DIRECTORIO CONFIG!
(Aquí debería configurar los demás SET)
(Aquí debería invocar al form principal)
Luego, al ejecutar el programa en desarrollo (Ej: DO MAIN.PRG) no encontrará al CONFIG.FPW, por lo que mostrará la ventana principal y así podés depurar y probar cosas desde la ventana de comandos.
Al compilar tu EXE, como el CONFIG.FPW debe estar incluido lo encontrará siempre, y pondrá la ventana principal oculta (equivalente a Visible=.F.)
Lo único que tendrías que prestar mucha atención es a la recolección de basura (garbage collect) de cada uno de los métodos que hagas y a usar un buen control de errores, por ejemplo con TRY/CATCH. La recolección de basura consiste en que si un método abre una tabla o una base de datos, debe cerrarlas al finalizar; si crea objetos, debe liberarlos, si abre una conexión con una BDD externa (Oracle, MySQL, etc), debe cerrar la conexión, etc. Obviamente todo esto depende de cómo sea la arquitectura de tu APP.
Respecto al manejo de los errores, que es un tema muy importante y al que muchas veces no se le da la importancia que tiene, todos los errores deben llegar hasta la interfaz y ser mostrados ahí, suponiendo que trabajes en capas (datos, negocio, interfaz)
Un esquema que te puede servir es usar esta estructura en tus rutinas de negocio y datos:
TRY
LOCAL loEx as Exception, lnCodError
lnCodError = 0
* Aquí el resto de tu programa
CATCH TO loEx
* Aquí alguna rutina para poder suspender solo en Desarrollo y para LOG del error.
THROW && Relanza el error hasta que llegue a la interfaz
FINALLY
* Aquí cierre de tablas, conexiones, liberación de objetos, etc.
ENDTRY
Y en tus pantallas, desde donde invoques alguna funcionalidad (típicamente los botones de comando y combobox), podrías tener esta estructura:
TRY
LOCAL loEx as Exception, lnCodError
lnCodError = 0
* Aquí el resto de tu programa
CATCH TO loEx
* Aquí alguna rutina para poder suspender solo en Desarrollo y para LOG del error.
* SOLO EN LA INTERFAZ DEBERÍAN MOSTRARSE LOS ERRORES
MESAGEBOX( "Error " + TRANSFORM(loEx.ErrorNo) + ", " + loEx.Message + CHR(13) ;
+ loEx.Procedure + ", línea " + TRANSFORM(loEx.LineNo) )
FINALLY
* Aquí cierre de tablas, conexiones, liberación de objetos, etc.
ENDTRY
Espero que te sirva para comenzar,
Saludos.-