Iniciar Sesión

Ver la Versión Completa : [Sintaxis] Control de teclas pulsadas


Begoguay
23 de mayo de 2019, 12:22
Hola amigos foreros.

Me gustaría saber de que forma puedo controlar si se ha pulsado una combinación de teclas, para poderlo programar. Por ejemplo: Ctrl+F1, Shift+L, Alt+E

Un saludo.

Josber
23 de mayo de 2019, 12:31
Comprobando en el evento KeyDown, KeyPress o KeyUp el valor de la tecla pulsada con los siguientes valores:


[0] to [9] POW-KEY-0 to POW-KEY-9
[A] to [Z] POW-KEY-A to POW-KEY-Z
[Alt] POW-KEY-MENU
[Application Key] POW-KEY-APPS
[Back Space] POW-KEY-BACK
[Break] POW-KEY-CANCEL
[Caps Lock] POW-KEY-CAPITAL
[Clear] POW-KEY-CLEAR
[Ctrl] POW-KEY-CONTROL
[Del] POW-KEY-DELETE
[Down arrow] POW-KEY-DOWN
[End] POW-KEY-END
[Enter] POW-KEY-RETURN
[Esc] POW-KEY-ESCAPE
[F1] to [F24] POW-KEY-F1 to POW-KEY-F24
[Home] POW-KEY-HOME
[Ins] POW-KEY-INSERT
[Left arrow] POW-KEY-LEFT
[Left Windows Key] POW-KEY-LWIN
[Num Lock] POW-KEY-NUMLOCK
[Numeric pad * ] POW-KEY-MULTIPLY
[Numeric pad . ] POW-KEY-DECIMAL
[Numeric pad / ] POW-KEY-DIVIDE
[Numeric pad - ] POW-KEY-SUBTRACT
[Numeric pad + ] POW-KEY-ADD
[Numeric Pad 0] to
[Numeric Pad 9]
POW-KEY-NUMPAD0 to
POW-KEY-NUMPAD9
[Page Down] POW-KEY-NEXT
[Page Up] POW-KEY-PRIOR
[Pause] POW-KEY-PAUSE
[Print Screen] POW-KEY-SNAPSHOT
[Right arrow] POW-KEY-RIGHT
[Right Windows Key] POW-KEY-RWIN
[Scroll Lock] POW-KEY-SCROLL
[Shift] POW-KEY-SHIFT
[Space] POW-KEY-SPACE
[Tab] POW-KEY-TAB
[Up arrow] POW-KEY-UP


Un saludo.-

Begoguay
24 de mayo de 2019, 11:27
Gracias Josber.

Pero yo lo que quiero saber es en que evento, y como puedo indicar que cuando se pulsa, por ejemplo, Ctrl y Esc a la vez, que haga algo.

En las aplicaciones, en el evento PreKeyDown del formulario, compruebo que si se pulsa ESC, se salga del programa:
IF POW-ARG-KEYCODE = POW-KEY-ESCAPE
INVOKE POW-SELF "CloseForm"
EXIT PROGRAM
END-IF

Entonces yo quiero que en lugar de ESCAPE, se salga al pulsar Ctrl+Esc

Y no se como ponerlo.

Un saludo

Josber
24 de mayo de 2019, 12:13
por ejemplo, Ctrl y Esc a la vez, que haga algo.

Igual tienes que buscar otra combinación de teclas, porque esa combinación por defecto, hace que se muestre la barra de inicio de Windows y, supongo, que eso primará sobre tu programa.

No he usado nunca una "consulta" de combinación de teclas pero, supongo que sera algo así como


IF POW-ARG-KEYCODE = POW-KEY-CONTROL
IF POW-ARG-KEYCODE = POW-KEY-ESCAPE
INVOKE POW-SELF "CloseForm"
EXIT PROGRAM
END-IF
END-IF

El evento en el que lo usas es el correcto si quieres que eso suceda en cualquier momento del programa, si no es así, y lo quieres en un sitio en especial, tendrás que usar el evento KeyPress de el control que quieras.

Un saludo.-

Kuk
24 de mayo de 2019, 19:24
Josber, no, porque el asunto se basa en eventos, cada evento ejecuta nueva instancia del código, con lo cual el mismo campo no puede tener 2 valores.

Begoguay, lo que necesitas es el evento KeyDown:


ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
LINKAGE SECTION.
01 POW-ARG-KEYCODE PIC S9(4) COMP-5.
01 POW-ARG-SHIFT PIC S9(4) COMP-5.
PROCEDURE DIVISION USING POW-ARG-KEYCODE POW-ARG-SHIFT.

IF POW-ARG-SHIFT = POW-SHIFTSTATE-CTRL AND
POW-ARG-KEYCODE = POW-KEY-ESCAPE
INVOKE POW-SELF "DisplayMessage" USING "Ctrl+Esc" 64
END-IF




KeyDown Event

Description:
Generated when a key is pressed and passed to the control that has the focus.

The KeyPress and KeyUp events are usually generated after the KeyDown event.

If a key is pressed and kept pressed, multiple KeyDown and KeyPress events are generated before a KeyUp event.

Note that if you press a toggle key (e.g. Caps Lock, Num Lock):

· The order of events may be changed.

· One of these events may not be generated.

To support special keystrokes, such as short-cuts, on the form, see the PreKeyDown.

...

Parameters:

[VT_I4 – Index S9(9) COMP-5]
VT_I2 – KeyCode S9(4) COMP-5
VT_I2 – ShiftState S9(4) COMP-5


Description of parameters (with constants):
1. Index: When the control is part of an array, Index contains the control's index in the array.

2. KeyCode: The key code that was pressed. See Key Code Constants for details of key codes.

