Dazu deklarierst du dir erstmal einen Message-Handler als private Procedure:
Delphi-Quellcode:
PRIVATE { Private-Deklarationen }
Procedure HandleOnMessage(var Msg: TMsg; var Handled: Boolean);
Danach erstellst du mit der Tastenkombination Shift-Strg-C den entsprechenden Procedure-Rumpf:
Delphi-Quellcode:
procedure TFormMain.HandleOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
end;
Dort schreibst du nun hinein, wie mit der Message WM_MOUSEWHEEL umgegangen werden soll:
Delphi-Quellcode:
// ---------- Wandelt Mouse-Wheel-Bewegungen in Cursur-Runter bzw. Cursor-Hoch-Messages um (nur TjvDBGrid) ------------------------------
Procedure TFormMain.HandleOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
case Msg.message OF
WM_MOUSEWHEEL:
begin
if (Screen.ActiveForm.ActiveControl <> nil)
and
(Screen.ActiveForm.ActiveControl.ClassName = 'TJvDBGrid') // TJvDBGrid ersetzen durch die gewünschte Komponente, z.B. TStringGrid
then
begin // die Mousewheel Message wird in einen Tastendruck umgewandelt
Msg.message := WM_KEYDOWN;
Msg.lParam := 0;
if Msg.wParam > 0 then
Msg.wParam := VK_UP else
Msg.wParam := VK_DOWN;
Handled := False;
end;
end; // WM_MOUSEWHEEL
end; // case
end;
Nun mußt du nur noch die Messagebehandlung auf deine Procedure "umbiegen":
Delphi-Quellcode:
Procedure TFormMain.FormCreate(Sender: TObject);
begin
Application.OnMessage := Self.HandleOnMessage; // Scrollrad to Cursor up + down
end;
Ab jetzt wird im gesamten Programm beim Scrollen in einem StringGrid immer nur eine Position weitergeschaltet, gerade so, als ob du mit den Hoch-Runter-Cursortasten navigieren würdest. All die Messages, die von deiner Procedure nicht erledigt werden, bleiben natürlich erhalten und geistern weiter durch die Weiten deines Windows, bis sie ihrem Schicksal begegnen (irgend einem anderen Message-Handler).