![]() |
Mausrad, ScrollBox und PageControl
Hey Leute,
da ich gestern auf dem PC meines Vaters ein Problem mit der Verwendung des Mausrads in einem meiner Programme hatte (reagierte nicht mehr und musste abgeschossen werden), wollte ich die Behandlung des Events umbauen. Dazu gab es vor kurzem bereits ein ![]() Ich beziehe mich mit dem Code für die Ereignisbehandlung auf ![]() Nochmal kurz als Übersicht:
Code:
Das führt natürlich in der Folge dazu, dass die jeweils ermittelten Parents nur noch die Form und dann nil sind, wodurch das Scrollen natürlich nicht funktioniert. Eigentlich bleibt mir ja nichts anderes übrig, als die Childs des von ControlAtPos() ermittelten PageControls durchzugehen (z.B. mit dem property Components), aber dann könnte ich auch gleich auf die ScrollBox gehen, da ich ja weiß, dass auf jeder Seite des PageControl eine ScrollBox ist.
Funktioniert: TForm > TScrollBox
Funktioniert nicht: TForm > TPageControl > TTabSheet > TScrollBox Wie würdet ihr das Problem angehen? MfG Dalai |
AW: Mausrad, ScrollBox und PageControl
Hallo Dalai,
Ich habe in meinen Programmen bereits beide Strukturen verwendet und bis jetzt keine Probleme gehabt. Die Ereignisbehandlung von Uwe Raabe habe ich gerade bei mir getestet und sie klappt, wie in deinem Fall, wirklich nicht. Jetzt frage mich allerdings warum du dies im Form OnMouseWheel behandelt willst und nicht im Ereignis der ScrollBox? Ich habe in meinem Programm der ScrollBox im OnMouseWheel lediglich diese Zeile hinzugefügt:
Delphi-Quellcode:
Das funktioniert soweit ohne Probleme und vllt. löst es bereis dein Problem.
procedure TForm.ScrollBoxMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); begin ScrollBox.VertScrollBar.Position := ScrollBox.VertScrollBar.Position - WheelDelta; end; Gruß Pitschki |
AW: Mausrad, ScrollBox und PageControl
Zitat:
MfG Dalai |
AW: Mausrad, ScrollBox und PageControl
Ich hab nun "ein wenig" (eher stundenlang, weil mir mein eigener Code im Weg stand :roll:) rumprobiert und bin zu der Erkenntnis gelangt, dass das harte Setzen der Position keine gute Idee ist, weil es bescheiden aussieht. Daher habe ich mich dazu entschieden, bei meiner Methode zu bleiben, nur mit dem Unterschied, dass ich nun
Delphi-Quellcode:
verwende statt wie bisher
ScrollBox.Perform(WM_VSCROLL, msg, 0); // msg ist entweder SB_LINEDOWN oder SB_LINEUP
Delphi-Quellcode:
SendMessage(ScrollBox.Handle, WM_VSCROLL, msg, 0);
Blöd ist, dass das Problem trotz dieser Änderung auf dem Problem-PC bestehen bleibt :?. Immerhin habe ich rausgefunden, dass das am Property ScrollBox.VertScrollBar.Smooth liegt. Schalte ich das ab, läuft das Programm normal weiter. Verstehen tue ich das nicht, denn das ist im Moment der einzige PC, auf dem das auftritt. Ich hatte das Problem schonmal auf meinem Laptop, allerdings war es nach einem Update der Synaptic-Treiber verschwunden. Nur der Vollständigkeit halber hier noch die komplette Methode zur Ereignisbehandlung:
Delphi-Quellcode:
MfG Dalai
procedure TMainForm.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); var rect: TRect; msg: LongInt; begin if MainPageControl.ActivePageIndex < 0 then Exit; rect.Top:= 0; rect.Left:= 0; rect.TopLeft:= MainPageControl.ClientToScreen(rect.TopLeft); rect.Bottom:= MainPageControl.Height; rect.Right:= MainPageControl.Width; rect.BottomRight:= MainPageControl.ClientToScreen(rect.BottomRight); msg:= SB_LINEDOWN; if WheelDelta > 0 then msg:= SB_LINEUP; if PtInRect(rect, MousePos) then begin arPages[MainPageControl.ActivePageIndex].scroll.Perform(WM_VSCROLL, msg, 0); Handled:= True; end; end; // arPages ist ein dynamisches Array of record, in dem sich unter anderem eine ScrollBox und ein TabSheet befinden // ja, ich weiß, dass man die Datenspeicherung noch optimieren kann :) |
AW: Mausrad, ScrollBox und PageControl
Ich habe jetzt nicht ganz genau verstanden welches Problem aktuell noch besteht, vielleicht gibt das Beispiel ggf. eine Anregung...
Delphi-Quellcode:
procedure TFormTest.MessageEvent(var Msg: TMsg; var Handled: Boolean);
var H: HWND; C: TControl; WC: TWinControl; I: Integer; function GetParentScrollBox(WC: TWinControl): TWinControl; begin Result := WC; if (not(WC is TScrollBox)) and (WC.Parent <> nil) then Result := GetParentScrollBox(WC.Parent); end; begin if ((Msg.Message = WM_MOUSEWHEEL) or (Msg.Message = WM_MOUSEHWHEEL)) and (Msg.wParam and MK_CONTROL = 0) then begin H := WindowFromPoint(Msg.Pt); C := FindControl(H); if C is TWinControl then begin WC := GetParentScrollBox(C as TWinControl); if WC <> nil then begin for I := 1 to Mouse.WheelScrollLines do WC.Perform(CM_MOUSEWHEEL, Msg.wParam, Msg.lParam); // Msg.Message funktioniert nicht H := 0; end; end; if (H = 0) or ((Msg.HWND <> H) and (GetWindowThreadProcessId(H, nil) <> GetCurrentThreadId)) then begin Msg.HWND := 0; Msg.Message := WM_NULL; Handled := True; end else Msg.HWND := H; end end; |
AW: Mausrad, ScrollBox und PageControl
Zitat:
Interessanterweise passiert das nicht, wenn man den Balken selbst anfasst und hin- und herschiebt. Sobald das Smooth-Scrolling der ScrollBox(ScrollBar) ausgeschaltet ist, tritt es ebenfalls nicht mehr auf. Es passiert auch nicht bei einem ListView im selben Programm; allerdings hat die dieses ListView beinhaltende Form auch keinen MouseWheel-Handler... Ich habe die Vermutung, dass das an diesem einen PC hängt, der schon eine Uptime von mehr als 30 Tagen hat und vermutlich ist das Problem nach einem Neustart verschwunden, denn wie immer gilt: "Reboot tut gut" :) (vor allem bei Windows ;)). MfG Dalai |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 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 by Thomas Breitkreuz