AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Mit Mausrad in TScrollBox scrollen

Ein Thema von Tim-94 · begonnen am 18. Sep 2012 · letzter Beitrag vom 27. Dez 2017
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Tim-94
Tim-94

Registriert seit: 3. Jul 2008
Ort: Hamburg
110 Beiträge
 
Delphi XE2 Professional
 
#1

Mit Mausrad in TScrollBox scrollen

  Alt 18. Sep 2012, 16:08
Hallo alle zusammen
Ich habe eine Frage zu folgendem Code:

Delphi-Quellcode:
{-------------------------------------------------------------------}  
procedure TMainForm.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if PtInRect(PScrollBox.ClientRect, ScreenToClient(MousePos)) then
    PScrollBox.OnMouseWheelUp(Sender, Shift, MousePos, Handled);

  {if PtInRect(AScrollBox.ClientRect, ScreenToClient(MousePos)) then
    AScrollBox.OnMouseWheelUp(Sender, Shift, MousePos, Handled);}

end;
{-------------------------------------------------------------------}
procedure TMainForm.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if PtInRect(PScrollBox.ClientRect, ScreenToClient(MousePos)) then
    PScrollBox.OnMouseWheelDown(Sender, Shift, MousePos, Handled);

  {if PtInRect(AScrollBox.ClientRect, ScreenToClient(MousePos)) then
    AScrollBox.OnMouseWheelDown(Sender, Shift, MousePos, Handled);}

