Autor Beitrag
DummyScript
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Fr 06.08.10 17:24 
Hi!

Ich versuche einen Button zu erstellen, bei dem beim Klick ein Event ausgeführt wird (funktioniert) bzw. beim Loslassen der Maustaste (funktioniert nicht). Für das Loslassen habe ich das MouseUp Event verwendet.

Das Problem, das Click Event und das MouseUP Event werden kurz nacheinander aufgerufen (~10 ms versetzt) obwohl die Maustaste viel länger gedrückt wird. Jetzt habe ich 2 Fragen:
1) Habe ich das richtige Event in Verwendung?
2) Kann es sein, dass durch aufrufen von System.Threading.Thread.Sleep() automatisch der Button losgelassen wird? Bzw. gibt es ein Event bei dem das nicht so ist? Der Fehler wäre einfach zu beheben, einfach das Fenster in einem eigenen Thread starten....

Danke für eure Hilfe!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 06.08.10 17:51 
Bitte kurz erklären wofür du das brauchst dann kann man deine Probleme glaube ich besser verstehen.

zu 1) Vermutlich brauchst du die beiden, vermutlich aber nicht nur. Kommt drauf an was du vor hast. Z.B nur weil du einen Click von deinem Button bekommen hast muss du noch lange keinen folgenden MouseUp bekommen. Man könnte ja einfach bei gedrückter Mousetaste das focusierte Control wechseln(per TAB). Dann wirft ein anderes Control den MouseUp.

zu 2) Sleep ist vermutlich unschuldig. Wobei ich nicht weiß wie du das einsetzt uns warum. Und was ist loslassen eines Buttons? Bist du Drag&Drop für Controls am simulieren?
DummyScript Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Fr 06.08.10 18:51 
Ich habe 4 Buttons die ein Fadenkreuz darstellen. Durch drücken und halten einer der Buttons soll ein Teleskop bewegt werden. Dabei sende ich beim Klicken auf den Button einen Befehl über die Serielle Schnittstelle der das Teleskop in Bewegung versetzt und beim Loslassen wieder einen Befehl der das ganze stoppt.

Ja das mit Tab ist mit bewusst. Im Prinzip ist es nur für die Maus gedacht, aber falls das ganze auch mit Tab funktioniert wäre das eine nette Draufgabe.

Sleep() wird beim Senden des Befehls verwendet. Es wartet auf ein Acknowledge vom Teleskop. Theoretisch lässt sich dieses Sleep() vermeiden, doch ich will es nicht unnötig ausbauen da es eigentlich eine sehr komote Lösung ist.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 06.08.10 19:48 
Dann müsste man deinen Code sehen um dein Problem zu erkennen. Theoretisch sollte das so eigentlich funktionieren können.

Alternativ würde ich gleich anders ansetzen. Ich würde nicht 4 Buttons nehmen sondern nur 1 Control (Panel, leeres UserControl etc. oder was eigenes, eigentlich egal Hauptsache nur eine Oberfläche). In MouseEnter einen Thread starten und in MouseLeave stoppen. In diesem Thread regelmäßig die Position der Mouse und den Status der MouseButtons checken (über die statischen Control.MouseButtons bzw. Control.MousePosition Properties) und eben daraufhin die gewünschte Teleskopbewegung ausführen. Ein solches Vorgehen halte ich für weniger problematisch. Über Events so wie von dir begonnen ergeben sich doch ein paar logische Löcher im UI Verhalten (z.B das angesprochene TAB Problemchen) denen man mit zusätzlichem Code entgegen wirken müsste.
DummyScript Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 07.08.10 12:23 
Hab das Problem gelöst. Das Clickevent wird nämlich auch erst beim Loslassen der Maustaste aufgerufen. Mit dem MouseDown Event funkioniert es.

Danke für deine Hilfe!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 07.08.10 14:52 
user profile iconDummyScript hat folgendes geschrieben Zum zitierten Posting springen:
Hab das Problem gelöst. Das Clickevent wird nämlich auch erst beim Loslassen der Maustaste aufgerufen.
Klar, denn beim Herunterdrücken der Maustaste kann das System ja noch nicht wissen, ob es ein Klick wird oder z.B. ein Ziehen.

Ein Klick heißt Drücken und wieder loslassen. Dementsprechend kann das Event Click auch erst beim Loslassen ausgelöst werden.