Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Scrollrad und Touchpad-Bildlauf (https://www.delphipraxis.net/45805-scrollrad-und-touchpad-bildlauf.html)

bernie110 12. Mai 2005 15:51


Scrollrad und Touchpad-Bildlauf
 
Hallo,
ich habe eine Scrollbox mit einer unterlagerten Paintbox programmiert. Nun soll auch mit dem Scrollrad an der Maus vertikal gescrollt werden.

1. Frage:
Wenn der Focus auf einer Listbox steht, so wird die Listbox durchgescrollt (häßlich!) und nicht die Scrollbox. Wie kann ich das hinbekommen, dass immer die Scrollbox das OnMouseWheel-Ereignis erhält, egal wo der Focus gerade ist?

Mein Touchpad und das an anderen Laptops hat einen "virtuellen Bildlauf" und das System tut dann bspw. im Explorer so, als ob das Mausrad betätigt wurde. In meinem Programm hat dieser "virtuelle Bildlauf" aber überhaupt keine Auswirkung/Funktion.

Daher die 2. Frage:
Wie kann ich den "virtuellen Bildlauf" des Touchpads in ein OnMouseWheel-Ereignis transformieren?

Wäre schön, wenn mir jemand helfen könnte.

Danke im Voraus,
Bernie110

marabu 13. Mai 2005 17:07

Re: Scrollrad und Touchpad-Bildlauf
 
Liste der Anhänge anzeigen (Anzahl: 1)
Deine Form ist der Dispatcher für die MouseWheel-Message. Ich habe dir eine Beispiel-Unit erstellt, die dir zeigt, wie du deine Paintbox (bei mir ist sie einfach mal leer) mit dem Wheel rauf und runter scrollen kannst.

Grüße vom marabu

bernie110 17. Mai 2005 10:58

Re: Scrollrad und Touchpad-Bildlauf
 
Danke, marabu, das funzt schon ganz gut.
Nur wird das Scrollrad am rechten und am unteren Rand des Form nicht erkannt, das heißt: ist der Mauszeiger in einem bestimmten Bereich rechts bzw. unten, so läßt sich die Paintbox nicht per Scrollrad bewegen. Läßt sich da noch etwas verbessern?

Außerdem, weiss jemand zum 2. Punkt meiner Anfrage ' "virtueller Bildlauf" des Touchpads' eine Lösung?

Bernie110

marabu 17. Mai 2005 11:14

Re: Scrollrad und Touchpad-Bildlauf
 
Wenn dein mouse wheel rechts und unten nicht erkannt wird, dann liegt das daran, dass du den Rahmen der Scrollbox nicht berücksichtigst. Überprüfen kannst du das, indem du BorderStyle zum Test auf bsNone setzt. Korrigier einfach das Rect, welches du für die Funktion ptInRect() übergibst.

marabu

marabu 17. Mai 2005 12:00

Re: Scrollrad und Touchpad-Bildlauf
 
Funktioniert virtual scrolling mit irgendeiner Anwendung?
Hast du den Treiber für das Touchpad schon aktualisiert?

marabu

bernie110 18. Mai 2005 09:34

Re: Scrollrad und Touchpad-Bildlauf
 
Zitat:

Zitat von marabu
Wenn dein mouse wheel rechts und unten nicht erkannt wird, dann liegt das daran, dass du den Rahmen der Scrollbox nicht berücksichtigst. [...] Korrigier einfach das Rect, welches du für die Funktion ptInRect() übergibst.

marabu

Hallo marabu,
in Deinem Beispiel stand u.a.
Delphi-Quellcode:
procedure TMainForm.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if PtInRect(ScrollBox.ClientRect, ScreenToClient(MousePos)) then
    ScrollBoxMouseWheelDown(Sender, Shift, MousePos, Handled);
end;

procedure TMainForm.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if PtInRect(ScrollBox.ClientRect, ScreenToClient(MousePos)) then
    ScrollBoxMouseWheelUp(Sender, Shift, MousePos, Handled);
end;
Wenn ich nun statt der "ScrollBox.ClientRect" die ClientRect des Formulars einsetze, also
Delphi-Quellcode:
procedure TMainForm.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if PtInRect(Form.ClientRect, ScreenToClient(MousePos)) then
    ScrollBoxMouseWheelDown(Sender, Shift, MousePos, Handled);
end;

procedure TMainForm.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if PtInRect(Form.ClientRect, ScreenToClient(MousePos)) then
    ScrollBoxMouseWheelUp(Sender, Shift, MousePos, Handled);
end;
schreibe, funktioniert es, da nun nicht mehr nur die Größe der Scrollbox auf dem Formular für die Mausaktion erkannt wird, sondern das ganze Formular.

Zitat:

Zitat von marabu
Funktioniert virtual scrolling mit irgendeiner Anwendung?

Beim MS-Explorer und - glaube ich - so ziemlich allen anderen käuflich erwerbbaren Programmen wird ein Bildlauf ausgelöst. Hier sieht es auch so aus, dass der Mauszeiger dabei auf den Scrollbalken springt.
Den Treiber habe ich noch nicht aktualisiert.

Gruß Bernie110

marabu 18. Mai 2005 09:42

Re: Scrollrad und Touchpad-Bildlauf
 
Zitat:

Zitat von bernie110
Wenn ich nun statt der "ScrollBox.ClientRect" die ClientRect des Formulars einsetze, funktioniert es, da nun nicht mehr nur die Größe der Scrollbox auf dem Formular für die Mausaktion erkannt wird, sondern das ganze Formular.

Das funktioniert nur solange du keinen weiteren Scrollbar (Listbox, Memo, ...) auf deiner Form hast. Sauberer ist es, wenn du die Rahmendicke im Rect berücksichtigst.

marabu

bernie110 18. Mai 2005 13:16

Re: Scrollrad und Touchpad-Bildlauf
 
Hallo marabu,
Leider stimmt das insofern nicht, als
a) es sich nicht nur um den Rand der Scrollbox handelt (Deinen Tipp mit "BorderStyle zum Test auf bsNone setzen" habe ich ausprobiert --> brachte keine Verbesserung);

b) innerhalb der Scrollbox das Scrollrad vollständig erkannt wird;

c) meine Scrollbox nur ca. 4/5 der Breite und 2/3 der Höhe des Formulars einnimmt.
Beispielsweise:
Delphi-Quellcode:
Form.Width := 500;
Form.Height := 300;

Scrollbox.Top := 100;
Scrollbox.Left := 100;
Scrollbox.Width := 400;
Scrollbox.Height := 200;
Dann bleiben rechts und unten jeweils 100 Pixel übrig, die vom Scrollrad nicht "erfasst" werden und nicht nur der Rahmen.

Ich verstehe die Funktion "ptInRect()" auch so, dass, wenn sich die Maus in "diesem Bereich" befindet, dann wird diese Aktion an die Scrollbar weitergeleitet. Und "dieser Bereich" sollte doch das gesamte Formular sein.

Bernie110

marabu 18. Mai 2005 16:11

Re: Scrollrad und Touchpad-Bildlauf
 
Mein Beispiel kannst du etwa so an deine Bedürfnisse anpassen:

Delphi-Quellcode:
procedure TMainForm.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
var
  sbr: TRect;
begin
  with Scrollbox do begin
    sbr.TopLeft := ClientToParent(ClientRect.TopLeft);
    sbr.BottomRight := ClientToParent(ClientRect.BottomRight);
  end;
  if PtInRect(sbr, ScreenToClient(MousePos)) then
    ScrollBoxMouseWheelDown(Sender, Shift, MousePos, Handled);
end;
An diesem Code-Fragment solltest du sehen, warum dein Scrollrad rechts unten nicht erkannt wurde. Weitere Anpassungen kannst du, wenn nötig, nach dem gleichen Muster vornehmen.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz