Clic & Double clic

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

@Droopy : t'a quand meme essayé mon dernier code ? 8O :)
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

J'ai regardé ton code Dobro mais il buggue. :?
Le premier double clic génère un clic / puis un double clic.
Ensuite on détecte bien les double clic, mais un simple clic sur deux est détecté.
Merci quand même Dobro pour ton aide. :D

J'ai implémenté l'idée du Timer et ça fonctionne nickel :

Code : Tout sélectionner

#Delay=150 ; Delay max for double clic
#Bouton=0
#Edit=1
OpenWindow(0,0,0,200,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Clic & Double-Clic") 
CreateGadgetList(WindowID())
AdvancedGadgetEvents(1)
ButtonGadget(#Bouton,10,10,180,80,"Clic ou double clic")
EditorGadget(#Edit,10,100,180,290)
ActivateGadget(#Bouton)

Procedure Monostable(AdresseSimpleClic)
  Delay(#Delay)
  ;/ Lancement de la procédure par Simple Clic
  CallFunctionFast(AdresseSimpleClic)
EndProcedure

Procedure A() ; Procédure lancée sur Simple Clic
  AddGadgetItem(#Edit,-1,"Clic")
EndProcedure

Procedure B() ; Procédure lancée sur Double Clic
  AddGadgetItem(#Edit,-1,"Double Clic")
EndProcedure

Procedure IsThreadRunning2(ThreadId) ; Author : Freak
  GetExitCodeThread_(ThreadId, @ExitCode.l) 
  
  If ExitCode = #STATUS_PENDING 
    retour=1 ; Le thread tourne encore 
  EndIf
  
  ProcedureReturn retour
EndProcedure

Repeat 
  EventID = WaitWindowEvent() 
  If EventID=#PB_Event_Gadget And EventGadgetID()=#Bouton
     
    Select EventType() 
      
      Case #PB_EventType_LeftClick 
        If IsThreadRunning2(ThreadId)=0 Or ThreadId=0
          ThreadId=CreateThread(@Monostable(),@A())
        EndIf
          
      Case #PB_EventType_LeftDoubleClick 
        If IsThreadRunning2(ThreadId)
          KillThread(ThreadId)
          B() ;/ Lancement de la procédure par Double Clic
        EndIf
        
    EndSelect 
    
  EndIf 
Until EventID = #PB_Event_CloseWindow 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Droopy a écrit :Merci quand même Dobro pour ton aide. :D
bah ! meme la plus jolie fille ne peut offrir que ce qu'elle a :lol:
J'ai implémenté l'idée du Timer et ça fonctionne nickel :
c'est vrais que ça marche , mais cela reste bien compliqué quand meme :?
en esperant que la version 4 nous apportera un plus grand control des Events
.... :D
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Une mini recherche sur le musée et j'ai trouvé ça de Régis : http://cederavic.serveurperso.com/forum ... c.php?t=36
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Merci cederavic son code fonctionne et est beaucoup plus simple que le mien :D
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Après un test plus approfondi, le code de régis déconne quand on ajoute la modification d'un gadget lors de la détection d'évènements de type clic / double clic.

Cela doit ajouter des évènements ( interceptés par windowevent ) et poser problème avec la gestion des clic :(
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Et comme ça ?

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
;
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

AdvancedGadgetEvents(1) 
ButtonGadget(0,10,10,180,80,"Clic ou double clic")

Temps_DoubleClic = GetDoubleClickTime_()

Repeat
  Event = WaitWindowEvent()
  
  Select Event
      
    Case#PB_EventGadget
      Select EventGadgetID() ; Gadgets
          
        Case 0
          If EventType() = #PB_EventType_LeftClick
            ; On attends un double clic
            Temps = GetTickCount_()
            Repeat
              Delay(1)
            Until GetTickCount_() - Temps >= Temps_DoubleClic
            ; on regarde si double clic
            Repeat
              Event = WindowEvent()
              If EventType() = #PB_EventType_LeftDoubleClick
                DoubleClic = 1
              EndIf
            Until Event = 0
            ; On agit
            If DoubleClic
              Debug "Double clic"
            Else
              Debug "Clic simple"
            EndIf
            ; Remise à 0 du double clic
            DoubleClic = 0
          EndIf
          
      EndSelect
  EndSelect
  
Until Event = #PB_EventCloseWindow

End
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Solution du soldat améliorée je pense avec un retour sur double clic plus rapide et une remise à 0 que si nécessaire et journal des evènements integré dans la fenêtre:

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
; Création de la fenêtre et de la GadgetList
Temps_DoubleClic = GetDoubleClickTime_()
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Double de clic de moins de :"+Str(Temps_DoubleClic)) = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf
AdvancedGadgetEvents(1)
ButtonGadget(0,10,10,100,30,"Clic ou double clic")
ListViewGadget(1,60,70,180,180)

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case#PB_EventGadget
      Select EventGadgetID() ; Gadgets
        Case 0
          If EventType() = #PB_EventType_LeftClick
            ; On attends un double clic et on regarde si double clic
            Temps = GetTickCount_()
            Repeat
              Event = WindowEvent()
              If EventType() = #PB_EventType_LeftDoubleClick
                DoubleClic = 1
              EndIf
            Until GetTickCount_() - Temps >= Temps_DoubleClic Or DoubleClic = 1
            ; On agit
            If DoubleClic
              AddGadgetItem(1,-1,"Double clic")
              ; Remise à 0 du double clic
              DoubleClic = 0
            Else
              AddGadgetItem(1,-1,"Clic simple")
            EndIf
          EndIf
      EndSelect
  EndSelect
Until Event = #PB_EventCloseWindow 
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Nickel. Merci les Gars :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Super le code a BROSSDEN. 8)

Par contre j'ai essayé de le convertir en 4.0 et apparement FRED a supprimé la fonction AdvancedGadgetEvents().

Evidement le code ne marche plus sans elle. :(

Que faudrait il mettre à la place ??

Merci
Bonne journée
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tiens comme ça ça a l'air de marcher :D


; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
; Création de la fenêtre et de la GadgetList
; Variante Purebasic 4.00 par Dobro

Temps_DoubleClic = GetDoubleClickTime_ ()
If OpenWindow (0, 0, 0, 300, 300, "Double de clic de moins de :" + Str (Temps_DoubleClic), #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget ) = 0 Or CreateGadgetList ( WindowID (0)) = 0
     End
EndIf
ButtonGadget (0,10,10,100,30, "Clic ou double clic" )
ListViewGadget (1,60,70,180,180)

Repeat
    double=-1
    Event = WaitWindowEvent ()
     Select Event
         Case #WM_LBUTTONDOWN
            double = 0
            Temps = GetTickCount_ ()
             Repeat
                Event = WindowEvent ()
                 If Event = #WM_LBUTTONDBLCLK
                    double = 1
                 EndIf
             Until GetTickCount_ () - Temps >= Temps_DoubleClic Or DoubleClic = 1
     EndSelect
     If double=1
         AddGadgetItem (1,-1, "Double clic" )
     ElseIf double=0
         AddGadgetItem (1,-1, "Clic simple" )
     EndIf
Until Event = #PB_Event_CloseWindow
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Merci DOBRO

Comme dab tu es génial. :wink:

Que serais ce monde sans toi ...... :(

Je te remercie beaucoup, ainsi évidement que le soldat inconnu pour ce génial code.

A bientot (Malheureusement pour toi :lol: :lol: )
Excelente soirée

Petit scarabé
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Mais y a pas comme un problème, on récupère plus les évènements sur le deuxième bouton.

Code : Tout sélectionner

Temps_DoubleClic = GetDoubleClickTime_ () 
If OpenWindow (0, 0, 0, 300, 300, "Double de clic de moins de :" + Str (Temps_DoubleClic), #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget ) = 0 Or CreateGadgetList ( WindowID (0)) = 0 
     End 
EndIf 
ButtonGadget (0,10,10,100,30, "Clic ou double clic" ) 
ButtonGadget (2,120,10,100,30, "test" ) 

ListViewGadget (1,60,70,180,180) 

Repeat 
   double=-1 
   Event = WaitWindowEvent () 
   Select Event 

        Case #PB_Event_Gadget
            Select EventGadget()
                  Case 2
                      Select EventType()
                          Case #PB_EventType_LeftClick
                              Debug "Click2"
                      EndSelect 
            EndSelect 
            
       Case #WM_LBUTTONDOWN 
          double = 0 
          Temps = GetTickCount_ () 
           Repeat 
              Event = WindowEvent () 
               If Event = #WM_LBUTTONDBLCLK 
                  double = 1 
               EndIf 
           Until GetTickCount_ () - Temps >= Temps_DoubleClic Or DoubleClic = 1 
           If double=1 
               AddGadgetItem (1,-1, "Double clic" ) 
           ElseIf double=0 
               AddGadgetItem (1,-1, "Clic simple" ) 
           EndIf           
  EndSelect        

Until Event = #PB_Event_CloseWindow 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

nico a écrit :Mais y a pas comme un problème, on récupère plus les évènements sur le deuxième bouton.
ça n'etais pas la question :D
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

:lol:
Répondre