Al salir del programa no se mata el proceso

184 views
Skip to first unread message

José Luis

unread,
Jun 30, 2015, 6:24:54 AM6/30/15
to publice...@googlegroups.com

Hola amigos,

Llevo horas revisando el código pero no veo la solución.
Tengo un botón llamado salir que ejecuta el siguiente código, el caso es que sale bien del programa pero queda residente como proceso.
No veo donde está el problema.
Utilizo FoxRibbon :

Gracias de antemano.


* On Shutdown
ON SHUTDOWN DO SalirDeVFP

DO FORM MENU
DO FORM a3Enlace
READ EVENTS


PROCEDURE SalirDeVFP
    IF 6 = MESSAGEBOX("¿Está seguro que desea salir de la aplicación?"+CHR(13);
        +"Los cambios no guardados se perderán", 4 + 32 + 256, "Aviso")

        *-- Recorro los formularios activos
        FOR m.lnI = _SCREEN.FORMCOUNT TO 1 STEP -1
            _SCREEN.FORMS(m.lnI).RELEASE
        ENDFOR
        ON SHUTDOWN
        CLEAR EVENTS
        ON ERROR QUIT
        oA3enlace.Acabar()
        oA3enlace = null
        CLOSE ALL
        CLEAR ALL
        SET SYSMENU TO DEFAULT
        IF _VFP.STARTMODE <> 0
            QUIT
        ENDIF
        RETURN .T.
    ELSE
        RETURN .F.
    ENDIF
ENDPROC

Carlos Alfaro

unread,
Jun 30, 2015, 9:27:35 AM6/30/15
to publice...@googlegroups.com

Saludos cordiales estimado Jose:

 

Estas seguro que se cumple la condición:

 

        IF _VFP.STARTMODE <> 0
            QUIT
        ENDIF

Porque creo que al no aplicar quit, el proceso no se cierra.

 

Bendiciones.

 

Carlos Alfaro

Fidel Charny

unread,
Jun 30, 2015, 9:40:08 AM6/30/15
to publice...@googlegroups.com, maste...@hotmail.com
1) La prevención de cierre debería ir en el botón de Salir. Y luego QUIT, que ejecutará SalirDeVfp() por ON SHUTDOWN
2) Me parece que el cierre del bucle de eventos debería estar después de oA3enlace.acabar()
3) Si usas alguna tabla nativa, conviene cerrarlas (CLOSE DATABASES ALL).
4) Si existe la posibilidad que se pierdan datos no guardados, tienes que ofrecer una mejor solución. Si no, esos datos se terminarán perdiendo.
Porque muy pocos usuarios leen los avisos, y de los que leen, la mitad no los interpretan, o lo que es peor, los interpretan mal.

José Luis

unread,
Jun 30, 2015, 10:57:52 AM6/30/15
to publice...@googlegroups.com, fjch...@gmail.com, maste...@hotmail.com
Hola,

He modificado lo que me indicas pero sigo igual
Es extraño que he colocado un wait window antes del quit para probar que pasara por aquí y al activarlo si que cierra por completo el proceso, en cambio al desactivarlo el programa queda en segundo plano de Windows

Boton Salir
----------------

IF MESSAGEBOX("¿Está seguro que desea salir de la aplicación?"+CHR(13)+ ;
    "Los cambios no guardados se perderán", 4 + 32 + 256, "Aviso") = 6
    CLEAR EVENTS
    QUIT   
ENDIF


MAIN.PRG
----------------


* On Shutdown
ON SHUTDOWN DO SalirDeVFP

DO FORM MENU
DO FORM a3Enlace
READ EVENTS


*------------------------------------------------------
* PROCEDURE SalirDeVFP
* - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Controla el evento ON SHUTDOWN
* RETORNA: Logico
*------------------------------------------------------
PROCEDURE SalirDeVFP

    oA3enlace.Acabar()
    oA3enlace = null   

    *-- Recorro los formularios activos
    FOR m.lnI = _SCREEN.FORMCOUNT TO 1 STEP -1
        _SCREEN.FORMS(m.lnI).RELEASE
    ENDFOR

    ON SHUTDOWN
    CLEAR EVENTS
    CLOSE TABLES
  
    IF _VFP.STARTMODE <> 0
        *WAIT WINDOW
        CLOSE ALL
        QUIT
    ENDIF
ENDPROC

Antonio.xt

unread,
Jun 30, 2015, 12:21:54 PM6/30/15
to publice...@googlegroups.com, maste...@hotmail.com, fjch...@gmail.com

No me convence mucho ese metodo en el boton "Salir", no estoy muy seguro de que se cierre la aplicacion con el QUIT, ya que al llegar al CLEAR EVENTS se dirige a la linea siguiente del READ EVENTS, y por lo tanto no llega a ese QUIT que esta en la siguiente linea.

Saúl Piña

unread,
Jun 30, 2015, 1:04:45 PM6/30/15
to publice...@googlegroups.com, maste...@hotmail.com, fjch...@gmail.com
Con el siguiente codigo puedo salir del sistema SI o SI. 

preg2=MESSAGEBOX("Desea Salir realmente del Sistema?",4+48,"Cerrando Sistema")
IF preg2=6
_screen.ActiveForm.Release
CLEAR EVENTS
 CANCEL
DO salir.prg
endif

Espero te sirva.

Saúl Piña

unread,
Jun 30, 2015, 1:06:18 PM6/30/15
to publice...@googlegroups.com, saulpi...@gmail.com, fjch...@gmail.com, maste...@hotmail.com
En el prg salir.prg:

sqldisconnect(0)
close tables all
clear all
quit

Carlos Miguel FARIAS

unread,
Jun 30, 2015, 6:26:17 PM6/30/15
to Grupo Fox
Usas WITH ENDWITH?
Si lo usas, fijate si en el medio de un WITH ENDWITH no ejecutas un RETURN.
No recuerdo si se soluciono en algún momento, pero hasta donde yo se, esa lógica no borraba los objetos de memoria y producia errores varios.
Saludos: Miguel, La Pampa (RA)

José Luis

unread,
Jul 1, 2015, 4:49:07 AM7/1/15
to publice...@googlegroups.com, carlosmig...@gmail.com

No me acaba de funcionar, lo más cerca es añadiendo CLEAR ALL, pero antes de finalizar me salta un error

BOTON SALIR
----------------------


IF MESSAGEBOX("¿Está seguro que desea salir de la aplicación?"+CHR(13)+ ;
    "Los cambios no guardados se perderán", 4 + 32 + 256, "Aviso") = 6
    _screen.ActiveForm.Release
    SalirDeVFP()
ENDIF



PROCEDURE SalirDeVFP
    oA3enlace.Acabar()
    oA3enlace = null   
    ON SHUTDOWN
    CLEAR EVENTS
    CLOSE TABLES ALL
    CLEAR ALL
    QUIT
ENDPROC

Fernando D. Bozzo

unread,
Jul 1, 2015, 9:34:47 AM7/1/15
to publice...@googlegroups.com, maste...@hotmail.com, carlosmig...@gmail.com
Hola José Luis:

Normalmente esto es problema de recolección de basura. Un Clear All no soluciona todo, como podés observar.

La forma correcta de liberar los objetos es en el orden inverso a que fueron creados. Aunque esto no es necesario en todos los casos, es el único método que te garantiza 100% que los objetos se liberan, porque no deja referencias ambiguas o cruzadas.

Si el RibbonButtons no se puede liberar, es porque hay alguna referencia --probablemente cruzada-- de ese componente en otro. Como la mala práctica de llamar de un form a otro u guardar la referencia del primer form en el segundo y viceversa, que solo se puede liberar manualmente.

integral

unread,
Jul 2, 2015, 9:25:33 PM7/2/15
to publice...@googlegroups.com, maste...@hotmail.com

Estimado Amigo :

Con relación a tu pregunta, te comento que tuve el mismo problema en una ocasión...

Inicialmente quería que con el botón Cerrar del Menu FoxRibbon se pudiera cerrar el sistema...

Entonces un colega me dio la idea de crear mejor la opción Salir y entonces aplique el código que hasta ahora me ha funcionado sin problemas..


************************************
* Condicion para Salir del Sistema
************************************
IF _SCREEN.oRibbon.MESSAGEBOX("¿ Desea Salir del Sistema ?" ,32 ,Title_loc ,"SI,NO" ,"" ,0)=2 
   _SCREEN.REMOVEOBJECT("oImagen")  
   Thisform.Release()
   ON SHUTDOWN Do SALIR
Else
   Nodefault
   Return
ENDIF

Espero haber respondido a tu pregunta

Saludos,

INTEGRAL
Salida_Ribbon.jpg

José Luis

unread,
Jul 6, 2015, 5:23:33 AM7/6/15
to publice...@googlegroups.com, gabriel_...@hotmail.com, maste...@hotmail.com

Hola Integral,

Fíjate ques esa condición ya la tengo implementada, de hecho si utilizo tu código no ejecuta nunca el procedimiento Salir
El problema creo que es que después de hacer el CLEAR ALL me da un error debido a que el objeto del botón Salir todavía está en uso

