TECLA F8 Y LASTKEY()
Moderator: Rathinagiri
TECLA F8 Y LASTKEY()
Hola a todos.
Os agradecería me ayudes con el siguiente tema:
¿Que código puedo usar para que LASTKEY() tome el valor de la tecla F8 como si la hubiera pulsado manualmente?
Para escape o intro utilizo:
KEYBOARD CHR(27)
KEYBOARD CHR(13)
Saludos cordiales.
Os agradecería me ayudes con el siguiente tema:
¿Que código puedo usar para que LASTKEY() tome el valor de la tecla F8 como si la hubiera pulsado manualmente?
Para escape o intro utilizo:
KEYBOARD CHR(27)
KEYBOARD CHR(13)
Saludos cordiales.
- BeGeS
- Posts: 110
- Joined: Fri Jul 14, 2017 10:45 am
- DBs Used: DBF
- Location: La Mancha, Spain
- Has thanked: 29 times
- Been thanked: 21 times
Supongo que CHR(-7)
Pero es que ocurre una cosa:
En Clipper/Harbour tenemos...
#define K_F7 -6
#define K_F8 -7
#define K_F9 -8
Mientras que en HMG...
#define VK_F7 118
#define VK_F8 119
#define VK_F9 120
Prueba a ver...
Pero es que ocurre una cosa:
En Clipper/Harbour tenemos...
#define K_F7 -6
#define K_F8 -7
#define K_F9 -8
Mientras que en HMG...
#define VK_F7 118
#define VK_F8 119
#define VK_F9 120
Prueba a ver...

