Und erst knapp fünf Jahre später ...
Ich möchte mittels der Maus immer das nächste / vorige Bild in ein TImage laden und habe mich auch daran gestört, dass die Scrollgeschwindigkeit zu hoch war.
Der folgende (modifizierte) Code von Perlsau tut, was ich will:
Delphi-Quellcode:
procedure TFrmSB.HandleOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
If (Msg.message = WM_MOUSEWHEEL) and (Screen.ActiveForm.ActiveControl <> nil)
and (Screen.ActiveForm.ActiveControl.ClassName = 'TImage') then
begin
If Msg.wParam > 0 then
SetzeNächstesBild(bwVor) else
SetzeNächstesBild(bwZurück);
If GetKeyState(VK_CONTROL) >= 0 then
Sleep(50);
Handled := True;
end;
end;
Nun folgende zwei Fragen:
Um die Scrollrate herabzusetzen, habe ich ein
Sleep
eingebaut, das man mit STRG übergehen kann.
Ich weiß aber, dass man für die Verwendung von Sleep in die Delphi-Hölle kommt, obwohl es hier genau das tut, was ich möchte. Wie würde ein Himmelsaspirant das machen, oder habe ich die weltweit erste legale Verwendung von Sleep gefunden?
Wichtiger noch: Soweit ich das verstehe, werde jetzt alle Zehntausende Nachrichten über diese Prozedur umgeleitet und einer Prüfung unterzogen. Macht sich das in der Praxis bemerkbar? Mein Program ist nicht übermäßig zeitkritisch, aber dennoch.
Was Du da machst ist ein bißchen overkill, Du kannst einfach dem Form selbst einen Handler für WM_MOUSEWHEEL verpassen. Das Sleep sollte unnötig sein und macht auch nicht unbedingt das, was Du willst. Wenn der Benutzer einfach zu schnell am
Rad dreht akkumulieren die Messages schneller in der message queue als sie verarbeitet werden können, was dann zu "Nachlauf" führt. Um das zu vermeiden mußt Du nicht die Verarbeitungszeit künstlich verlängern sondern die überschüssigen messages aus der Queue entfernen, z. B. mit dem hier:
Delphi-Quellcode:
{!
<summary>
Remove all mouse messages from the calling thread's message queue.</summary>
}
procedure EmptyMouseQueue;
var
Msg: TMsg;
begin
while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST,
PM_REMOVE or PM_NOYIELD) do
;
end;