A ver si a alguien se le ocurre algo

Botón Salir
-----------

IF MESSAGEBOX("¿Está seguro que desea salir de la aplicación?", 4 + 32 + 256, "Aviso") = 6
    Thisform.Release()
    Do Salir
Else
   Nodefault
   Return
ENDIF


PROCEDURE Salir
    oA3enlace.Acabar()
    oA3enlace = null
    RELEASE CLASSLIB FOXRIBBON, listbotones, MISOPCIONES, GRIDEXTRAS
    RELEASE MENU
    RELEASE oSQL
    RELEASE _oreportoutput   
    ON SHUTDOWN
    CLEAR EVENTS
    CLOSE TABLES ALL
    IF _VFP.STARTMODE <> 0
        CLEAR ALL
        QUIT
    ENDIF
ENDPROC

Qsoft

unread,
Jul 6, 2015, 5:37:58 AM7/6/15
to publice...@googlegroups.com
mi humilde aporte.

premisa: uso tambien la misma clase que esta usando, pero no coloco nunca un boton de salir, dejo solo activa la posibilidad de cerrar con la X en la ventana principal.

uso el ON SHUTDOWN DO quit.prg && (mi procedimiento para salir)

y dentro del PRG quit està solo esto:

= Bitacora('Uscita normale de Programma') && indico nel log che se està saliendo
CLOSE DATABASES
RELEASE EVENTS
QUIT




Enrique Vasquez B.

José Luis

unread,
Jul 6, 2015, 9:30:15 AM7/6/15
to publice...@googlegroups.com, maste...@hotmail.com
En este caso necesito hacer el cierre desde un botón pues la aplicación es táctil

Si pongo tu codigo veo que nunca pasa por el procedimiento Salir


Idalberto Gonzalez

unread,
Jul 6, 2015, 11:12:00 AM7/6/15
to publice...@googlegroups.com, maste...@hotmail.com
 Y ya probaste agregando tambien esto:

RELEASE CLASSLIB   miruta\FoxRibbon.vcx    ( poniendo la ruta correcta de la clase)

José Luis

unread,
Jul 6, 2015, 12:16:12 PM7/6/15
to publice...@googlegroups.com, maste...@hotmail.com
Lo tengo en el Path
Este es mi main.prg

PUBLIC CarpetaRaiz, oSQL, oA3enlace
CarpetaRaiz = SYS(5) + CURDIR()
CarpetaClases = CarpetaRaiz + "\clases"
CarpetaRibbon = "C:\foxribbon\vcx"

SET DEFAULT TO &CarpetaRaiz
SET PATH TO FORMENU, IMG, PRG, CLASES, REPORTS, &CarpetaDatos, &CarpetaRibbon

SET PROCEDURE TO seteos.prg, funciones.prg, mysql.prg
DO seteos

SET CLASS TO FOXRIBBON ADDITIVE
SET CLASSLIB TO listbotones ADDITIVE
SET CLASS TO MISOPCIONES ADDITIVE
SET CLASS TO GRIDEXTRAS ADDITIVE
DO FOXYPREVIEWER.APP
_Screen.oFoxyPreviewer.cLanguage = "SPANISH"
DO SYSTEM.APP

if VarType(_Screen.oRibbon) == "O"
    _Screen.RemoveObject("oRibbon")
endif
_Screen.NewObject("oRibbon", "RibbonSettings")
with _Screen.oRibbon
    .Language = "Español"
    *--Calendario
    .c_FirstDayWeek = 2
    *--Días feriados de la semana
    .c_1SunHoli = .T.
    .c_2MonHoli = .F.
    .c_3TueHoli = .F.
    .c_4WedHoli = .F.
    .c_5ThuHoli = .F.
    .c_6FriHoli = .F.
    .c_7SatHoli = .T.
endwith



* On Shutdown
ON SHUTDOWN DO Salir

DO FORM MENU
DO FORM a3Enlace
READ EVENTS

Idalberto Gonzalez

unread,
Jul 6, 2015, 1:07:53 PM7/6/15
to publice...@googlegroups.com, maste...@hotmail.com
Despues de "read events" debes poner


RELEASE CLASSLIB   miruta\FoxRibbon.vcx    ( poniendo la ruta correcta de la clase)

y si tambien estas utilizando la clase de ejemplo de foxribbon colocalo de la sig forma:

RELEASE CLASSLIB miruta\FoxRibbon.vcx,miruta\MyDesigns.vcx

Siempre despues de "READ EVENTS"
Reply all
Reply to author
Forward
0 new messages