Mouse Wheel en un DBGrid

Hace un tiempo atrás, un cliente mío me llamó, muy inquieto, porque por más que hacía “rodar” la ruedita de su ratón, no conseguía hacer que el cursor recorra toda la grilla de su Formulario de Artículos.

Como no entendí muy bien lo que me preguntaba, hice la prueba por mí mismo y entendí qué pasaba: al hacer “rodar” la rueda del ratón, el cursor que estaba en una grilla (DBGrid), sólo recorría las filas que estaban “visibles” en ese momento. Es decir, si la grilla tenía 15 filas, pero sólo mostraba 5, al recorrerlas con la rueda del ratón sólo se movía en esas 5 filas visibles, de las demás, nada de nada. Ni iba ni venía. Algo raro pensé, pero al investigar un poco me dí cuenta que ese era el comportamiento por defecto.

Así es que después de googlear un rato buscando respuestas, me encontré con una solución muy interesante: colocar un TApplicationEvents en el formulario, y en el evento OnMessage escribir este código:

procedure TfrmABM.AppEventsMessage(var Msg: tagMSG; var Handled: Boolean);
var i: SmallInt;
begin
if Msg.message = WM_MOUSEWHEEL then
begin
Msg.message := WM_KEYDOWN;
Msg.lParam := 0;
i := HiWord(Msg.wParam);
if i > 0 then
Msg.wParam := VK_UP
else
Msg.wParam := VK_DOWN;
Handled := false;
end;
end;

Qué hace? Si el mensaje que está “interceptando” es del movimiento de la rueda de un ratón, lo que hace es recuperar la cantidad de “vueltas” (o pasos, no sé cual sería) y actúa en consecuencia, si es positivo hace que parezca que se oprimió la tecla Hacia Arriba (o Flecha Arriba) y si es negativo lo contrario, Hacia Abajo (o Flecha Abajo).

Con esto quedo solucionado, ahora se puede hacer “rodar” la rueda del ratón y se recorre toda la grilla (Ojo que esto no solo funciona en un DBGrid sino que también en todos los demás objetos TListView, TListBox, etc.).


1 comentario hasta ahora, quieres decir algo?

  1. Antonio dijo:

    Hola, he intentado probar el código en Delphi 7 pero no se que Uses poner para que no me de error en WM_MOUSEWHEEL y WM_KEYDOWN

Dejá tu comentario

DSC06833DSC06826DSC06825DSC06815DSC06814DSC06813puerto de mar del platapuerto de mar del platagustavo y miryampuerto de mar del plata