Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TImage Doppelklick bei gesetzten OnClick Event (https://www.delphipraxis.net/181641-timage-doppelklick-bei-gesetzten-onclick-event.html)

nuclearping 1. Sep 2014 09:46

AW: TImage Doppelklick bei gesetzten OnClick Event
 
Zitat:

Zitat von Dejan Vu (Beitrag 1270466)
Hmm. Das zweite OnClick wird doch gar nicht ausgeführt. OnClick wird nur beim 1.Click aufgerufen. Beim 2.Click wird OnDblClick aufgerufen (oder gar nichts, wenn kein entsprechendes Event zugewiesen wurde). Ergo *kann* man im OnClick keine Zeitmessung durchführen, anhand derer ein Doppelklick erkannt wird.

Natürlich. Wenn du explizit dieses Verhalten willst, darfst du keinen
Delphi-Quellcode:
OnDblClick
zuweisen, sondern eine Verzweigung, ob entweder ein
Delphi-Quellcode:
DoClick
oder
Delphi-Quellcode:
DoDblClick
ausgeführt werden soll, im
Delphi-Quellcode:
OnClick
implementieren.

baumina 1. Sep 2014 09:59

AW: TImage Doppelklick bei gesetzten OnClick Event
 
Zitat:

Zitat von nuclearping (Beitrag 1270480)
Zitat:

Zitat von Dejan Vu (Beitrag 1270466)
Hmm. Das zweite OnClick wird doch gar nicht ausgeführt. OnClick wird nur beim 1.Click aufgerufen. Beim 2.Click wird OnDblClick aufgerufen (oder gar nichts, wenn kein entsprechendes Event zugewiesen wurde). Ergo *kann* man im OnClick keine Zeitmessung durchführen, anhand derer ein Doppelklick erkannt wird.

Natürlich. Wenn du explizit dieses Verhalten willst, darfst du keinen
Delphi-Quellcode:
OnDblClick
zuweisen, sondern eine Verzweigung, ob entweder ein
Delphi-Quellcode:
DoClick
oder
Delphi-Quellcode:
DoDblClick
ausgeführt werden soll, im
Delphi-Quellcode:
OnClick
implementieren.

Und woran machst du im OnClick fest, dass ein DoDblClick ausgeführt werden soll? OnClick bekommt nur "Sender" sonst gar nix. Über OnMouseDown könnts evtl eher klappen, aber auch da kommt man bei Doppelklick zweimal rein, einmal ohne ssDouble und einmal mit ssDouble, also wieder nix gewonnen.

hathor 1. Sep 2014 10:57

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.

http://msdn.microsoft.com/de-de/libr...vs.110%29.aspx
http://msdn.microsoft.com/de-de/libr...vs.110%29.aspx

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
http://msdn.microsoft.com/de-de/libr...vs.110%29.aspx

Dejan Vu 1. Sep 2014 12:32

AW: TImage Doppelklick bei gesetzten OnClick Event
 
Zitat:

Zitat von nuclearping (Beitrag 1270480)
Natürlich. Wenn du explizit dieses Verhalten willst, darfst du keinen
Delphi-Quellcode:
OnDblClick
zuweisen, sondern eine Verzweigung, ob entweder ein
Delphi-Quellcode:
DoClick
oder
Delphi-Quellcode:
DoDblClick
ausgeführt werden soll, im
Delphi-Quellcode:
OnClick
implementieren.

Das zweite 'OnClick'-Event (also beim zeiten Click des Doppelklicks) wird *nicht* ausgelöst. Da kann man keine Verzweigung einbauen.

hathor 1. Sep 2014 14:31

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;

Dejan Vu 1. Sep 2014 14:50

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:
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;
Ein Click startet einen Timer, der das Click-Ereignis -leider verzögert- auslöst.
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.

Sir Rufo 1. Sep 2014 15:58

AW: TImage Doppelklick bei gesetzten OnClick Event
 
Zitat:

Zitat von Dejan Vu (Beitrag 1270531)
Ich glaube, ohne Timer geht es nicht, denn ich muss ja wissen, ob nich doch das 2.Click vom Doubleclick kommt.

Ja, ohne (diese Timer-Friemelei) geht es einfach nicht. Also entweder ein anderes Konzept des Klick-Handlings oder eben die Timer-Variante.

nuclearping 1. Sep 2014 19:40

AW: TImage Doppelklick bei gesetzten OnClick Event
 
Zitat:

Zitat von Dejan Vu (Beitrag 1270509)
Das zweite 'OnClick'-Event (also beim zeiten Click des Doppelklicks) wird *nicht* ausgelöst. Da kann man keine Verzweigung einbauen.

Ah ja klar, logisch. Stimmt, da stand ich auf dem Schlauch. :mrgreen: In dem Fall braucht man wirklich einen "Timer".

hathor 1. Sep 2014 23:23

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...
http://blog.unicornsoft.tk/2011/10/t...in-delphi.html

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.

Luki206 2. Sep 2014 10:09

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr.
Seite 2 von 4     12 34      

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