Página 1 de 1

Control de pulacion de teclas

Publicado: Mié Mar 31, 2021 12:12 pm
por Alfonso
Hola:

¿Existe alguna funcion que controle que se ha pulsado una tecla (ejemplo ESC)?

Es para detener un proceso DO WHILE/END WHILE o FOR/NEXT en cualquier momento.

Gracias de antemano por la ayuda.

Re: Control de pulacion de teclas

Publicado: Mié Mar 31, 2021 4:53 pm
por XeviCOMAS
el evento OnKeyDown() del control o ventana donde quieras que se "capture" esa pulsación de tecla...


Recibe/manda los siguientes parámetros... ( oSender, nKey, nFlags )

Luego, comprueba el valor de nKey con la tecla que necesites controlar, y le mandas hacer lo que pretendes.
...
If nKey == VK_ESCAPE
MsgInfo( "Se ha pulsado la tecla Escape <Esc>" )
Return 0
...

Re: Control de pulacion de teclas

Publicado: Mié Mar 31, 2021 5:26 pm
por Alfonso
Gracias Xevi por responder tan rapido.

La idea es salir de un bucle, he probado con la funcion LastKey() de Harbour pero no funciona.

METHOD Button1Click( oSender ) CLASS TFrmPrueba

Local i:=1
Local suma:=1

DO WHILE i<=10000
IF LASTKEY() == VK_ESCAPE
EXIT // Continua despues del buble
ENDIF
suma++
ENDDO

MgInfo("Salido del bucle","Aviso")

RETURN Nil

Re: Control de pulacion de teclas

Publicado: Mié Mar 31, 2021 6:02 pm
por Alfonso
Lo encontre

METHOD Button1Click( oSender ) CLASS TFrmPrueba

Local i:=1
local suma:=1

DO WHILE i<=10000
IF lGetAsyncKeyState( VK_ESCAPE )
EXIT // sale del bucle
ENDIF
suma++
ENDDO

MsgInfo("Finalizo")

RETURN Nil


Por si le sirve a alguien que busque lo mismo.

Re: Control de pulacion de teclas

Publicado: Mié Mar 31, 2021 7:21 pm
por ignacio
Buenos días,

La forma correcta es poner un botón de Cancelar, que simplemente en el evento OnClick ponga una propiedad lStop a .T. . Para que funcione correctamente hay que llamar a la propiedad ProcessMessages() en el bucle y hacer que éste dependa de esa propiedad. Algo así:

Código: Seleccionar todo

DO WHILE !::lStop .AND. .......
  ProcessMessages()
  ......
ENDDO
Precauciones:
1) Hacer que el botón sea el único botón habilitado mientras se ejecute el bucle.
2) Evitar que se pueda salir del formulario capturando el evento OnClose() y en él simplemente poner la propiedad lStop a .T.

Mejoras:
1) Utilizar una propiedad adicional lWorking mientras se está en el bucle. Esto permite saber en el evento OnClose del formulario, si se está dentro o no del bucle.

Saludos