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 Doppelklick in MouseDown erkennen (MouseDown vs. DblClick) (https://www.delphipraxis.net/149040-doppelklick-mousedown-erkennen-mousedown-vs-dblclick.html)

CodeX 12. Mär 2010 22:40


Doppelklick in MouseDown erkennen (MouseDown vs. DblClick)
 
Ich möchte beim TrayIcon (CoolTrayIcon) gerne unterschiedliche Aktionen je nach Klick-Art durchführen.

Im OnMouseDown Ereignis greife ich nun die linke und die rechte Maustaste ab und im OnDblClick Ereignis einen Doppelklick. Das Problem ist nun, dass bei einem Doppelklick auch das Ereignis vom einfachen Linksklick durchgeführt wird, was natürlich nicht sein darf.

Wie kann ich jetzt im OnMouseDown Ereignis erkennen, ob es sich bei diesem Klick um Teil eines Doppelklicks handelt, um die Aktion dann entsprechend nicht auszuführen? Sender, Button, Shift und X,Y helfen mir da irgendwie nicht weiter...

Oder ganz anders?

blablab 12. Mär 2010 23:12

Re: Doppelklick in MouseDown erkennen (MouseDown vs. DblClic
 
Das Problem ist, dass der Einfachklick schon vor dem Doppelklick ausgelöst wird. Das bedeutet also, dass du das nur umgehen kannst, wenn du nach einem Einfachklich eine bestimmte Zeit wartest und erst dann reagierst, wenn in dieser Zeit kein 2. mal geklickt wurde. Das ganze wird dann sehr unschön, weil es ungewohnt ist, dass nicht sofort auf einen Einfachklich reagiert wird. Du solltest dir also vorher nochmal überlegen ob das sinnvoll ist...

stoxx 13. Mär 2010 09:37

Re: Doppelklick in MouseDown erkennen (MouseDown vs. DblClic
 
gibts denn bei Deinem CoolTrayIcon kein OnClick Event und OnDblClick Event?
hat doch eigentlich jede Komponente, probiere es mit einem Panel aus.
Da wird alles schon unterschieden .. und macht Windows automatisch.
die persönlich gewünschte Sensitivität zur Unterscheidung von Click und Dbl Click kann man doch in der Systemsteuerung einstellen ..
Wenn Du noch linke und rechte Maustaste unterscheiden willst, dann merke Dir im OnMousedown, was geklickt wurde, und im OnClick machst Du die entsprechenden Sachen, MouseDown kommt eher als OnClick

CodeX 13. Mär 2010 15:21

Re: Doppelklick in MouseDown erkennen (MouseDown vs. DblClic
 
Das Problem ist, dass OnClick nicht bei einem Rechtsklick ausgeführt wird. D.h. es bringt auch nichts, sich die Maustausche bei OnMouseDown zu merken. Das war der Grund, warum ich auf OnClick verzichten wollte. Aber nun gut, jetzt habe ich das auf die einzelnen Ereignisse verteilt. Linksklick greife ich bei OnClick ab, Doppelklick bei OnDblClick und den Rechtsklick bei OnMouseDown mit Button = mbRight.

Damit sollte das jetzt passen. Danke für Eure Hinweise!

himitsu 13. Mär 2010 15:27

Re: Doppelklick in MouseDown erkennen (MouseDown vs. DblClic
 
Nimm statt OnMouseDown besser OnMouseUp ... erstmal kann es so keine Probleme bei der Tastenbehandlung ergeben, da der Mausklick an dieser Stelle quasi schon beendet ist.

Außerdem kann man, wie bei einem Linksklick auch den Klick noch "abbrechen",
so wie es z.B. standardmäßig bei allen Buttons und Menüs auch ist.

> Mit Rechts anklicken, die Maus wegziehen und dann erst die Taste loslassen = kein Rechtsklick.

CodeX 13. Mär 2010 15:46

Re: Doppelklick in MouseDown erkennen (MouseDown vs. DblClic
 
Du hast Recht. Vielen Dank! :)

Delphi-Laie 15. Mär 2010 11:45

Re: Doppelklick in MouseDown erkennen (MouseDown vs. DblClic
 
Dieses Verhalten, daß bei einem Doppelklick mindestens ein oder gar zwei Einfachklickereignis(se) erkannt werden (bei einem vorher, bei zweien eines davor und eines danach), stört mich auch. Mir fiel es auch auf, und zwar als erstes in der TTrayIcon-Klasse in Lazarus, dann auch in der gleichnamigen Klasse in Turbo-Delphi auf.

Dass muß jedoch nicht so sein! Die Komponente CoolTrayIcon (sie liefert zwei TNA-Icons (ein animierbares und ein textuelles), kann in der mir vorliegenden Version (4.3.1) zwischen Einfach- und Doppelklick sauber unterscheiden. Ich werde wohl mal die Quelltexte dieser Komponente inspizieren.

Weiß jemand, ob Windows selbst schon zwischen diese beiden Klickarten unterscheiden kann/muß?

Edit: Inzwischen herausgefunden, daß bei CoolTrayIcon nach dem sog. MouseUpEvent noch ein klein wenig (nur unauffällig wenig, also nicht störend) Zeit (in der Variable GetDoubleClickTime fixiert) vergeht, bis das Einfachklickereignes ausgelöst wird, anzunehmenderweise, um zur Sicherheit abzuwarten, ob nicht doch ein Doppelklick vorliegt.

Benmik 30. Dez 2018 21:28

AW: Doppelklick in MouseDown erkennen (MouseDown vs. DblClick)
 
Da der Titel gut passt (der Inhalt ist eigentlich etwas anders), mache ich kein neues Thema auf.

Nachdem mich ein völlig unerklärlicher Bug eben völlig verrückt gemacht hat, habe ich ich bei einem Blick in Vcl.Controls gesehen, dass Delphi nach einem Doppelklick noch ein MouseDown anhängt.

Dass vorher MouseDown und MouseUp und Click und was weiß ich was kommen, dass wusste ich ja, aber ein unmotiviertes, überfallartiges MouseDown einfach so nach beendetem Doppelklick - wer denkt sich sowas aus ?!?!

Ich habe jetzt ein
Delphi-Quellcode:
If GetKeyState(VK_LBUTTON) < 0
eingefügt, um das "echte" MouseDown zu erkennen (siehe übrigens auch hier). Welchem Zweck dient dieses bescheuerte MouseDown?

Schokohase 31. Dez 2018 08:24

AW: Doppelklick in MouseDown erkennen (MouseDown vs. DblClick)
 
Überleg doch einfach mal wann ein MouseDown und MouseUp Event kommt.

Genau, wenn man den Maus-Button herunterdrückt (Down) und wieder loslässt (Up).

Und was ist ein Doppelklick?

Genau, wenn man hintereinander zweimal den Maus-Button herunterdrückt und loslässt.

Diese Events kommen also nicht von Delphi sondern von deinem Finger auf der Maus. Die einzig berechtigte Frage hier ist ob es wirklich sinnvoll ist wenn (in Delphi) der Doppelklick anhand des MouseDown Events erkannt wird. Schliesslich wird der einfache Klick anhand des MouseUp Events erkannt.

Uwe Raabe 31. Dez 2018 11:17

AW: Doppelklick in MouseDown erkennen (MouseDown vs. DblClick)
 
Zitat:

Zitat von Benmik (Beitrag 1422339)
Da der Titel gut passt (der Inhalt ist eigentlich etwas anders), mache ich kein neues Thema auf.

Finde ich jetzt nicht wirklich gut.

Zitat:

Zitat von Benmik (Beitrag 1422339)
Nachdem mich ein völlig unerklärlicher Bug eben völlig verrückt gemacht hat, habe ich ich bei einem Blick in Vcl.Controls gesehen, dass Delphi nach einem Doppelklick noch ein MouseDown anhängt.

Ja, tut es! Und zwar ganz bewusst mit einem [ssDouble] als ShiftState, damit man das auch im Eventhandler erkennen kann. Im OnMouseDown werden nämlich auch die Koordinaten mitgegeben, die im OnDblClick fehlen.

Schokohase 31. Dez 2018 13:09

AW: Doppelklick in MouseDown erkennen (MouseDown vs. DblClick)
 
Ok, ich war da eben nicht ganz korrekt mit meiner Antwort.

Ein Click ist wie folgt deklariert: Ein WM_LBUTTONDOWN und WM_LBUTTONUP Nachricht muss innerhalb der Grenzen eines Controls erfolgen. Die Zeitspanne zwischen WM_LBUTTONDOWN und WM_LBUTTONUP ist unerheblich (können auch mehrere Stunden sein, wenn man keinen Krampf im Finger bekommt).

Ein DoubleClick ist da schon etwas anderes. Das Betriebssystem selber erkennt den DoubkeClick und sendet dann eine WM_LBUTTONDBLCLK Nachricht. Auslöser dafür ist das erneute drücken der Maustaste innerhalb eines bestimmten Zeitraums innerhalb bestimmter Grenzen (einstellbar im Betriebssystem).

Für jeden DoppelKlick erhält man also folgende Nachrichten:
Code:
WM_LBUTTONDOWN -> WM_LBUTTONUP -> WM_LBUTTONDBLCLK -> WM_LBUTTONUP
Das System sendet nun also anstatt einer simplen WM_LBUTTONDOWN eine WM_LBUTTONDBLCLK Nachricht (aufgepasst, die Maus-Taste ist noch gedrückt) und wenn die Taste losgelassen wird wie gehabt eine WM_LBUTTONUP Nachricht.

Delphi-Spezifisch

In Delphi selber kann man sich darauf verlassen, dass es zu einem
Delphi-Quellcode:
MouseUp
Event auch ein
Delphi-Quellcode:
MouseDown
Event gegeben hat (diese tauchen also zeitlich getrennt immer paarweise auf). Darum wird in Delphi auch der
Delphi-Quellcode:
MouseDown
Event bei der Nachricht WM_LBUTTONDBLCLK ausgelöst, denn sonst würde bei einem DoppelKlick dieser Paarlogik gebrochen.

Es geht auch anders

Bei Microsoft und WinForms, da wird der
Delphi-Quellcode:
Click
und
Delphi-Quellcode:
DoubleClick
Event erst bei
Delphi-Quellcode:
MouseUp
ausgelöst. Allerdings bekommt man hier nun ein etwas anderes Verhalten bei einem Doppelklick.

So kann man hier einen
Delphi-Quellcode:
DoubleClick
wie den
Delphi-Quellcode:
Click
herauszögern oder sogar verhindern, wenn man beim zweiten Drücken die Taste festhält und dann eine beliebige Zeitspann wartet und dann irgendwann die Maustaste löst.

Benmik 31. Dez 2018 15:50

AW: Doppelklick in MouseDown erkennen (MouseDown vs. DblClick)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1422353)
Finde ich jetzt nicht wirklich gut.

Naja, ich kam hierher durch eine Suche. Der Titel passt perfekt zu dem, was ich suchte, so dass andere auch genau hier landen werden. Ich hätte künstlich einen anderen Titel vergeben müssen, dann hätten alle zwei Themen durchgehen müssen.

Natürlich war mir klar, dass sich Borland seinerzeit etwas dabei gedacht hat. Die Erklärung von Schokohase habe ich dann beim zweiten Durchlesen begriffen.

In all den Jahren war ich fest der Überzeugung, dass die Reihenfolge so ist:
Delphi-Quellcode:
WM_LBUTTONDOWN -> WM_LBUTTONUP -> WM_LBUTTONCLK -> WM_LBUTTONDBLCLK
. Soso, WM_LBUTTONCLK gibt es gar nicht. Und der Doppelklick kommt vom Betriebssystem. Jetzt verdrehen hier alle alten Hasen die Augen, aber ich bin mir völlig sicher, dass so mancher stiller Mitleser ebenso platt ist wie ich.

Also: Bei jedem MouseDown aufpassen, wenn es auch noch ein DblClick gibt. Der Tipp von Uwe mit
Delphi-Quellcode:
(ssDouble in Shift)
ist dabei sehr nützlich. Das ist ja ein Minenfeld hier.

Schokohase 31. Dez 2018 19:29

AW: Doppelklick in MouseDown erkennen (MouseDown vs. DblClick)
 
Es steht aber so geschrieben
Zitat:

Double-clicking the left mouse button actually generates a sequence of four messages: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, and WM_LBUTTONUP.
Es ist also mehr eine Frage ob man die Dokumentation gelesen hat.

Benmik 31. Dez 2018 19:59

AW: Doppelklick in MouseDown erkennen (MouseDown vs. DblClick)
 
Aber klar ist es das. Und ganz bestimmt habe ich nicht alle Dokumentation über alles gelesen. Das haben die Profis aber immer wieder auch nicht, wie man hier unschwer mitlesen kann. Die über solche grundlegenden Dinge wie Mausereignisse aber vermutlich schon. Schön für die Profis. Sie wären aber vermutlich nicht mehr lange Profis, wenn sie es nicht täten.

Übrigens hätte mir das Studium der Dokumentation hier auch nur bedingt geholfen. Denn am Ende der Sequenz kommt bei Windos WM_LBUTTONUP, bei Delphi aber MouseDown. Egal, wieder was gelernt.

Schokohase 31. Dez 2018 20:35

AW: Doppelklick in MouseDown erkennen (MouseDown vs. DblClick)
 
Der Hinweis auf die Dokumentation soll ja auch nur die Verwunderung bremsen, weil es eben kein geheimes Wissen ist. Mehr nicht.

Warum Delphi den MouseDown Event feuert habe ich auch erläutert und ja, wenn man mit Delphi für Windows programmiert, dann muss man sich mit Delphi und Windows auseinandersetzen. Da sollte jetzt aber nicht neu sein. Da die Dokumentation von Delphi teilweise schwach bis gar nicht vorhanden ist, muss man dort auch mal in den Source schauen (soweit es möglich ist).

Benmik 1. Jan 2019 17:58

AW: Doppelklick in MouseDown erkennen (MouseDown vs. DblClick)
 
"Verwunderung" ist ja eine freundliche Umschreibung ...

Der Hobbyprogrammierer unterscheidet sich ja vom Profi (unter anderem) darin, dass er nicht alles von der Pike auf lernt, sondern in der Regel nur das, was er gerade braucht (oder zu brauchen glaubt). Das bringt Lücken mit sich, die dem Profi die Haare zu Berge stehen lassen.

Das Problem hier bestand darin, dass ich gar nicht auf die Idee kam, meine Vorstellung vom Ablauf eines Doppelklicks zu hinterfragen (so wie auch hier geschehen). Selbst wenn, dann hätte ich ohne dieses Forum die Hintergründe niemals so schnell erfahren. Das ist ja die erstaunliche Stärke der Delphi-Praxis, dass sich hier gestandene Experten nicht zu schade sind, ihre Zeit (und ihre Haare, die sie sich dauernd raufen) Anfängern zu widmen.

Natürlich ist es auch schön, wenn man mal den Platz auf der anderen Seite der Schulbank einnehmen kann. Und da verwundert es nicht, dass es hier strenge pädagogische Prinzipien gibt, und zwar noch von der guten alten Art. Ein ehernes lautet: Eigenleistung! Das Kind bekommt nichts fertig vorgesetzt, es soll sich selber anstrengen! Wenig hat mich so erheitert wie dieser Sketch, in dem gestandene Erwachsene um die Generation Z herumtanzen (ideales Subjekt für eine psychologische Seminararbeit: DieDolly). Man muss KetchUp aber auch für seine Bierruhe und sein Durchhaltevermögen bewundern. Wie sehr man aber der eigenen Sphäre verhaftet ist, das sieht man unter anderem (nur ein Beispiel!) an diesem Kommentar. Es ging um ein Schulprojekt! Jetzt bin ich über die Phase von Schulprojekten hinaus, aber ich bin mir sicher, dass man sich noch öfter über meine Lücken wird wundern müssen. Ich werde nie mit Delphi mein Brot verdienen - morgen fängt mein RL wieder an!


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