Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Sintaxis] Control de teclas pulsadas (https://www.cobolforo.es/showthread.php?t=987)

Begoguay 23 de mayo de 2019 12:22

Control de teclas pulsadas
 
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:

Código:

[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:
Código COBOL:
  1. IF    POW-ARG-KEYCODE = POW-KEY-ESCAPE
  2.        INVOKE POW-SELF "CloseForm"
  3.        EXIT PROGRAM
  4. 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

Cita:

Citación del post de Begoguay (Mensaje 4939)
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

Código COBOL:
  1.     IF    POW-ARG-KEYCODE = POW-KEY-CONTROL
  2.            IF POW-ARG-KEYCODE = POW-KEY-ESCAPE
  3.               INVOKE POW-SELF "CloseForm"
  4.               EXIT PROGRAM
  5.            END-IF
  6.     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:

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  LINKAGE         SECTION.
  5.  01  POW-ARG-KEYCODE PIC S9(4) COMP-5.
  6.  01  POW-ARG-SHIFT   PIC S9(4) COMP-5.
  7.  PROCEDURE       DIVISION USING POW-ARG-KEYCODE POW-ARG-SHIFT.
  8.      
  9.      IF  POW-ARG-SHIFT = POW-SHIFTSTATE-CTRL AND
  10.          POW-ARG-KEYCODE = POW-KEY-ESCAPE
  11.          INVOKE POW-SELF "DisplayMessage" USING "Ctrl+Esc" 64
  12.      END-IF
  13.      

Cita:

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:
  1. [VT_I4 – Index S9(9) COMP-5]
  2. VT_I2 – KeyCode S9(4) COMP-5
  3. 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

Cita:

Citación del post de Kuk (Mensaje 4941)
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

Cita:

Citación del post de Nitzer (Mensaje 4946)
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.-


La franja horaria es GMT +2. Ahora son las 16:21.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.