end;
{-------------------------------------------------------------------}
{-------------------------------------------------------------------}
procedure TMainForm.AScrollBoxMouseWheelDown(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
var
  vsb: TControlScrollbar;
begin
  with AScrollBox do begin
    vsb := VertScrollbar;
    vsb.Position := vsb.Position + vsb.Increment;
  end;
  Handled := true;
end;
{-------------------------------------------------------------------}
procedure TMainForm.AScrollBoxMouseWheelUp(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
var
  vsb: TControlScrollbar;
begin
  with AScrollBox do begin
    vsb := VertScrollbar;
    vsb.Position := vsb.Position - vsb.Increment;
  end;
  Handled := true;
end;
{-------------------------------------------------------------------}
{-------------------------------------------------------------------}
procedure TMainForm.PScrollBoxMouseWheelDown(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
var
  vsb: TControlScrollbar;
begin
  with PScrollBox do begin
    vsb := VertScrollbar;
    vsb.Position := vsb.Position + vsb.Increment;
  end;
  Handled := true;
end;
{-------------------------------------------------------------------}
procedure TMainForm.PScrollBoxMouseWheelUp(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
var
  vsb: TControlScrollbar;
begin
  with PScrollBox do begin
    vsb := VertScrollbar;
    vsb.Position := vsb.Position - vsb.Increment;
  end;
  Handled := true;
end;
{-------------------------------------------------------------------}

So funktioniert der Code ohne Probleme für das Scrollen in der PScrollBox.

Wenn ich nun jedoch beim "FormMouseWheelUp"- & "FormMouseWheelDown"-Ereignis jeweils den Code für die AScrollBox aus dem Kommentar nehme, scrollt immer nur noch die PScrollBox.
Wie ist das möglich?

Schonmal vielen Dank für eure Hilfe!

Geändert von Tim-94 (18. Sep 2012 um 16:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
5.798 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#2

AW: Mit Mausrad in TScrollBox scrollen

  Alt 18. Sep 2012, 16:43
Schau doch mal nach, was PScrollBox.ClientRect und AScrollBox.ClientRect jeweils zurückgeben - dann sollte es dir klar werden, was da schief geht.

Aber warum so kompliziert?


Delphi-Quellcode:
procedure TForm162.FormMouseWheel(Sender: TObject; Shift: TShiftState;
    WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
  vsb: TControlScrollbar;
  ctrl: TControl;
begin
  ctrl := ControlAtPos(ScreenToClient(MousePos), false, true, true);
  while (ctrl <> nil) and not (ctrl is TScrollBox) do begin
    ctrl := ctrl.Parent;
  end;
  if ctrl is TScrollBox then begin
    vsb := TScrollBox(ctrl).VertScrollBar;
    vsb.Position := vsb.Position - Sign(WheelDelta)*vsb.Increment;
    Handled := true;
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Tim-94
Tim-94

Registriert seit: 3. Jul 2008
Ort: Hamburg
110 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Mit Mausrad in TScrollBox scrollen

  Alt 19. Sep 2012, 20:57
Danke für die Antwort.
Aber irgendwie funktioniert das mit deinem Code bei mir auch nicht.
Weiß leider auch nicht, woran das liegt.
Und wo kann ich nachgucken, was PScrollBox.ClientRect und AScrollBox.ClientRect jeweils zurückgeben?
Soll ich mir das als Text oder Zahl ausgeben lassen?
Oder wie ist das gemeint?

Danke schonmal!
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Mit Mausrad in TScrollBox scrollen

  Alt 19. Sep 2012, 21:14
Der Code von Uwe ist schlank und sauber, was funktioniert nicht bei Dir und was haben die Rects damit zu tun?
Hast Du die Methode im Objektinspektor im OnMouseWheel zugewiesen?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Tim-94
Tim-94

Registriert seit: 3. Jul 2008
Ort: Hamburg
110 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Mit Mausrad in TScrollBox scrollen

  Alt 20. Sep 2012, 19:35
Vielen Dank für eure Bemühungen!
Mittlerweile funktioniert alles, es hatte sich ein kleiner Fehler beim Übernehmen von Uwes Quelltext eingeschlichen.
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
601 Beiträge
 
Delphi XE Professional
 
#6

AW: Mit Mausrad in TScrollBox scrollen

  Alt 21. Sep 2012, 09:24
Da ich mich auch gerade erst damit beschäftigt habe erstmal auch ein danke von mir für die Version von Uwe

Was dabei aber erwähnt werden sollte: dieser Code scrollt das Control unter der Maus. Ist auch in der Originalanfrage so, verdient aber imho der speziellen Erwähnung, weil es zu so Effekten führt dass etwa auf einmal nichts mehr scrollt, wenn die Maus über einem TButton innerhalb der Scrollbox ist.

Eine "natürlichere" Scrollvariante könnte es sein, das aktive Control zu nehmen, und, falls die nicht scrollbar ist, in der Hierarchie solange nach oben zu gehen, bis sich eines findet. Da frage ich mich gerade, ob so etwas wie "scrollbar" abfragbar ist (ist es bestimmt).
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
5.798 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#7

AW: Mit Mausrad in TScrollBox scrollen

  Alt 21. Sep 2012, 10:58
Was dabei aber erwähnt werden sollte: dieser Code scrollt das Control unter der Maus. Ist auch in der Originalanfrage so, verdient aber imho der speziellen Erwähnung, weil es zu so Effekten führt dass etwa auf einmal nichts mehr scrollt, wenn die Maus über einem TButton innerhalb der Scrollbox ist.
Das sollte aber eigentlich nicht so sein. Die while-Schleife sollte eigentlich die erste übergeordnete ScrollBox finden zu der das Control unter der Maus gehört. Ist das bei dir nicht der Fall?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
601 Beiträge
 
Delphi XE Professional
 
#8

AW: Mit Mausrad in TScrollBox scrollen

  Alt 21. Sep 2012, 11:16
Ich war darauf gekommen, weil es bei eben nicht scrollt, wenn die Maus gerade auf einem TButton ist. Hab mich zugegeben noch etwas mißverständlich ausgedrückt bzw. aufgrund des möglichen Bugs etwas falsch interpretiert.

Grober Überblick (man verzeihe meine Verwendung von Klassen- statt Instanzennamen):
  • TForm -> TPanel(1) -> TScrollbox -> TPanel(2) -> TPanel(3) -> TButton,TEdit
  • Form.ActiveControl = Scrollbox

Ist die Maus nun über dem TButton, liefert ControlAtPos in DoMouseWheel (das habe ich in meiner Formoberklasse mit Deinem Code überschrieben) TPanel(1) zurück.

Ist die Maus über TPanel(3) oder über dem TEdit, dann ergibt ControlAtPos auch TPanel(3) und alles klappt.

Wechsel der Mausposition dabei ohne jegliches Klicken oder Focus-Verändern.

Bevor Du aber Zeit darauf verwendest - ich werde nochmal einen kleineren Testfall bauen; TPanel(2) wird bei mir zur Laufzeit dazwischengeschoben, nicht dass das noch Schuld ist.
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
51 Beiträge
 
#9

AW: Mit Mausrad in TScrollBox scrollen

  Alt 18. Sep 2013, 09:31
Schau doch mal nach, was PScrollBox.ClientRect und AScrollBox.ClientRect jeweils zurückgeben - dann sollte es dir klar werden, was da schief geht.

Aber warum so kompliziert?


Delphi-Quellcode:
procedure TForm162.FormMouseWheel(Sender: TObject; Shift: TShiftState;
    WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
  vsb: TControlScrollbar;
  ctrl: TControl;
begin
  ctrl := ControlAtPos(ScreenToClient(MousePos), false, true, true);
  while (ctrl <> nil) and not (ctrl is TScrollBox) do begin
    ctrl := ctrl.Parent;
  end;
  if ctrl is TScrollBox then begin
    vsb := TScrollBox(ctrl).VertScrollBar;
    vsb.Position := vsb.Position - Sign(WheelDelta)*vsb.Increment;
    Handled := true;
  end;
end;

Ich habe eine Form1 + Panel1 als Parent. Dann öffne ich eine Form2 mit Scrollbox auf dem Form1.Panel1.Parent. Ab dann funktioniert der Code nicht mehr. Muss ich da noch über Findcomponent exakt den Control zuweisen?
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
2.993 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Mit Mausrad in TScrollBox scrollen

  Alt 5. Sep 2014, 14:32
Bei mir klappt der eigentlich verständliche Code von Uwe ebenfalls nicht. Ich denke es liegt daran, daß ich Panels auf Panel ins Groupboxen auf einer Scrollbox habe...also beliebig verschachteltes Zeugs. Beholfen habe ich mir hiermit:
Delphi-Quellcode:
procedure TForm.ScrollBox2MouseWheel(Sender: TObject;
  Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
  var Handled: Boolean);
var vsb:TControlScrollbar;
begin
  MousePos := ScreenToClient(MousePos);
  if PtInRect((Sender as TScrollBox), MousePos) then
  begin
    vsb := (Sender as TScrollBox).VertScrollBar;
    vsb.Position := vsb.Position - Sign(WheelDelta) * vsb.Increment;
  end;
end;
Und ja, ich hatte Uwes Code an das FormWheel-Event gehängt

Sherlock
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2018 by Daniel R. Wolf