3. ShiftState: Bit mask settings indicate the state of each of the shift keys - Shift, Ctrl and ALT. Numbering the bits 1 to 8, from least significant to most significant, the bit mapping is:
1 - Shift key (POW-SHIFTSTATE-SHIFT)
2 - Ctrl key (POW-SHIFTSTATE-CTRL)
3 - Alt key (POW-SHIFTSTATE-ALT)
For example if the parameter has a value of 6 (binary 00000110), this indicates that the Ctl and Alt keys are depressed.

Josber
25 de mayo de 2019, 12:06
Josber, no, porque el asunto se basa en eventos, cada evento ejecuta nueva instancia del código, con lo cual el mismo campo no puede tener 2 valores.

Gracias Kuk, me imaginaba algo, pero como ya dije en el post anterior, nunca había tenido que utilizar una combinación de teclas, ahora ya lo tengo más claro.

Un saludo.-

Nitzer
28 de mayo de 2019, 21:08
Yo también utilizo atajos de teclado para llamar a determinados procedimientos, lanzar menus, etc.

Pero "discrepo" algo de kuk (sin que sirva de precedente) jjjjjjj
En vez de utilizar keydown, mejor programarlo en keyup, con el keydown si la persona deja el dedo y no lo suelta, se puede ejecutar continuamente.

Que en algunos casos puede interesar, pero si queremos controlar solo una acción, veo mejor hacerlo en el up, yo al menos lo hago asi.

Tambien tengo un truco en mi aplicación

Pulsando con el botón derecho del ratón sobre una imagen y el botón shift pulsado entras en el modo DIOS :)))))

Kuk
29 de mayo de 2019, 21:20
mejor programarlo en keyup
¡Totalmente de acurdo! :bien:
Si tienes el rango de Guru en este foro, es por algo!!! Parece una tontería, pero claramente es mejor para el rendimiento de la aplicación.
Ejecutar eventos en vano consume CPU para nada.

lumalma
22 de agosto de 2024, 18:19
Buenas tardes
Tengo un textbox en el que tengo que controlar que se introduzca unas letras concretas (de la A a la D) y en función de la letra realizar unas acciones u otras. Quiero controlar que solo se puedan introducir estas letras y si se introduce otro carácter hay que dejar el textbox vacío. Yo lo había intentado con los eventos KeyPress (controlando que lo introducido eran de la A a la D) y Change para ejecutar las acciones después de introducir la letra pero no conseguía que funcione bien ya que al introducir una tecla no válida pongo un espacio y queda un poco raro ya que para borrarlo debo seleccionar el espacio y pulsar la tecla suprimir.
Según he leído lo mejor es hacerlo en el evento KeyUp. Pero si en lugar de teclear pego el carácter con el ratón (botón derecho->pegar) lógicamente no se ejecuta el evento KeyUp. No se como resolver y agradeceré cualquier ayuda.

Muchas gracias

Un saludo

Josber
22 de agosto de 2024, 19:51
@lumalma, no se me ha ocurrido probarlo pero, podrías comprobar en el evento MouseUp de ese objeto, con un INSPECT, que no se haya introducido nada distinto de esos carácteres. Es parecido a todo lo anterior, pero cambiando el evento.

Un salu2.-

Kuk
23 de agosto de 2024, 11:06
@lumalma, yo utilizo en tu caso el evento Change y funciona de maravilla incluso si pegas un texto copiado:


ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
LINKAGE SECTION.
01 POW-ARG-KEYASCII PIC S9(4) COMP-5.
PROCEDURE DIVISION USING POW-ARG-KEYASCII.

EVALUATE POW-ARG-KEYASCII

WHEN POW-KEY-A
WHEN POW-KEY-B
WHEN POW-KEY-C
WHEN POW-KEY-D
WHEN POW-KEY-BACK
CONTINUE

WHEN OTHER
MOVE POW-KEY-CANCEL TO POW-ARG-KEYASCII

END-EVALUATE

lumalma
23 de agosto de 2024, 13:07
Hola
@Josber, @Kuk, gracias por vuestras respuestas.

@Josber, en el evento MouseUp todavía no he pegado el carácter en el TextBox con lo que tengo que comprobarlo en el evento Change.

@Kuk, he probado en el evento Change pero este evento no tiene el parámetro POW-KEY-ASCII. He puesto el código en el evento KeyPress y si no me he confundido funciona bien. Puede ser que hayas puesto que es el evento Change cuando es el evento KeyPress?

Un saludo

Kuk
23 de agosto de 2024, 13:38
@lumalma, efectivamente me he confundido. Es el evento KeyPress y no el Change.... El calor hija que hace evaporar las neuronas que nos quedan :mm: :D :D :D

Le he añadido la conversión de minúsculas a mayúsculas porque por lo que veo no hay constantes diferenciadas para ello en Power, con lo cual, con minúsculas no funcionaba antes:

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
LINKAGE SECTION.
01 CHAR.
05 LETRA PIC X.
05 FILLER PIC X.
01 POW-ARG-KEYASCII REDEFINES CHAR PIC S9(4) COMP-5.

PROCEDURE DIVISION USING POW-ARG-KEYASCII.

INSPECT LETRA CONVERTING
"abcd" TO "ABCD"

EVALUATE POW-ARG-KEYASCII

WHEN POW-KEY-A THRU POW-KEY-D
WHEN POW-KEY-BACK
CONTINUE

WHEN OTHER
MOVE POW-KEY-CANCEL TO POW-ARG-KEYASCII

END-EVALUATE

lumalma
2 de septiembre de 2024, 17:07
Estupendo @Kuk, gracias