Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL v3 (V3L10, Win32) (https://www.cobolforo.es/forumdisplay.php?f=5)
-   -   [Sintaxis] Detectar teclas de flechas (Sheet) (https://www.cobolforo.es/showthread.php?t=398)

Eslopes 2 de junio de 2016 02:43

Detectar teclas de flechas (Sheet)
 
Olá,

alguém sabe como detectar o pressionamento das teclas de seta (arriba, abajo, derecha, izquierda) no Powercobol 3.0 ?

Preciso que seja igual ao funcionamento do botão com PFx (teclas de função), ou seja, o foco não precisa estar no campo para o Power detectar a tecla (talvez algo com timer).

[]s, Emerson

Kuk 2 de junio de 2016 09:30

Eslopes, el PWC3 no integra dicha posibilidad. Para hacerlo bien (y captar otros eventos) lo que hay que hacer es sustitución del MessageLoop en WinMain. Yo lo he conseguido, lo que pasa es que la tecla TAB deja de funcionar así que de momento no considero esta opción como la mejor.

Puedes intentar con un TIMER y GetAsyncKeyState function (Windows)

Eslopes 3 de junio de 2016 03:16

1 Archivos Adjunto(s)
Biens,

estou usando teclas de função (PF5, PF6 e PF7), mas queria mesmo usar as setas.

Segue uma imagem do que estou fazendo ;)

[]s,Emerson

Archivo Adjunto 252

Kuk 3 de junio de 2016 11:27

Eslopes, ¿es un juego?! :astro:

Intenta con la función que te he dicho y si no sale pensamos en otra solución ;)

Eslopes 3 de junio de 2016 14:32

Olá,

sim, é um juego! Aliás, vai ser bem viciante, rs.

Tem algum exemplo de como chamar a API ? Tentei com call mas deu erro...

Gracias, Emerson

Kuk 3 de junio de 2016 14:46

Eslopes, tienes que meter en opciones de compilación NOALPHA.

La sintaxis para llamar WinAPI es:

Código COBOL:
  1.      CALL "MessageBoxA" WITH STDCALL USING BY VALUE WS-HWND
  2.                                            BY REFERENCE WS-MSG
  3.                                            BY REFERENCE WS-HEADER
  4.                                            BY VALUE WS-STYLE

Eslopes 4 de junio de 2016 16:03

Olá,

tentei o seguinte código sem sucesso:

Código COBOL:
  1.  01 inKeyCode         PIC S9(04) COMP-5.
  2.  PROCEDURE   DIVISION.
  3.      CALL   "GetAsyncKeyState"  WITH STDCALL USING BY REFERENCE inKeyCode
  4.  
  5.      DISPLAY inKeyCode

inkeycode sempre retorna +0000

Alguma idéia?

[]s, Emerson

Kuk 4 de junio de 2016 17:04

Eslopes, ponlo en un TIMER y haz DISPLAY, a ver si cambia cuando pinchas una tecla.

Eslopes 4 de junio de 2016 22:13

Olá,

esqueci de dizer que o código acima estava num timer disparado a cada 10ms. Mesmo assim simplesmente não retorna nada.

De acordo com o manual do Power3, o retorno seria através do registro especial "PROGRAM-STATUS". O retorno é sempre zero.

Alguma idéia ?

[]s, Emerson

Kuk 5 de junio de 2016 12:05

Eslopes, voy a intentar a mirar qué más opciones hay y te digo.

Eslopes 5 de junio de 2016 12:53

Olá,

encontrei uma possível solução :)


Código COBOL:
  1.  ENVIRONMENT DIVISION.
  2.  DATA        DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01 INDICEKEY       PIC 9(03) VALUE 1.
  5.  01 keyBoard.
  6.     03 aKeyCode          PIC S9(09) COMP-5 VALUE 0.
  7.     03 keys PIC X(256).
  8.  
  9.  
  10.  
  11.  PROCEDURE   DIVISION.
  12.  
  13.      MOVE   0           TO  aKeyCode
  14.  
  15.      CALL  "GetKeyState"  WITH STDCALL  USING aKeyCode
  16.  
  17.      MOVE SPACES  TO  keys
  18.  
  19.      CALL   "GetKeyboardState"  WITH STDCALL  USING keys
  20.  
  21.      IF keys(38:1) > X"01"
  22.         DISPLAY "LEFT"
  23.      END-IF
  24.  
  25.      IF keys(39:1)  > X"01"
  26.         DISPLAY "UP"
  27.      END-IF
  28.  
  29.  
  30.      IF keys(40:1) > X"01"
  31.         DISPLAY "RIGHT"
  32.      END-IF
  33.  
  34.      IF keys(41:1) > X"01"
  35.         DISPLAY "DOWN"
  36.      END-IF

