Evitar cambiar de registro en un datawindow

Cómo puedo evitar que al apretar la tecla 'tab' o los cursores me salte de registro en un datawindow. Por ejemplo quiero que cuando esté el foco situado en el último objeto del datawindow, al apretar la tecla 'tab' vuelva al primer objeto del registro actual y no del registro siguiente.
Respuesta
1
Simple
El datawindow posee un evento llamado key el cual controla o se dispara en el momento de activar alguna tecla, puedes preguntar por el valor de la tecla presionada y el nombre del campo o variable que se esta leyendo en ese momento.
El nombre lo puedes obtener utilizando el objeto dwo con la propiedad name o sea dwo. Name
El valor de la tecla presionada se encuentra en la variable key
puedes preguntar por esta si el valor actual es KeyTab!
Todo esto deberás unirlo a un mensaje tipo integer que deberás retornar en el mismo evento, 0 significa que todo esta correcto y uno por ejemplo impide que se efectúe el proceso de movimiento del teclado.
Un ejemplito:
INTEGER li_return = 0
CHOOSE CASE LOWER(dwo.name)
CASE 'ultimo_campo'
IF (key = KeyTab!) THEN
li_return = 1
THIS.SetColumn('primer_campo')
END IF
END CHOOSE
RETURN(li_return)
En caso que esto no funcionara puedes probar añadir en el if la siguiente linea:
SEND( HANDLE(THIS), 256, 0, 0)
Esto lo que hace es redireccionar el valor del buffer del teclado, el primer elemento es el numero de handle del objeto, sigue un numero que corresponde a un numero virtual ascii en el teclado, luego el numero de la tecla que quieres enviar, en este caso es 0 o nada, y el ultimo parámetro es un mensaje que puede ser numérico o string.
Aplicación del send()
En el mismo evento key puedes instribir este script, que te puede servir para suplir el enter por tab o sea que cada vez que presiones ENTER pase al siguiente campo.
INTEGER li_return
CHOOSE CASE key
CASE KeyEnter!
SEND( HANDLE(THIS), 256, 9, 0)
li_return = 1
END CHOOSE
RETURN(li_return)
En este script retornamos 1 para que se detenga el proceso del teclado, y con la función send enviamos al buffer del teclado un ascii 9 que es el tab.
Simple.
Que yo sepa, el datawindow no tiene ningún evento key.
Supongo que tendría que crearme un user event con no sé qué código de evento.
Así y todo, casualmente he visto que si hago el control datawindow de la ventana un poco más pequeño en altura que el objeto datawindow mismo, al pulsar tab no me cambia de registro, siempre se mueve en el mismo.
El pbm_downkey creo que no existe.
Está el pbm_keydown, pero no tiene como argumento el objeto dwo.
¿Tienes alguna otra solución que me pueda servir?
Estaba seguro de que este existía en este evento,
sin embargo puedes utilizar la función GetColumnName(), esta te devuelve el nombre de la columna que tiene el foco.
Ok, pero este evento no tiene como argumento el objeto dwo, ¿entonces cómo puedo saber si el foco está en el último campo del datawindow?
Perdona de nuevo
Se me escapo una letra de más
Es el evento pbm_dwnkey
Al fin... si que ha costado! Así y todo muchas gracias por tu tiempo y tus respuestas
Perdón por no aclarar el tema del evento key
Tienes que añadir un nuevo evento, lo que pasa es que este no es un user event, sino que en la parte de event id, tienes que buscar pbm_downkey
Este es el event id, asociado al key, una vez que lo selecciones automáticamente este añade las variables de referencia.
La diferencia en poner un evento standard y un evento del usuario, es que este ultimo no lo maneja power builder sino que el usuario, esto significa que el evento del usuario no posee event id,
de lo contrario es power builder el que lo maneja.
Con respecto a poner un poco más pequeña la pantalla esto es una forma de bloquearlo temporalmente pero no es la solución, tendrías que controlar muchas cosas más, si conoces la ley de murphi, sabrás de lo que te estoy hablando.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas