Page 1 of 1

Finalizar proceso tecla ESC

Posted: Fri Jul 29, 2022 3:55 pm
by jparada
Hola,

Con el siguiente código intento dar oportunidad al usuario de finalizar el proceso utilizando la tecla ESC, pero una vez que el usuario presiona la tecla ESC y confirma que desea finalizar, el proceso sí se detiene, pero me gustaría que saliera del form y no ocurre supongo por el BREAK pero no sé cómo solucionar, alguna idea?.

Code: Select all

  LOCAL lBreak := .F.
  ON KEY ESCAPE OF win1 ACTION lBreak := MsgYesNo( "Finalizar Proceso?", "Confirmar" )

  cTime := Time()
  BEGIN SEQUENCE
    FOR EACH cXmlFile IN aFiles
      IF hb_vfExists( cXmlFileName := cXmlFile[ F_NAME ] )
        oCFDI:Load( cXmlFileName )
        //win1.label1.Value := "Leyendo archivo " + hb_NToS(i) + " de " + hb_NtoS(nLenDir)
        progressValue = (i * 100) / nLenDir
        SetProperty ( "win1", "progressbar1", "Value", progressValue )
        
        i++

        DO EVENTS
        IF lBreak == .T.
        BREAK
        win1.Release()
        ENDIF
    NEXT
  END
Saludos,
Javier

Re: Finalizar proceso tecla ESC

Posted: Sat Jul 30, 2022 4:33 pm
by franco
Jparada, Try This

Code: Select all

Private lBreak
       DEFINE WINDOW
ON KEY ESCAPE ACTION {|| {IIF( MSGYESNO("Finalizar Proceso?"),{Something()},{NIL})}, {IIF(lBreak == .T.,{ThisWIndow.Release}, {NIL})}}                   		
	END WINDOW

Function Something
************************* PUT YOU CODE HERE ***  A SIMPLE FOR NEXT LOOP

************************* I Added this for you to try.
If MSGYESNO("Do You Wish to lBreak")
	lBreak := .T.
Else
	lBreak := .F.
endif
return
Franco

Re: Finalizar proceso tecla ESC

Posted: Mon Aug 01, 2022 6:53 am
by SALINETAS24
jparada wrote: Fri Jul 29, 2022 3:55 pm Hola,

Con el siguiente código intento dar oportunidad al usuario de finalizar el proceso utilizando la tecla ESC, pero una vez que el usuario presiona la tecla ESC y confirma que desea finalizar, el proceso sí se detiene, pero me gustaría que saliera del form y no ocurre supongo por el BREAK pero no sé cómo solucionar, alguna idea?.

Code: Select all

  LOCAL lBreak := .F.
  ON KEY ESCAPE OF win1 ACTION lBreak := MsgYesNo( "Finalizar Proceso?", "Confirmar" )

  cTime := Time()
  BEGIN SEQUENCE
    FOR EACH cXmlFile IN aFiles
      IF hb_vfExists( cXmlFileName := cXmlFile[ F_NAME ] )
        oCFDI:Load( cXmlFileName )
        //win1.label1.Value := "Leyendo archivo " + hb_NToS(i) + " de " + hb_NtoS(nLenDir)
        progressValue = (i * 100) / nLenDir
        SetProperty ( "win1", "progressbar1", "Value", progressValue )
        
        i++

        DO EVENTS
        IF lBreak == .T.
        BREAK
        win1.Release()
        ENDIF
    NEXT
  END
Saludos,
Javier
Hola Javier, tienes dos posibles soluciones.

1/ Cambia el orden

Code: Select all

        IF lBreak == .T.
           win1.Release() 
           BREAK
        ENDIF
        
2/ Al finalizar el BEGIN SEQUENCE

Code: Select all

       .../...   
        DO EVENTS
        IF lBreak == .T.
        BREAK
        win1.Release()
        ENDIF
    NEXT
  END
  IF lBreak == .T.
           win1.Release() 
  ENDIF
  
Saludos cordiales y cervecita bien fresquita!!!

Re: Finalizar proceso tecla ESC

Posted: Wed Aug 03, 2022 1:58 pm
by jparada
SALINETAS24 wrote: Mon Aug 01, 2022 6:53 am
Hola Javier, tienes dos posibles soluciones.

1/ Cambia el orden

Code: Select all

        IF lBreak == .T.
           win1.Release() 
           BREAK
        ENDIF
        
2/ Al finalizar el BEGIN SEQUENCE

Code: Select all

       .../...   
        DO EVENTS
        IF lBreak == .T.
        BREAK
        win1.Release()
        ENDIF
    NEXT
  END
  IF lBreak == .T.
           win1.Release() 
  ENDIF
  
Saludos cordiales y cervecita bien fresquita!!!
Hola José, a menos que no te haya entendido, pero me despliega error si lo intento como comentas.

Saludos,
Javier

Re: Finalizar proceso tecla ESC

Posted: Wed Aug 03, 2022 2:00 pm
by jparada
franco wrote: Sat Jul 30, 2022 4:33 pm Jparada, Try This

Code: Select all

Private lBreak
       DEFINE WINDOW
ON KEY ESCAPE ACTION {|| {IIF( MSGYESNO("Finalizar Proceso?"),{Something()},{NIL})}, {IIF(lBreak == .T.,{ThisWIndow.Release}, {NIL})}}                   		
	END WINDOW

Function Something
************************* PUT YOU CODE HERE ***  A SIMPLE FOR NEXT LOOP

************************* I Added this for you to try.
If MSGYESNO("Do You Wish to lBreak")
	lBreak := .T.
Else
	lBreak := .F.
endif
return
Franco
Hi Franco,

In this way I would have to change the code sequence I currently have a bit, so... I keep validating.

Regards,
Javier

Re: Finalizar proceso tecla ESC

Posted: Wed Aug 03, 2022 3:54 pm
by franco
Javier,
I do not understand your code. Mine was just an example. I have found releasing a window when from another function or procedure
can sometimes cause problems so I never release until I return. I do not know where you get lbreak in your code.
Maybe because lbreak is a private variable try.

Code: Select all

Private lBreak
       DEFINE WINDOW
ON KEY ESCAPE ACTION {|| {IIF( MSGYESNO("Finalizar Proceso?"),{Something()},{NIL})}, {IIF(lBreak == .T.,{ThisWIndow.Release}, {NIL})}}                   		
	END WINDOW

Function Something
***** ************************YOUR CODE HERE
       DO EVENTS
        IF lBreak == .T.
**?        BREAK
        Return
 ***************       win1.Release()
        ENDIF
    NEXT
  END
     lBreak := .T.
Return

Re: Finalizar proceso tecla ESC

Posted: Thu Aug 04, 2022 5:30 pm
by franco
Maybe,

Code: Select all

Private lBreak
       DEFINE WINDOW
ON KEY ESCAPE ACTION {|| {IIF( MSGYESNO("Finalizar Proceso?"),{Something()},{NIL})}, {IIF(lBreak == .T.,{ThisWIndow.Release}, {NIL})}}                   		
	END WINDOW

Function Something
Local cTime, progressValue
 cTime := Time()
  BEGIN SEQUENCE
    FOR EACH cXmlFile IN aFiles     // Or Maybe ?     FOR A = 1 TO nLenDir 
      IF hb_vfExists( cXmlFileName := cXmlFile[ F_NAME ] )
        oCFDI:Load( cXmlFileName )
        //win1.label1.Value := "Leyendo archivo " + hb_NToS(i) + " de " + hb_NtoS(nLenDir)
        progressValue = (i * 100) / nLenDir
        SetProperty ( "win1", "progressbar1", "Value", progressValue )
        
        i++

        DO EVENTS
        IF lBreak == .T.
        RETURN              // BREAK
        ENDIF                          * win1.Release()
   
    NEXT
  END
     lBreak := .T.
RETURN