In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Control de pulacion de teclas

Foro público de Xailer en español
Responder
Alfonso
Mensajes: 12
Registrado: Lun Dic 14, 2020 10:21 am
Ubicación: Santurtzi
Contactar:

Control de pulacion de teclas

Mensaje 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.
--
Un saludo
Alfonso
Avatar de Usuario
XeviCOMAS
Mensajes: 538
Registrado: Sab Mar 12, 2011 8:16 pm

Re: Control de pulacion de teclas

Mensaje 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
...
Un Saludo,
Xevi.
Alfonso
Mensajes: 12
Registrado: Lun Dic 14, 2020 10:21 am
Ubicación: Santurtzi
Contactar:

Re: Control de pulacion de teclas

Mensaje 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
--
Un saludo
Alfonso
Alfonso
Mensajes: 12
Registrado: Lun Dic 14, 2020 10:21 am
Ubicación: Santurtzi
Contactar:

Re: Control de pulacion de teclas

Mensaje 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.
--
Un saludo
Alfonso
Avatar de Usuario
ignacio
Site Admin
Mensajes: 8843
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Control de pulacion de teclas

Mensaje 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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder