Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   DBLookupComboBox1.Perform (https://www.clubdelphi.com/foros/showthread.php?t=23377)

Johnny Q 14-07-2005 22:37:44

DBLookupComboBox1.Perform
 
Un cordial saludo a todos.

La verdad es que nunca he tenido mucho manejo de los mensajes de Windows, y la verdad en la siguiente instrucción (que Koder me aconsejo en un hilo anterior):

DBLookupComboBox1.Perform(WM_KEYDOWN, VK_DOWN, 0);

o en otras de tipo similar, no entiendo el valor 0 (que en la referencia de Delphi aparece como LParam) que significa.

Agradezco cualquier información al respecto

Lepe 15-07-2005 04:30:21

Todos los mensajes de la VCL tienen esos 3 parámetros. Si alguno no se utiliza, se le da un cero.

Perform (m:Tmessage, HParam:integer, Lparam:integer)

M es el mensaje que se va a mandar, en este caso se indica que es la presion de una tecla WM_KEYDOWN, pero tambien podría ser WM_KEYUP (por ejemplo)

HParam, es tambien nombrada como High Param, parte alta del parámetro, que tambien es un entero, y en este caso, se dice la tecla que se va a pulsar, (flecha abajo).

Lparam, se conoce como Low Param, parte baja del parámetro, en algunos casos se utiliza y en otros no. Cuando no se utiliza, se le da el valor 0.

Un ejemplo en el que los 3 parámetros tienen información relevante es el siguiente:

Si usamos Perform(wm_keydown, vk_tab,1) es identico a presionar la tecla tabulador, y pasar el foco al siguiente control.

En el caso de Perform(wm_keydown, vk_tab,-1) haría el equivalente a Shift+tab, es decir, enviar el foco al control que tiene un taborder inferior. Aqui compruebas que el valor de Lparam si es relevante, ya que dependiendo de su valor se hace una cosa u otra.


(que conste que lo de vk_tab lo digo de memoria, igual son valores, -1, 0 o bien 0, 1 :D)

Un saludo

Johnny Q 15-07-2005 14:37:40

Gracias Lepe por tu respuesta, quiero confirmar si entendí los valores que puede tomar LPARAM: 0, 1 ó -1.

Saludos...

roman 15-07-2005 18:30:17

Cita:

Empezado por Johnny Q
los valores que puede tomar LPARAM: 0, 1 ó -1.

No.

Hagamos algunas aclaraciones.

Los mensajes WM_XXX, realmente no son parte de la VCL, sino que forman parte del sistema de mensajes del sistema operativo.Windows se comunica con las ventanas enviando estos mensajes y cada ventana reacciona según sus necesidades.

La VCL traduce este sistema de mensajes en un sistema de eventos (OnKeyDown por ejemplo) pero deja abierta la posibilidad de acceder directamente al envío de mensajes de Windows con métodos como Perform.

Los parámetros de Perform corresponden a los parámetros de la función SendMessage de la API de Windows y sus nombres clásicos son WParam y LParam. La W y la L vienen de Word y Long, refiriéndose a los tipos de datos (Word un enterode 16 bits y Long un entero de 32 bits) aunque esto quedó para la historia ya que actualmente ambos son enteros de 32 bits.

Los valores de WParam y LParam, tal como indica Lepe, dependen del mensaje en específico y pueden ser muy variados. En ocasiones representan en realidad punteros a estructuras de datos con más información.

En el caso específico de WM_KEYDOWN, el valor de los parámetros, según el SDK de Windows es:

Cita:

wParam
Specifies the virtual-key code of the nonsystem key

lParam
Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table.

0-15
Specifies the repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.

16-23
Specifies the scan code. The value depends on the OEM.

24
Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.

25-28
Reserved; do not use.

29
Specifies the context code. The value is always 0 for a WM_KEYDOWN message.

30
Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up.

31
Specifies the transition state. The value is always zero for a WM_KEYDOWN message.
En el SDK de Windows puedes ver los valores posibles para cada mensaje WM_XXX.

// Saludos

vtdeleon 15-07-2005 18:37:48

:eek:Muy interesante:eek:

Johnny Q 15-07-2005 22:14:08

Muchas gracias Roman, estudiare mas a fondo el tema con base en la explicación tuya.

Saludos...


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

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi