6 de febrero de 2004

Ejecuto un EXE de VFP y finaliza instantáneamente

¿Quién no ha leído preguntas de este tipo alguna vez en el grupo de noticias?: "...cuando lo ejecuto se abre y cierra el programa y no da ningún tipo de error..." o "...funciona bien en el entorno de programación, pero al hacerlo ejecutable abre y cierra..." o "...al hacer doble clic sobre el ejecutable se cierra el programa automaticamente..." son frecuentes en distintos foros de Visual FoxPro.

Esto ocurre porque en nuestro programa principal debemos añadir un bucle de eventos para esperar los eventos del usuario, tales como un click de ratón o la pulsación de una tecla.

Un bucle de eventos comienza con un comando READ EVENTS y finaliza con un comando CLEAR EVENTS que retorna el control al programa que inició el bucle de eventos.

Si no incluimos en nuestro programa principal un comando READ EVENTS, el programa se ejecutará correctamente desde la ventana comandos de Visual FoxPro, pero cuando ejecutamos la aplicación desde el archivo EXE generado, esta aparecerá durante unos instantes y finalizará.

Una estructura de un programa principal deberia disponer los siguientes puntos:

  1. Establecer las configuraciones iniciales, inicializar variables, abrir bases de datos, etc.
  2. Establecer la interface inicial ejecutando un menú o un formulario.
  3. Establecer un bucle de eventos ejecutando el comando READ EVENTS.
  4. Establecer la finalización del bucle de eventos desde la opción Salir del menú o el botón Salir del formulario con el comando CLEAR EVENTS.
  5. Terminar el programa cerrando las bases de datos, liberando variables, etc.

El código de un programa principal siguiendo los pasos anteriores seria:
*-----------------
*-- Principal.prg
*-----------------
*-- Configuraciones iniciales
DO Inicio.prg
*-- Mostrar la interface inicial
DO MenuPrincipal.MPR  &&  Menú principal
*- ó 
DO FORM FormPrincipal  && Formulario principal
*-- Iniciar el bucle de eventos
READ EVENTS
*-- Terminar el programa
DO Termina.prg

Recordar que el menú (en su opción Salir) o el formulario principal (en el botón Salir o en el método Destroy) deben incluir el comando CLEAR EVENTS para finalizar el bucle de eventos. Al ejecutar CLEAR EVENTS la ejecución del programa continúa en la línea siguiente al comando READ EVENTS.

Un breve ejemplo

El siguiente ejemplo es un programa que:
  1. Genera el archivo EJEMPLO.PRG que muestra un formulario principal como formulario de nivel superior e inicia un bucle de eventos. La finalización del bucle de eventos está alojada en el método Destroy del formulario.
  2. Crea y construye el proyecto EJEMPLO.PJX estableciendo como principal a EJEMPLO.PRG.
  3. Crea y genera el archivo ejecutable EJEMPLO.EXE a partir del proyecto EJEMPLO.PJX.

LOCAL lc
SET SAFETY OFF
TEXT TO lc NOSHOW 
*-- Inicio del programa Ejemplo.prg
LOCAL loForm AS FORM
_SCREEN.VISIBLE = .F.
loForm = CREATEOBJECT('FormPrincipal')
loForm.SHOW
MESSAGEBOX("Se iniciará el bucle de eventos",64, "READ EVENTS")
READ EVENTS
MESSAGEBOX("Terminó el bucle de eventos",64, "CLEAR EVENTS")
_SCREEN.VISIBLE = .T.
RETURN

DEFINE CLASS FormPrincipal AS FORM
  CAPTION = "Ejemplo de un bucle de eventos"
  SHOWWINDOW = 2
  AUTOCENTER = .T.
  HEIGHT = 480
  WIDTH = 640
  ADD OBJECT cmdSalir AS COMMANDBUTTON WITH ;
    CAPTION = "Salir", ;
    HEIGHT = 40, WIDTH = 100, ;
    TOP = 400, LEFT = 500

  PROCEDURE cmdSalir.CLICK
    RELEASE THISFORM
  ENDPROC

  PROCEDURE DESTROY
    CLEAR EVENTS
  ENDPROC

  PROCEDURE CLICK
    WAIT WINDOWS "Evento click en el formulario" NOWAIT
  ENDPROC
ENDDEFINE

*-- Fin de Ejemplo.prg
ENDTEXT

*-- Genero el PRG, PJX y EXE
STRTOFILE(lc,"Ejemplo.prg")
BUILD PROJECT Ejemplo.pjx FROM Ejemplo.prg
BUILD EXE Ejemplo.EXE FROM Ejemplo.pjx
MESSAGEBOX("Ahora ejecute el archivo EJEMPLO.EXE generado.",64,"Aviso")

Ejecutamos el archivo EJEMPLO.EXE que generamos con el código arriba descrito y comprobamos que el bucle de eventos queda esperando los eventos del usuario (en este caso el evento "Click" en el formulario).

Hasta la próxima,

Luis María

1 comentario :

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