I get by with a little help from my friends
Gracias BeGeS y edk.
Edk, solo me ha funcionado tu opción, muchas gracias.
P.D.
Ejemplo de lo hecho:
//Andes de DBEEDIT()
//La variable "Control", controla si vengo de procedimiento o función
If Control == 1
USE ALMACEN INDEX ALMACEN,ALMACENA
SET ORDER TO 2
ELSE
Controle := 1
CLEAR GETS
CLEAR TYPEAHEAD
KEYBOARD CHR(250)
ENDIF
...
DBEDIT(...)
...
DO CASE
...
//Si he pulsado manualmente en el teclado la tecla F8
//O he puesto mediante código el valor de LASTKEY() = 250,
//para que si vengo de otra función no tener que pulsar manualmente en el teclado la tecla F8
CASE LASTKEY()=-7 .OR. LASTKEY()=250
Edk, solo me ha funcionado tu opción, muchas gracias.
P.D.
Ejemplo de lo hecho:
//Andes de DBEEDIT()
//La variable "Control", controla si vengo de procedimiento o función
If Control == 1
USE ALMACEN INDEX ALMACEN,ALMACENA
SET ORDER TO 2
ELSE
Controle := 1
CLEAR GETS
CLEAR TYPEAHEAD
KEYBOARD CHR(250)
ENDIF
...
DBEDIT(...)
...
DO CASE
...
//Si he pulsado manualmente en el teclado la tecla F8
//O he puesto mediante código el valor de LASTKEY() = 250,
//para que si vengo de otra función no tener que pulsar manualmente en el teclado la tecla F8
CASE LASTKEY()=-7 .OR. LASTKEY()=250
-
- Posts: 284
- Joined: Thu Oct 16, 2014 11:35 am
- Location: Poland
- Has thanked: 76 times
- Been thanked: 225 times
One more solution (more elegant): instead of "fake key" KEYBOARD CHR(250) you can use: _PushKey(VK_F8)
Then only CASE LASTKEY()=-7 is enough.
Then only CASE LASTKEY()=-7 is enough.
Code: Select all
#include "hmg.ch"
REQUEST HB_GT_WIN_DEFAULT
Function Main
CLS
DO WHILE LASTKEY()#27
inkey(0)
IF LASTKEY()=-6 //The F7 key emulates F8
_PushKey(VK_F8)
inkey(0)
ENDIF
@1,1 SAY LASTKEY()
ENDDO
RETURN Nil
- BeGeS
- Posts: 110
- Joined: Fri Jul 14, 2017 10:45 am
- DBs Used: DBF
- Location: La Mancha, Spain
- Has thanked: 29 times
- Been thanked: 21 times
El hecho de que KEYBOARD() mande un carácter al buffer no significa que actualice el valor de LASTKEY(). Para esto hace falta poner a continuación INKEY():abinfra wrote: ↑Sun Sep 10, 2017 9:20 pmCLEAR TYPEAHEAD
KEYBOARD CHR(250)
ENDIF
...
DBEDIT(...)
...
DO CASE
...
//Si he pulsado manualmente en el teclado la tecla F8
//O he puesto mediante código el valor de LASTKEY() = 250,
//para que si vengo de otra función no tener que pulsar manualmente en el teclado la tecla F8
CASE LASTKEY()=-7 .OR. LASTKEY()=250
KEYBOARD(250) ; INKEY()
Entonces sí tendras 250 como valor de LASTKEY()
* * * * * * * * *
(Aunque el tema sea "HMG en español", es mejor seguir la norma)
The fact that KEYBOARD() sends a character to the buffer does not mean that it updates the value of LASTKEY(). To do this, you must
enter INKEY():
KEYBOARD(250) ; INKEY()
Then you will have 250 as value of LASTKEY()
I get by with a little help from my friends
Gracias edk y BeGeS.
BeGeS, he probado poniendo después de KEYBOARD CHR(250), sin poner INKEY(), WAIT LASTKEY() y me da: 250.
Si pongo INKEY() después de KEYBOARD CHR(250), no se ejecuta el código que tengo después de:
CASE LASTKEY()=-7 .OR. LASTKEY()=250
Saludos cordiales.
BeGeS, he probado poniendo después de KEYBOARD CHR(250), sin poner INKEY(), WAIT LASTKEY() y me da: 250.
Si pongo INKEY() después de KEYBOARD CHR(250), no se ejecuta el código que tengo después de:
CASE LASTKEY()=-7 .OR. LASTKEY()=250
Saludos cordiales.
- BeGeS
- Posts: 110
- Joined: Fri Jul 14, 2017 10:45 am
- DBs Used: DBF
- Location: La Mancha, Spain
- Has thanked: 29 times
- Been thanked: 21 times
La cuestión era que KEYBOARD() envía un carácter al buffer, pero LASTKEY() no queda actualizada. Al menos eso dice la teoría.
Probablemente el mandato WAIT saque el contenido del buffer, por lo que INKEY() ya estaría de más. (Nunca he usado WAIT).
De todos modos lo importante es que te funcione como querías, pues nada más lejos de mi intención que andar enredando.
Un saludo.
Probablemente el mandato WAIT saque el contenido del buffer, por lo que INKEY() ya estaría de más. (Nunca he usado WAIT).
De todos modos lo importante es que te funcione como querías, pues nada más lejos de mi intención que andar enredando.

Un saludo.

I get by with a little help from my friends
-
- Posts: 284
- Joined: Thu Oct 16, 2014 11:35 am
- Location: Poland
- Has thanked: 76 times
- Been thanked: 225 times
abinfra wrote: ↑Sun Sep 10, 2017 9:20 pmP.D.
Ejemplo de lo hecho:
//Andes de DBEEDIT()
//La variable "Control", controla si vengo de procedimiento o función
If Control == 1
USE ALMACEN INDEX ALMACEN,ALMACENA
SET ORDER TO 2
ELSE
Controle := 1
CLEAR GETS
CLEAR TYPEAHEAD
KEYBOARD CHR(250)
ENDIF
...
DBEDIT(...)
...
DO CASE
...
//Si he pulsado manualmente en el teclado la tecla F8
//O he puesto mediante código el valor de LASTKEY() = 250,
//para que si vengo de otra función no tener que pulsar manualmente en el teclado la tecla F8
CASE LASTKEY()=-7 .OR. LASTKEY()=250
DBEdit() successively reads the keyboard buffer, so the lastkey() inside dbedit() returns the values read in turn.
Using inkey() (or WAIT) before calling dbedit() causes the keyboard buffer to be drained.
For this reason, Dbedit() will expect to fill the keyboard buffer and the lastkey() inside dbedit() will not return the value of the last keyboard chr() command.