Seite 1 von 2

LeftDoubleClick bei TextGadget

Verfasst: 22.08.2010 16:28
von Lord
Wenn ich es richtig gelesen habe, erhalte ich bei einem
Textgadget überhaupt keinen Event, da das Gadget nur
der Textanzeige dient. Fügt man das Flag #SS_NOTIFY
hinzu, werden auch für das Textgadget Events erzeugt.

Jedoch erhalte ich bei einem Doppelklick kein eindeutiges
Event. Es wird eine '0' für ein LeftDoubleClick und noch eine
'1' zurückgegeben, so daß es auch ein einfacher Links-
klick sein könnte.

Code: Alles auswählen

OpenWindow(1,0,0,200,400,"Test")


TextGadget(1, 10, 10, 180, 180,"TextGadget 1 - ohne #SS_NOTIFY",#PB_Text_Center|#PB_Text_Border)
TextGadget(2, 10,210, 180, 180,"TextGadget 2 - mit #SS_NOTIFY",#PB_Text_Center|#PB_Text_Border|#SS_NOTIFY)

Quit=#False

Repeat
  Event=WaitWindowEvent()
  EventGadget=EventGadget()
  EventType=EventType()

  Select Event
    Case #PB_Event_Gadget
      Select EventGadget
        Case 1
          Debug EventType
          ; kein Event
        Case 2
          Debug EventType
          ;0 bei LeftClick
          ;0 + 1 bei LeftDoubleClick
      EndSelect
    Case #PB_Event_CloseWindow
      Quit=#True
  EndSelect
  
Until Quit
Wie erhalte ich bei einem Textgadget eine eindeutige
Nachricht bei einem LeftDoubleClick?

Re: LeftDoubleClick bei TextGadget

Verfasst: 22.08.2010 16:47
von TomS
Gar nicht.
Zumindest nicht ohne Zeitverzögerung beim einzelnen Klick.
Ein Doppelklick besteht nunmal aus zwei Klicks. Und Windows hat keine Möglichkeit zu ermitteln, ob auf den ersten Klick noch einmal ein zweiter folgt, und zwar innerhalb der in der Systemsteuerung angegeben Zeit.
Also werden einfach beide Events gesendet.
Du musst also selber diesen Wert auslesen ( GetDoubleClickTime_() ) und erst nach Ablauf dieser Zeit auf die Klick-Events reagieren.

Re: LeftDoubleClick bei TextGadget

Verfasst: 22.08.2010 16:56
von Kevin
wo ist das problem

Code: Alles auswählen

OpenWindow(1,0,0,200,400,"Test")


TextGadget(1, 10, 10, 180, 180,"TextGadget 1 - ohne #SS_NOTIFY",#PB_Text_Center|#PB_Text_Border)
TextGadget(2, 10,210, 180, 180,"TextGadget 2 - mit #SS_NOTIFY",#PB_Text_Center|#PB_Text_Border|#SS_NOTIFY)

Quit=#False

Repeat
  Event=WaitWindowEvent()
  EventGadget=EventGadget()
  EventType=EventType()

  Select Event
    Case #PB_Event_Gadget
      Select EventGadget
        Case 1
          Debug EventType
          ; kein Event
        Case 2
          Debug EventType
          ;0 bei LeftClick
          ;0 + 1 bei LeftDoubleClick
          If EventType=1
            Debug "LeftDoubleClick"
          EndIf
      EndSelect
    Case #PB_Event_CloseWindow
      Quit=#True
  EndSelect
  
Until Quit

edit:
Wie erhalte ich bei einem Textgadget eine eindeutige
Nachricht bei einem LeftDoubleClick?
du erhältst doch ein eindeutiges ergebnis
bei einem LeftDoubleClick bekommst du 1 zurück und 0 da es auch ein LeftClick ist

Re: LeftDoubleClick bei TextGadget

Verfasst: 22.08.2010 17:38
von Lord
Das Ergebnis ist nach meiner Ansicht eben nicht
eindeutig:

Code: Alles auswählen

OpenWindow(1,0,0,200,400,"Test")


TextGadget(1, 10, 10, 180, 180,"TextGadget 1 - ohne #SS_NOTIFY", #PB_Text_Center | #PB_Text_Border)
TextGadget(2, 10,210, 180, 180,"TextGadget 2 - mit #SS_NOTIFY", #PB_Text_Center | #PB_Text_Border | #SS_NOTIFY)

Quit=#False

Repeat
  Event=WaitWindowEvent()
  EventGadget=EventGadget()
  EventType=EventType()

  Select Event
    Case #PB_Event_Gadget
      Select EventGadget
        Case 1
          Debug EventType
          ; kein Event
        Case 2
        Select EventType
          Case 0
            Debug "LeftClick"
          Case 1
            Debug "LeftDoubleClick"
        EndSelect
        
      EndSelect
    Case #PB_Event_CloseWindow
      Quit=#True
  EndSelect
  
Until Quit
Es wird in einer normalen Eventverarbeitung sowohl
"LeftClick" als auch "LeftDoubleClick" ausgeführt.

Re: LeftDoubleClick bei TextGadget

Verfasst: 22.08.2010 18:41
von Lord
TomS hat geschrieben:Gar nicht.
Zumindest nicht ohne Zeitverzögerung beim einzelnen Klick.
Ein Doppelklick besteht nunmal aus zwei Klicks. Und Windows hat keine Möglichkeit zu ermitteln, ob auf den ersten Klick noch einmal ein zweiter folgt, und zwar innerhalb der in der Systemsteuerung angegeben Zeit.
Also werden einfach beide Events gesendet.
Du musst also selber diesen Wert auslesen ( GetDoubleClickTime_() ) und erst nach Ablauf dieser Zeit auf die Klick-Events reagieren.
Das verstehe ich nicht so ganz. Das BS kann doch
sehrwohl bei anderen Gadgets einen Doppelklick
feststellen und die entsprechende Nachricht generieren.

Wo müßte ich denn eine Verzögerung in meine Event-
schleife einbauen, damit ich diesen speziellen Fall ab-
fange? Es ist ja nicht so, daß es nur ein Gadget zu
verwalten gilt. Das Beispiel oben sollte nur den Fall
darstellen.

Re: LeftDoubleClick bei TextGadget

Verfasst: 22.08.2010 19:02
von TomS
Das BS kann doch
sehrwohl bei anderen Gadgets einen Doppelklick
feststellen und die entsprechende Nachricht generieren
Beispiel?
Die Verzögerung ist ja nicht viel. Bei mir sind das 500ms.
Aber diese Verzögerung braucht's ja nur, wenn man explizitzwei unterschiedliche Aktionen haben will, die sich gegenseitig beeinflussen oder ausschließen.
Z.B. Fenster1 und Fenster2 öffnen.
Der Normalfall ist aber dieser: Beispiel Desktop-Icon:
Einfachklick markiert das Icon, Doppelklick öffnet die Datei.
Beim Doppelklick zum öffnen ist es dir aber egal, ob das Icon blau hinterlegt wird.

Anderes Beispiel für offensichtlich unterschiedliche Aktionen:
Ein einfacher Klick auf einen Button setzt den Zähler um 1 höher. Ein Doppelklick soll 10 addieren.
Das ganze sieht dann so aus:

Code: Alles auswählen

Case #LeftClick : var+1
Case #LeftDoubleClick : var + 9
Oder: Beim einfachen Klick +5, beim Doppelklick -5:

Code: Alles auswählen

Case #LeftClick : var+5
Case #LeftDoubleClick : var-10

Re: LeftDoubleClick bei TextGadget

Verfasst: 22.08.2010 19:16
von edel
Wenn du #SS_NOTIFY setzt werden bestimmte Events an das Fenster darueber geschickt.

Kann man dann so auslesen :

Code: Alles auswählen

Macro _LOWORD(a) 		: (a & $FFFF)       : EndMacro
Macro _HIWORD(a) 		: (a >> 16 & $FFFF) : EndMacro 

Procedure CB(h,m,w,l)
  
  If m = #WM_COMMAND
    
    If l ;message kommt von einem "Fenster"
      
      If _HIWORD(w) = #STN_DBLCLK
        
        Debug _LOWORD(w)
        
      EndIf      
      
    EndIf
    
    
  EndIf
  
  
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


OpenWindow(1,0,0,200,400,"Test")

SetWindowCallback(@cb(),1)

TextGadget(555, 10, 10, 180, 180,"TextGadget 1 - ohne #SS_NOTIFY",#PB_Text_Center|#PB_Text_Border|#SS_NOTIFY)


Repeat
  Event=WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Setzt du kein SS_NOTIFY wird normal ein #WM_LBUTTONDBLCLK an das (Text)Fenster geschickt.
Allerdings ist das in der PB Eventschleife nicht wirklich brauchbar.

Code: Alles auswählen

OpenWindow(1,0,0,200,400,"Test")


TextGadget(555, 10, 10, 180, 180,"TextGadget 1 - ohne #SS_NOTIFY",#PB_Text_Center|#PB_Text_Border)


Repeat
  Event=WaitWindowEvent()
  EventGadget=EventGadget()

  If event = #WM_LBUTTONDBLCLK
    Debug "doppel klick"
  EndIf    
  
Until Event = #PB_Event_CloseWindow

Re: LeftDoubleClick bei TextGadget

Verfasst: 23.08.2010 13:22
von Lord
@TomS
Bei Deinem Icon-Beispiel magst du Recht haben, dort ist die
Wirkung eventuell sogar gewünscht, daß bei einem Doppel-
klick die Einzelklickaktion (= markieren des Icons) ebenfalls
(vorher) ausgeführt wird.
Sollen allerdings zwei sehr unterschiedliche Aktionen durch
die Klicks ausgelöst werden, stört eine durch den Einzel-
klick ausgelöste Aktion die Doppelklickaktion.

In Deinem zweiten Beispiel werden bei einem Doppelklick auch
immer beide Events verarbeitet. Führe ich einen Doppelklick
aus, wird var sowohl um 1 als auch um 9 erhöht (bzw +5-10).


@edel
Wenn ich das richtig sehe, verlagere ich bei Deiner Callback-
Variante das Problem von der Eventschleife in den Callback.
Auch dort kann ich das vor dem Doppelklick-Event erzeugte
und verschickte Singleklick-Event nicht verhindern, weil es
ja vor dem Doppelklick-Event den Callback bereits passiert
hat.

Re: LeftDoubleClick bei TextGadget

Verfasst: 23.08.2010 13:38
von NicknameFJ
Lord hat geschrieben: Sollen allerdings zwei sehr unterschiedliche Aktionen durch
die Klicks ausgelöst werden, stört eine durch den Einzel-
klick ausgelöste Aktion die Doppelklickaktion.
Entgegengesetzte Aktionen sollten allerdings auch vermieden werden.

Auf diese Problematik ist auch schon im Petzold (5. Auflage Seite 273) eingegangen.

Zitat hieraus:
Petzold hat geschrieben: Doppelklicks solltengrundsätzlich die Erweiterung einer Operation darstellen, die mit dem entsprechenden Objekt auf einen Klick hin ausgeführt wird. Auf diese Weise tut sich nicht nur das Programm leichter, sondern auch sein Benutzer. Der Explorer ist ein gutes Beispiel für einen solchen Mechanismus: Dort entspricht ein erster Klick auf dem Symbol einer Datei einer Auswahl; bei einem Doppelklick führt der erste Klick dieselbe Operation durch, der zweite startet das soeben ausgewählte Program bzw. öffnet das ausgewählte Dokument. Diese Logik ist nicht nur für den Benutzer einsichtig, sonder wie gesagt auch für das Programm, das auf die NAchricht WM_BUTTONDOWN grundsätzlich mit einer Auswahl, auf die Nachricht WM_LBUTTONDBLCLK grundsätzlich mit dem Start des zuvor ausgewählten Objekts reagieren kann. (Stellen Sie sich dagegen einmal die Verwicklungen in einem Programm vor, das über Einfach- und Doppelklicks zwischen entgegengesetzen Aktionen unterscheidet - wie beispielsweise dem Öffnen und Löschen einer Datei!)
Grüße

NicknameFJ

Re: LeftDoubleClick bei TextGadget

Verfasst: 23.08.2010 14:45
von TomS
So. Jetzt habe ich die dir die Problematik mit entgegengesetzten Aktionen erklärt und NicknameFJ hat auch noch mal was dazu gepostet.
Es gibt nur 2 Möglichkeiten: Entweder du stellst dein UI-Konzept um, oder liest das maximale Doppelklick-Interval aus und führst die EinzelKlick-Aktion erst aus, wenn diese Zeit vorbei ist.
Anders geht's nicht.