![]() |
TImage Doppelklick bei gesetzten OnClick Event
Hi, ich habe folgendes Problem: Ich habe einem Image ein OnClick Event zugewiesen und möchte jetzt dazu auch noch ein OnDblClick hinzufügen nur geht das nicht so wie ich mir das vorstelle. Denn wenn ich auf das Image doppelklicke dann nimmt das Programm es als zwei mal OnClick und nicht als OnDblClick an. Wie kann ich das ändern?
Danke Luki :spin: |
AW: TImage Doppelklick bei gesetzten OnClick Event
Du brauchst eine Zeitmessung, wo entschieden wird, ob es Doppel- oder Einfachklick ist. Damit du nicht dafür einen TTimer vergewaltigst, kannst du hier auch zB mit GetTickCount arbeiten. Du speicherst den TickCount beim OnClick und schaust beim nächsten OnClick, ob dieser innerhalb von zB 200ms liegt. Wenn ja, ist es ein Doppelklick.
Delphi-Quellcode:
var
StartTicks, CurTicks, PassedMs: Cardinal; begin StartTicks := GetTickCount; repeat CurTicks := GetTickCount; PassedMs := CurTicks - StartTicks; WriteLn(PassedMs, 'ms'); Sleep(100); until FALSE; end; |
AW: TImage Doppelklick bei gesetzten OnClick Event
Ich hätte ja gedacht, dass die Erkennung durch das Betriebssystem erfolgt:
http://de.wikipedia.org/wiki/Doppelklick#Mausaktionen der Doppelklick: das zweimalige Drücken der Maustaste kurz hintereinander, wobei die Maus nicht bewegt wird. Manche Programme unterstützen auch Drei- bis Fünffachklicks. Aufgrund der schwierigen Ausführung haben sich letztere aber nicht durchgesetzt. Bei den meisten Betriebssystemen ist der Zeitabstand einstellbar, in der die zweite Tastenbetätigung erfolgen muss, um als Doppelklick akzeptiert zu werden. Manchmal ist auch ein Schwellwert einstellbar, wie weit sich die Maus zwischen den beiden Klicks bewegen darf, da sich bei hochempfindlichen Mäusen ein vollkommener Stillstand kaum noch realisieren lässt. |
AW: TImage Doppelklick bei gesetzten OnClick Event
Wenn die Erkenneung durch das OS automatisch passieren würde, dann würden die Klickereignisse alle verzögert und das ist auch nicht so schön.
Das ist wie im FMX, wenn man schnell/kurz auf einen TButton klickt, dann sieht man das nicht, da der Button eben nicht kurz niederedrückt wird, so wie man das vom Windows und anderen OSen eigentlich kennt. |
AW: TImage Doppelklick bei gesetzten OnClick Event
Also die Erkennung erfolgt durch das Betriebssystem ... aber
bei jedem Doppel-Klick wird brav OnDblClick ausgelöst allerdings vorher wird OnClick noch ausgelöst. Es gibt damit also 2 Events die ausgelöst werden. |
AW: TImage Doppelklick bei gesetzten OnClick Event
Zitat:
Wenn man vor dem Auslösen des OnClick-Events noch warten würde, ob es nicht vielleicht doch ein OnDblClick wird, dann wäre das nicht ganz so praktischt. Wenn man wirklich OnClick und OnDblClick parallel haben will und dabei OnClick nicht mit ausgelöst werden soll, wenn das Andere, dann wird man das wohl selber behandeln müssen, da es sich allgemein/immer leider nicht umsetzen lässt. (vielleicht könnte man ins OS eine Option einbauen, welche bei Komponenten einzeln aktivierbar sind) Sellt mal die Behindertenoption ein ... Doppelklickerkennung auf 2,5 Sekunden :stupid: |
AW: TImage Doppelklick bei gesetzten OnClick Event
Zitat:
Zitat:
Wie geht das also dann? Im OnClick muss ich einen Timer starten, der kurze Zeit später das eigentliche OnClick startet. Im OnDblClick resette ich den Timer und schalte ihn aus. Das Interval des Timers setze ich auf GetDoubleClickTime+20, also etwas länger als die Doppelklickzeit. Allerdings würde ich mir die User Experience nochmal durch den Kopf gehen lassen: Vermutlich ist es keine gute Idee, bei einer Komponente sowohl Einfach- als auch Doppelklicks zu erlauben. Ziehen und Doppelklick kenne ich, aber 1x und 2x nicht. |
AW: TImage Doppelklick bei gesetzten OnClick Event
Der Benutzer ist durchaus mit Klick und Doppelklick vertraut.
Ein Klick im Explorer setzt die angeklickte Datei auf ausgewählt und ein Doppelklick öffnet die Datei. Aber es geht eben nur wenn die beiden Aktionen sich nicht gegenseitig behindern. Sonst benötigt man tatsächlich dieses Timer-Gedöns, was allerdings bei einem Doppelklick-Intervall von mehr als 1 Sekunde (ja, bestimmt ungewöhnlich) seltsam bis störend wirkt. |
AW: TImage Doppelklick bei gesetzten OnClick Event
Zitat:
Es ist auch beim Explorer manchmal blöd, das eine Datei ausgewählt wird, obwohl ich sie öffnen will. |
AW: TImage Doppelklick bei gesetzten OnClick Event
Ja, ein Doppelklick Event kommt eben immer mit einem vorhergehenden Klick Event daher (Vorgabe durch das Betriebssystem).
Ohne das Gefriemel (z.B. Timer) kann man die nicht isoliert behandeln. Besser wäre es wohl, das Konzept zu überdenken um den Benutzer nicht zu überraschen. |
AW: TImage Doppelklick bei gesetzten OnClick Event
Zitat:
Delphi-Quellcode:
zuweisen, sondern eine Verzweigung, ob entweder ein
OnDblClick
Delphi-Quellcode:
oder
DoClick
Delphi-Quellcode:
ausgeführt werden soll, im
DoDblClick
Delphi-Quellcode:
implementieren.
OnClick
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Zitat:
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Zitat:
Ein Doppelklick wird durch die Mauseinstellungen des Betriebssystems des Benutzers bestimmt. Der Benutzer kann den Zeitraum festlegen, innerhalb dessen der zweite Mausklick erfolgen muss, damit zwei aufeinander folgende Mausklicks als Doppelklick erkannt werden. Bei jedem Doppelklick auf ein Steuerelement wird das Click-Ereignis ausgelöst. Wenn Sie z. B. über einen Ereignishandler für das Click-Ereignis und für das DoubleClick-Ereignis eines Form verfügen, wird das Click-Ereignis und das DoubleClick-Ereignis ausgelöst, wenn auf das Formular doppelgeklickt wird und beide Methoden aufgerufen werden. Bei einem Doppelklick auf ein Steuerelement, das das DoubleClick-Ereignis nicht unterstützt, wird das Click-Ereignis möglicherweise zweimal ausgelöst. Damit dieses Ereignis ausgelöst wird, müssen Sie den StandardClick-Wert von ControlStyles auf true festlegen. ![]() ![]() Zitat: Normalerweise initiiert ein einzelner Klick eine Benutzeroberflächenaktion, und mit einem Doppelklick wird die Aktion erweitert. Beispielsweise wird mit einem Klick für gewöhnlich ein Element ausgewählt und dieses mit einem Doppelklick bearbeitet. Die Windows Forms-Klickereignisse lassen jedoch nur schwer ein Szenario zu, in dem ein Klick und ein Doppelklick inkompatible Aktionen ausführen, da eine mit dem Click-Ereignis oder dem MouseClick-Ereignis verknüpfte Aktion vor der mit dem DoubleClick-Ereignis oder dem MouseDoubleClick-Ereignis verknüpften Aktion ausgeführt wird. Dieses Thema zeigt zwei Lösungen für dieses Problem auf. Eine Lösung besteht darin, das Doppelklickereignis zu behandeln und die Aktionen bei der Behandlung des Klickereignisses per Rollback zurückzusetzen. In wenigen Situationen müssen Sie möglicherweise das Klick- und Doppelklickverhalten simulieren, indem Sie das MouseDown-Ereignis behandeln und die DoubleClickTime-Eigenschaft und die DoubleClickSize-Eigenschaft der SystemInformation-Klasse verwenden. Sie messen die Zeit zwischen den Klicks, und wenn ein zweiter Klick erfolgt, bevor der DoubleClickTime-Wert erreicht wird und der Klick innerhalb eines durch DoubleClickSize definierten Rechtecks stattfindet, führen Sie die Doppelklickaktion aus; andernfalls führen Sie die Klickaktion aus. Gewusst wie: Unterscheiden zwischen Klicks und Doppelklicks ![]() |
AW: TImage Doppelklick bei gesetzten OnClick Event
Zitat:
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Eigentlich ich dieses Problem leicht zu lösen:
Bei einem Click gibt es folgende Messages: wm_LButtonDown wm_LButtonUp Bei einem DoppelClick gibt es folgende Messages: wm_LButtonDown wm_LButtonUp wm_LButtonUp Man setzt eine globale Variable BU auf 0 mit dem Auftreten von wm_LButtonDown. wm_LButtonUp erhöht sie um 1. Bei BU>1 wird die gewünschte DBLCLICK-Aktion ausgeführt.
Delphi-Quellcode:
private
procedure MyMouseEvent(var Msg: TMsg; var Handled: Boolean); .... var BU : Cardinal; ... procedure TForm2.MyMouseEvent(var Msg: TMsg; var Handled: Boolean); BEGIN case Msg.message of wm_LButtonDown:BEGIN BU:=0; END; wm_LButtonUp: BEGIN INC(BU); END; else begin end; end; if BU>1 then BEGIN WinApi.Windows.Beep(1500,50); BU:=0; END; END; |
AW: TImage Doppelklick bei gesetzten OnClick Event
Und wann wird das gewünschte 'OnClick' Ereignis ausgelöst? :gruebel: Ich find meine Lösung mit dem Timer echt einfach:
Delphi-Quellcode:
Ein Click startet einen Timer, der das Click-Ereignis -leider verzögert- auslöst.
Procedure TMyForm.FormCreate(Sender : TObject);
Begin DeferredClickTimer.Enabled := False; DeferredClickTimer.Interval := GetDoubleClickInterval()+50; // Ich glaub, die Methode heißt so. End; Procedure TMyForm.MyControlClick(Sender : TObject); Begin DeferredClickTimer.Enabled := False; DeferredClickTimer.Enabled := True; End; Procedure TMyForm.MyControlDoubleClick(Sender : TObject); Begin DeferredClickTimer.Enabled := False; ExecuteTheDoubleClickMethod(); End; Procedure TMyForm.DeferredClickTimerTimer(Sender : TObject); Begin DeferredClickTimer.Enabled := False; ExecuteTheClickMethod(); End; Der Doppelklick stoppt den Timer. Ich glaube, ohne Timer geht es nicht, denn ich muss ja wissen, ob nich doch das 2.Click vom Doubleclick kommt. |
AW: TImage Doppelklick bei gesetzten OnClick Event
Zitat:
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Zitat:
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Liste der Anhänge anzeigen (Anzahl: 3)
Ich habe hier was Schönes gefunden:
Es nennt sich TRIPLECLICK... ![]() EXE und SOURCE sind im Anhang.
Delphi-Quellcode:
unit Unit2;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls; type TForm2 = class(TForm) ListBox1: TListBox; TripleClickTimer: TTimer; Memo1: TMemo; procedure ListBox1DblClick(Sender: TObject); procedure ListBox1Click(Sender: TObject); procedure TripleClickTimerTimer(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } TripleClick : Boolean; public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} procedure MM(s:string); begin Form2.Memo1.Lines.Add(s); end; procedure TForm2.FormCreate(Sender: TObject); begin Memo1.Lines.Add(' ListBox1Click: startet einen Timer'); Memo1.Lines.Add(' ListBox1DblClick: Auswertung'); end; procedure TForm2.ListBox1Click(Sender: TObject); begin TripleClick := TripleClickTimer.Enabled; end; procedure TForm2.ListBox1DblClick(Sender: TObject); begin TripleClick := False; TripleClickTimer.Interval := GetDoubleClickTime(); TripleClickTimer.Enabled := True; while TripleClickTimer.Enabled do begin Application.ProcessMessages; end; if TripleClick then MM ('Triple click on item: ' + ListBox1.Items[ListBox1.ItemIndex]) Else MM ('Double click on item: ' + ListBox1.Items[ListBox1.ItemIndex]); end; procedure TForm2.TripleClickTimerTimer(Sender: TObject); begin TripleClickTimer.Enabled := False; end; end. |
AW: TImage Doppelklick bei gesetzten OnClick Event
Ok ich komm jetzt nicht mehr mit :shock:, brauche ich jetzt den Timer? Wenn ja ist das so wie Hathor es beschrieben hatte die Lösung?
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Versuchs auch mal mit meiner. Mit der bekommst Du einen Einfachklick-Ereignis, wenn nur 1x geklickt wurde (und nicht doppelt) oder ein Doppelklick-Ereignis (aber kein Einfachklick), wenn doppelt geklickt wurde. Ich habe dich so verstanden, das Du entweder ein Einfachklick (exklusiv) oder ein Doppelklick-Ereignis haben willst.
Das Tripleklick ist .. hüstel.. ähm... äh. für die Tonne. Wegen dem hier:
Delphi-Quellcode:
Da hat jemand eine Lösung auf deibelkommraus gesucht. Sowas geht gar nicht, finde ich. Triple- Quadrupel etc. Clicks kannst Du sehr schön mit hathor's Lösung bekommen, indem Du die 'BU'-IF-Schleife :mrgreen: Abfrage anpasst
while TripleClickTimer.Enabled do
begin Application.ProcessMessages; end; |
AW: TImage Doppelklick bei gesetzten OnClick Event
Ok Danke, nur ist das so das ich mit den Hints der Images arbeite und diese ja dann im Timer nicht verfügbar sind (bzw. nicht ohne variablen Gedöns). Gibt es eine Möglichkeit wie ich die Variable umgehen kann oder muss ich es so machen?
Danke Luki :spin: PS: Sorry das ich mich erst jetzt wieder melde aber mein Rechner ist kaputt gegangen und ich habe auf die Schnelle nichts neues Gefunden.. |
AW: TImage Doppelklick bei gesetzten OnClick Event
Was haben denn jetzt die Hints mit dem Klicken zu tun?
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Folgendes: Da es mehrere TImage's gibt, muss ich zum unterscheiden diese mit Hints versehen und Prüfe diese dann mit
Delphi-Quellcode:
und wenn ich mir das jetzt ansehe
TImage(Sender).Hint ...
Zitat:
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Warum du die Hint-Eigenschaft zum Unterscheiden missbrauchst ist mir zwar auch schleierhaft, aber geschenkt.
Natürlich musst du dir bei mehreren Controls, die dieses Doppel-Geklicke nutzen sollen auch noch das Control merken, welches jetzt diese Aktion ausgelöst hat. Also merke dir einfach den Sender und vergleich, ob bei einer weiteren Aktion es sich auch immer noch um den gleichen Sender handelt, sonst hast du ja keinen Doppelklick, sondern zwei normale Klicks auf 2 Controls. Und ja, das macht man mit einer Variablen, was auch nicht schlimm ist, denn Variablen sind nicht böse. |
AW: TImage Doppelklick bei gesetzten OnClick Event
Ok, danke. Ich dachte es ginge "schöner" als mit einer Variable aber es geht. Danke noch einmal :thumb:
Edit: ich habe jetzt die Software einmal getestet und mir ist aufgefallen das die Aktion für den SimpleClick sehr lange dauert, kann ich das irgendwie verkürzen? |
AW: TImage Doppelklick bei gesetzten OnClick Event
Zitat:
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Zitat:
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Beitrag #6 und #8
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Ach so. Aber viele Programme haben doch auch auf einem Objekt OnClick und OnDblClick d.h. es muss irgendwie gehen (ohne Timer)?
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Ja, Beitrag #8 :roll:
|
AW: TImage Doppelklick bei gesetzten OnClick Event
Ok ich habs hinbekommen, hab das mit den Ticks genommen und angeändert. Trotzdem Danke :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 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 by Thomas Breitkreuz