![]() |
Einstellung Scrollen Zeilen
Hallo Zusammen,
ich habe ein StringGrid, in dem mit der Maus gescrollt werden kann. Jetzt springt die Markierung aber immer gleich 3 Zeilen weiter. Wo kann ich einstellen, dass sie nur eine Zeile weitersprongen soll. Dass müsste doch eigentlich im OI einstellbarsein, oder? Vielen Dank Patrick |
AW: Einstellung Scrollen Zeilen
Dazu deklarierst du dir erstmal einen Message-Handler als private Procedure:
Delphi-Quellcode:
Danach erstellst du mit der Tastenkombination Shift-Strg-C den entsprechenden Procedure-Rumpf:
PRIVATE { Private-Deklarationen }
Procedure HandleOnMessage(var Msg: TMsg; var Handled: Boolean);
Delphi-Quellcode:
Dort schreibst du nun hinein, wie mit der Message WM_MOUSEWHEEL umgegangen werden soll:
procedure TFormMain.HandleOnMessage(var Msg: TMsg; var Handled: Boolean);
begin end;
Delphi-Quellcode:
Nun mußt du nur noch die Messagebehandlung auf deine Procedure "umbiegen":
// ---------- 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;
Delphi-Quellcode:
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).
Procedure TFormMain.FormCreate(Sender: TObject);
begin Application.OnMessage := Self.HandleOnMessage; // Scrollrad to Cursor up + down end; |
AW: Einstellung Scrollen Zeilen
Hallo Zusammen,
ich war davon ausgegangen, dass man das in jedem StringGrid einstellen kann. Ich nutze das TMSGrid und dabei geht es mit:
Delphi-Quellcode:
StringGrid1.MouseActions.WheelIncrement:=1;
Vielen Dank Patrick |
AW: Einstellung Scrollen Zeilen
Daß du nicht, wie im Eingangsposting geschrieben, ein normales TStringGrid verwendest, konnte ich natürlich nicht erahnen. Ich gehe stets davon aus, daß man das, was man schreibt, auch meint. Da dein (kommerzielles) Grid ja bereits über eine entsprechende Möglichkeit verfügt, hättest du dir die Frage und ich mir die Zeit für die Antwort sparen können.
Zitat:
|
AW: Einstellung Scrollen Zeilen
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:
Nun folgende zwei Fragen:
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; Um die Scrollrate herabzusetzen, habe ich ein
Delphi-Quellcode:
eingebaut, das man mit STRG übergehen kann.
Sleep
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. |
AW: Einstellung Scrollen Zeilen
Zitat:
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; |
AW: Einstellung Scrollen Zeilen
Vielen Dank, Peter. Diesen Trick kannte ich schon, hatte ihn aber völlig vergessen. Merke ich mir hoffentlich für das nächste Mal.
Eine Verzögerung brauche ich dennoch, weil ich nicht nur den "Nachlauf" verhindern möchte, sondern anstrebe, dass pro Mausradbetätigung nur einmal das Bild gewechselt wird, so dass man nicht dauernd aufpassen muss, nicht zuviel zu drehen. Ich habe jetzt von den Nachrichten ganz Abschied genommen und das Ganze in OnMouseWheel verlagert (BeimRollen ist eine globale Variable, auch verpönt, ich weiß):
Delphi-Quellcode:
Das macht genau, was ich will.
procedure TFrmSB.AnzeigeMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var Richtung:integer; GTC:Cardinal; begin Richtung := IfThen(WheelDelta = 0,-1,1); If BeimRollen then begin Handled := True; exit; end; BeimRollen := True; GTC := GetTickCount; Try If Richtung = 1 then SetzeNächstesBild(bwVor) else SetzeNächstesBild(bwZurück); While (GetKeyState(VK_CONTROL) >= 0) and (GetTickCount < (GTC + 250)) do Application.ProcessMessages; Finally BeimRollen := False; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz