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/)
-   -   Rechtsklick in Scrollbar einer TListBox abfangen (https://www.delphipraxis.net/203737-rechtsklick-scrollbar-einer-tlistbox-abfangen.html)

Amateurprofi 18. Mär 2020 03:24


Rechtsklick in Scrollbar einer TListBox abfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich in die vertikale ScrollBar einer TListBox rechtsklicke öffnet sich ein PopUp Menu mit den Einträgen
  • Bildlauf hier
  • Oberer Rand
  • Unterer Rand
  • Seite nach oben
  • Seite nach unten
  • Bildlauf oben
  • Bildlauf unten
Ich möchte anstatt folgendes Verhalten implementieren:
1) Wenn der Mauszeiger in die ScrollBar zeigt, soll ein Hinweis eingeblendet werden der angibt, welcher Eintrag der Position des Mauszeigers entspricht.
2) Bei Rechtsklick in die ScrollBar soll kein PopUp Menu erscheinen, sondern es soll, abhängig von der geklickten Position, folgendes passieren:
A) Oberer Pfeil Button geklickt : Zum Anfang der Liste scrollen
B) Unterer Pfeil Button geklickt : Zum Ende der Liste scrollen
C) Dazwischen geklickt: Zu dem Eintrag scrollen, der der Position des Mauszeigers entspricht.
Den ersten Teil (Hinweis einblenden) habe ich gelöst. (Siehe Testprojekt)
Beim zweiten Teil (Scrollen) habe ich bisher keinen Lösungsansatz.

Fragen:
Wie verhindere ich, dass ein PopUp Menu geöffnet wird?
Wie kann ich auf Rechtsklick in die ScrollBar reagieren?

Amateurprofi 18. Mär 2020 09:55

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
@Frühlingsrolle:

Leider bringt mich das aber nicht weiter.
1) Das MouseDown wird nur bei einem Klick in den Clientbereich der ListBox ausgelöst, nicht aber bei einem Klick in die ScrollBar der ListBox.
2) Es geht nicht darum, herauszufinden, ob einer der Buttons der Scrollbar gedrückt ist, weil ich auch ohne die ScrollBarInfo weiß, dass die nicht gedrückt sind, wenn ich sie mit der rechten Maustaste klicke.

Mir geht es darum

1) Auf einen Rechtsklick in die ScrollBar der ListBox zu reagieren, d.h. ich möchte wissen, welches Event bei einem Rechtsklick in die ScrollBar der ListBox ausgelöst wird.
2) Zu verhindern, dass das beschriebene PopUp Menu geöffnet wird.

Trotzdem: Danke für den Versuch zu helfen.

Uwe Raabe 18. Mär 2020 10:19

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
Ich fürchte, das Popup des Scrollbar-Teils wird von Windows selbst erstellt und angezeigt. Es gibt meines Wissens keine Möglichkeit, das zu verhindern oder zu beeinflussen.

Amateurprofi 18. Mär 2020 10:35

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
Zitat:

Zitat von Frühlingsrolle (Beitrag 1460038)
Damit das Popupmenu nur bei Bedarf erscheint, muss
Delphi-Quellcode:
TListBox.PopupMenu := nil
sein bzw. kein Popupmenu der Listbox zugewiesen werden und kann bei Bedarf mit
Delphi-Quellcode:
TPopupMenu.Popup(xPos, yPos)
aufploppen.

Nein!
Bei ListBox.PopUpMenu kann man ein eigenes PopUp-Menu eintragen, das dann bei Rechtsklick in den Clientbereich der Listbox angezeigt wird.
Und mit ListBox.OnContextPopUp kann man steuern, ob es automatisch geöffnet wird oder ob man in ListBoxContextPopUp dafür sorgt, dass es an einer bestimmten Position (oder auch gar nicht) geöffnet wird.
Mit dem PopUp Menu, das ich beschrieben habe hat das nichts zu tun.

Amateurprofi 18. Mär 2020 10:37

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1460041)
Ich fürchte, das Popup des Scrollbar-Teils wird von Windows selbst erstellt und angezeigt. Es gibt meines Wissens keine Möglichkeit, das zu verhindern oder zu beeinflussen.

Ja, das ist auch meine Befürchtung.
Aber vielleicht weiß ja doch irgend jemand eine Lösung.

venice2 18. Mär 2020 11:09

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
Zitat:

Zitat von Amateurprofi (Beitrag 1460043)
Zitat:

Zitat von Uwe Raabe (Beitrag 1460041)
Ich fürchte, das Popup des Scrollbar-Teils wird von Windows selbst erstellt und angezeigt. Es gibt meines Wissens keine Möglichkeit, das zu verhindern oder zu beeinflussen.

Ja, das ist auch meine Befürchtung.
Aber vielleicht weiß ja doch irgend jemand eine Lösung.

Nee wird es nicht.

Behandle WM_NCRBUTTONDOWN der ScrollBar! schicke Result := 1 zurück und gut ist.
Gerade getestet und bei mir kommt kein Menu.

Einzige Einschränkung du musst dich um das Zeichnen der Scrollbar selber kümmern.
Sprich mit vollen Zugriff darauf.

Amateurprofi 18. Mär 2020 14:35

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
@venice2:

Vielen herzlichen Dank für den Tipp.
Funktioniert einwandfrei.

Zu dem Hinweis "ScrollBar selbst zeichnen":
Bei mir wird die korrekt gezeichnet.

Falls jemand ähnliches realisieren möchte, hab ich in #1 das Testproject hochgeladen.

venice2 18. Mär 2020 14:54

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
Zitat:

Zu dem Hinweis "ScrollBar selbst zeichnen":
Bei mir wird die korrekt gezeichnet.
Ist nicht nötig vorausgesetzt du hast vollen Zugriff auf die Scrollbar um die Message WM_NCRBUTTONDOWN behandeln zu können.
Wie du schreibst scheint es ja bei dir jetzt zu funktionieren. :thumb:

An den Tooltips (Hints) musst du aber noch was tun die stimmen mit den Einträgen nicht überein.

Amateurprofi 18. Mär 2020 17:20

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
Zitat:

An den Tooltips (Hints) musst du aber noch was tun die stimmen mit den Einträgen nicht überein.
Bei mir tun sie es.
Wenn die Maus in die ScrollBar zeigt, wird angezeigt, welcher Eintrag der Position des Mauszeigers entspricht.
Wenn ich dann einen Rechtsklick in die ScrollBar mache, wird die Liste so gescrollt, dass der Eintrag, der im Hint gezeigt wurde, als oberster Eintrag gezeigt wird.
Ausnahmen: Die letzten Einträge können ev. nicht ganz nach oben gescrollt werden.

Kannst du etwas genauer beschreiben, was unter "die stimmen mit den Einträgen nicht überein" zu verstehen ist.

venice2 18. Mär 2020 17:43

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
Ein Bild scheint hier angebracht zu sein.
Es ist der Eintrag 9 Selektiert und die Maus befindet sich in diesen Bereich allerdings wird hier der Eintrag 821 angezeigt.
Das passt irgendwie nicht zusammen.

Meine Meinung.
Ist aber möglich das es dir so reicht bzw. in Ordnung für dich ist.

Deine beschriebene Methode (Ergebnis) funktioniert jedoch korrekt.
Vielleicht umbenennen damit man weis um was es geht?
Zitat:

"Get List entry from current mouse position xxx"

venice2 18. Mär 2020 20:28

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
Zitat:

zeigt bei mir den Wert aus der selektierten Zeile an. Habe es mit Delphi 2006 getestet.
Ist aber nicht das was er möchte.

Er ermittelt abhängig von der aktuellen Maus Position innerhalb der Scrollbar den aktuellen Index der sich an dieser Position befindet.
Mit einem Rechtsklick schiebt er dann diesen Index on Top in der Listbox.
So habe ich das verstanden.

Das funktioniert so wie er es will. :)

Das wäre die korrekte Procedure damit auch alles passt.

Delphi-Quellcode:
procedure WMNCRBUTTONDOWN(var Msg: TWMNCRButtonDown); message WM_NCRBUTTONDOWN;
Delphi-Quellcode:
procedure TListBox.WMNCRBUTTONDOWN(var Msg: TWMNCRButtonDown);
var
  Index: Integer;
begin
  if MousePosToIndex(ScreenToClient(Point(Msg.XCursor, Msg.YCursor)), Index) then
  begin
    EraseSBarHint;
    TopIndex := Index;
  end;
  Msg.Result := 1;
end;

Amateurprofi 19. Mär 2020 05:22

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
Zitat:

Zitat von venice2 (Beitrag 1460076)
Ein Bild scheint hier angebracht zu sein.
Es ist der Eintrag 9 Selektiert und die Maus befindet sich in diesen Bereich allerdings wird hier der Eintrag 821 angezeigt.
Das passt irgendwie nicht zusammen.

Meine Meinung.
Ist aber möglich das es dir so reicht bzw. in Ordnung für dich ist.

Deine beschriebene Methode (Ergebnis) funktioniert jedoch korrekt.
Vielleicht umbenennen damit man weis um was es geht?
Zitat:

"Get List entry from current mouse position xxx"

Dann habe entweder ich schlecht beschrieben, was ich beabsichtigte oder ... .
Der "Hint" den ich ausgebe soll nicht angeben, welcher Eintrag gerade den Fokus hat (=ItemIndex) sondern er soll mir zeigen an welcher Stelle der Liste ich lande, wenn ich die ScrollBar rechtsklicke.

"Mein Rechtsklick" ist im Prinzip das Gleiche, was Windows macht, wenn ich in dem PopUp Menu den Eintrag "Bildlauf hier" auswähle.
Was mir bei der Verwendung des PopUp Menus nicht gefällt, ist, dass ich dort keine Information habe, wo ich in der Liste lande, wenn ich "Bildlauf hier" auswähle. Ich kann zwar ungefähr abschätzen wo ich landen werde, aber ich wüsste dass gern vorher.
Bei meiner Methode wird mir angezeigt, wo ich landen werde, wobei ich die Wahl habe, mir nur den Index des Eintrags anzeigen zu lassen oder den Klartext des Listen-Eintrags.
Eine Option wäre noch, die Liste so zu scrollen, dass der Eintrag, zu dem ich springe, an der Y-Position der Mauszeigers angezeigt wird und nicht als obersten Eintrag.

Amateurprofi 19. Mär 2020 05:40

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
Zitat:

Zitat von venice2 (Beitrag 1460083)
Er ermittelt abhängig von der aktuellen Maus Position innerhalb der Scrollbar den aktuellen Index der sich an dieser Position befindet.
Mit einem Rechtsklick schiebt er dann diesen Index on Top in der Listbox.
So habe ich das verstanden..

Genau so ist es.

Zitat:

Zitat von venice2 (Beitrag 1460083)
Das wäre die korrekte Procedure damit auch alles passt.

Delphi-Quellcode:
procedure WMNCRBUTTONDOWN(var Msg: TWMNCRButtonDown); message WM_NCRBUTTONDOWN;
Delphi-Quellcode:
procedure TListBox.WMNCRBUTTONDOWN(var Msg: TWMNCRButtonDown);
var
  Index: Integer;
begin
  if MousePosToIndex(ScreenToClient(Point(Msg.XCursor, Msg.YCursor)), Index) then
  begin
    EraseSBarHint;
    TopIndex := Index;
  end;
  Msg.Result := 1;
end;

Danke für die Korrektur. Werde ich entsprechend anpassen.

venice2 19. Mär 2020 16:51

AW: Rechtsklick in Scrollbar einer TListBox abfangen
 
Zitat:

Eine Option wäre noch, die Liste so zu scrollen, dass der Eintrag, zu dem ich springe, an der Y-Position der Mauszeigers angezeigt wird und nicht als obersten Eintrag.
Genau das solltest du tun dann entspricht es dem Popup Menu Eintrag "Bildlauf hier" :)
und du umgehst das Problem mit dem Top Index der ListBox wenn dieser nicht mehr OnTop gesetzt werden kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 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