Seite 1 von 1

ExplorerListGadget

Verfasst: 19.07.2009 17:38
von galileo
Also ich bin gerade am verzweifeln, weil das ExplorerListGadget den EventType() #PB_EventType_LeftDoubleClick nicht erkennt. Oder was mache ich falsch.

Code: Alles auswählen

OpenWindow(0,0,0,800,600,"Test",#PB_Window_SystemMenu)
ExplorerListGadget(1,0,0,800,600,"*.*")

Repeat
  event.l = WaitWindowEvent()
  If event = #PB_Event_Gadget
    If EventGadget() = 1
      Select EventType()
        Case #PB_EventType_LeftDoubleClick  : Debug "Doppelklick mit der linken Maustaste"
        Case #PB_EventType_RightDoubleClick : Debug "Doppelklick mit der rechten Maustaste"
        Case #PB_EventType_LeftClick        : Debug "Klick mit der linken Maustaste"
        Case #PB_EventType_RightClick       : Debug "Klick mit der rechten Maustaste"
      EndSelect
    EndIf
  EndIf      
Until event = #PB_Event_CloseWindow
End
Ist das ein Bug ?

Verfasst: 19.07.2009 17:39
von cxAlex
Bei Doppelklicks auf Dateien kommt bei mir das Event. Allerdings zuerst auch ein normales Klick-Event.

Gruß, Alex

Verfasst: 20.07.2009 13:56
von Shardik
Die Auswertung von Einzel- und Doppelklicks ist etwas kompliziert, weil (wie von cxAlex richtig beschrieben) erst ein Einzel- und dann ein Doppelklick-Event erfolgt. Im englischen Forum hat srod bereits in einem Beispiel gezeigt, wie man mittels einer Timer-Routine erst abwartet, ob nicht innerhalb eines bestimmten Zeitraums noch ein zweiter (Doppel-)Klick erfolgt (http://www.purebasic.fr/english/viewtop ... 41&start=7).
Außerdem gibt es beim ExplorerListGadget noch das Problem der Unterscheidung zwischen Einzel- und Doppelklick auf ein Verzeichnis oder eine Datei. Zu diesem Problem hatte ich bereits auch schon einmal ein Beispiel gezeigt (http://www.purebasic.fr/german/viewtopi ... 6&start=15)

Aus diesen beiden Ansätzen habe ich ein neues Beispiel zusammengestellt, das allerdings zunächst einmal nur Linksklicks auswertet und auf Grund der Verwendung der Windows API-Funktion timeSetEvent() nur unter Windows funktioniert:

Code: Alles auswählen

EnableExplicit

Define DoubleClickReported
Define SuppressSingleClickMsg
Define WindowEvent

Procedure TimerProc(ID, Msg, User, DW1, DW2)
  Shared DoubleClickReported
  Shared SuppressSingleClickMsg

  If SuppressSingleClickMsg = #False And DoubleClickReported = #False
    If GetGadgetItemState(0, GetGadgetState(0)) & #PB_Explorer_Directory
      Debug "Klick mit der linken Maustaste auf Verzeichnis " + GetGadgetItemText(0, GetGadgetState(0))
    Else
      Debug "Klick mit der linken Maustaste auf Datei " +  GetGadgetItemText(0, GetGadgetState(0))
    EndIf
  EndIf

  DoubleClickReported = #False
  SuppressSingleClickMsg = #False
EndProcedure 

OpenWindow(0,0,0,800,600,"Test",#PB_Window_SystemMenu)
ExplorerListGadget(0,0,0,800,600,"*.*")

Repeat
  WindowEvent = WaitWindowEvent()

  If WindowEvent = #PB_Event_Gadget
    If EventGadget() = 0
      If GetGadgetState(0) = -1
        If DoubleClickReported = #False
          Debug "Doppelklick mit der linken Maustaste auf Verzeichnis " + GetGadgetText(0)
          DoubleClickReported = #True
        EndIf
      Else
        Select EventType()
          Case #PB_EventType_LeftDoubleClick
            SuppressSingleClickMsg = #True

            If GetGadgetItemState(0, GetGadgetState(0)) & #PB_Explorer_File
              Debug "Doppelklick mit der linken Maustaste auf Datei " + GetGadgetItemText(0, GetGadgetState(0))
            EndIf
          Case #PB_EventType_LeftClick
            timeSetEvent_(200, 10, @TimerProc(), 0, #TIME_ONESHOT) 
        EndSelect
      EndIf
    EndIf
  EndIf     
Until WindowEvent = #PB_Event_CloseWindow

End