Agora posso terminar o jogo :cerv:

Gracias, Emerson

Kuk 5 de junio de 2016 16:32

Eslopes, para qué haces la llamada a "GetKeyState" si no usas su retorno después?

Eslopes 5 de junio de 2016 17:43

Olá,

de acordo com o post do forum abaixo, nem sempre o Windows faz um scan das teclas, então GetKeyState força este scan.


Cita:

I'v been using GetAsyncKeyState quite extensively without any issues. But if you follow the news groups, you'll realize that GetKeyboardState does have a quirk which is really not identified in the MS docs. The quirk is that the message processing can go out of synch based on how the messages are processed. In other words, Windows can sometimes avoid updating the keystate buffer if for some unknown reason it feels that updating the buffer is not necessary at times. Thus, the key state buffer may not be up to date and in sych with the input message queue. The news group folks recommend calling GetKeyState prior to calling GetKeyboardState to eliminate this potential problem.

GetKeyboardState() problem


Saludos, Emerson

Jovimabo 7 de junio de 2016 13:59

Hola, no estoy seguro si esta subrutina te pueda servir
Código:

CBL_READ_SCR_KEY
Consultala en el manual de CBL Subroutines
User’s Guide capitulo 11
Esto es de NetCOBOL CBL routines.

Eslopes 7 de junio de 2016 14:21

Olá, esta era minha primeira opção, mas o PowerCobol 3 não tem suporte para esta rotina, apenas a versão 4 em diante.

Todavia, a chamada à API que usei está funcionando perfeitamente. Ela poderia inclusive ser usada para criar uma rotina de entrada de dados, substituindo o uso de Textbox (pense no caso de uma aplicação de POS - Point Of Sale).

Saludos, Emerson

Eslopes 7 de junio de 2016 17:15

Uma outra coisa, a API detecta (e retorna) múltiplas teclas pressionadas, incluindo se estão em CAPS LOCK, ou se CONTROL, SHIFT ou mesmo se as teclas do mouse foram pressionadas. É um muito interessante mesmo.

Saludos, Emerson

Adrianeloy 9 de junio de 2016 16:37

Eslopes, tu rutina funciona a la perfección, aqui estan los codigos del resto de las teclas...
NOTA: para detectar una tecla con el ejemplo de Eslopes, debemos sumarle uno al código.

Código:

Código        Tecla
1        LButton
2        RButton
3        Cancel
4        Mbutton (no contigüo a L & RBUTTON)
8        Back 
9        Tab   
12        Clear 
13        Return
16        Shift 
17        Control
18        Menu 
19        Pause 
20        Capital
27        Escape
32        Space 
33        Prior 
34        Next 
35        End   
36        Home 
37        Left 
38        Up   
39        Right 
40        Down 
41        Select
42        Print 
43        Execute
44        SnapShot
44        Copy (no usada x teclado)
45        Insert
46        Delete
47        Help 
65-90        Teclas 'A' hasta 'Z'
97-122        Teclas 'a' hasta 'z'
45-57        Teclas '0' hasta '9'
96        NumPad0
97        NumPad1
98        NumPad2
99        NumPad3
100        NumPad4
101        NumPad5
102        NumPad6
103        NumPad7
104        NumPad8
105        NumPad9
106        Multiply
107        Add   
108        Separator
109        Subtract
110        Decimal
111        Divide
112        F1   
113        F2   
114        F3   
115        F4   
116        F5   
117        F6   
118        F7   
119        F8   
120        F9   
121        F10   
122        F11   
123        F12   
124        F13   
125        F14   
126        F15   
127        F16   
128        F17   
129        F18   
130        F19   
131        F20   
132        F21   
133        F22   
134        F23   
135        F24   
144        NumLock
145        Scroll



La franja horaria es GMT +2. Ahora son las 14:56.

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