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