Page 1 sur 1

Un clique sur un bouton réalise plusieurs évènements

Publié : dim. 18/nov./2012 23:18
par titraxx
Bonsoir,

J'ai écrit un programme assez simple contenant quelques gadgets dont un bouton auquel est associé une fonction. Lorsque je clique UNE fois sur le bouton (ou même que je l'active avec la barre d'espace par exemple), j'ai l'impression que le programme détecte l'équivalent de 3 cliques (3 évènements).

Le problème que je rencontre peut être illustré avec ce petit morceau de code (c'est une partie de mon programme mais même en enlevant une grande partie le problème est toujours présent, c'est pour cette raison que je ne mets pas tout le code) :

Code : Tout sélectionner

;-constantes
Enumeration
    #main_window
    #frame
    #bouton_parcourir
    #string_path
    #text_path
    #editeur
    #bouton_hasher
    #bouton_copier
    #text_info
EndEnumeration
#HEIGHT = 350
#WIDTH = 415
#FLAGS = #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget



;-Main
If OpenWindow(#main_window, 0,0, #WIDTH, #HEIGHT, "", #FLAGS) 
    Frame3DGadget(#frame, 5, 5, #WIDTH-10, #HEIGHT-10, "")
    TextGadget(#text_path, 15, 30, #WIDTH*0.2, 20, "Fichier :")
    StringGadget(#string_path, 55, 30, #WIDTH*0.74, 20, "", #PB_String_ReadOnly)
    ButtonGadget(#bouton_parcourir, 370, 30, 30, 20, "...")
    ButtonGadget(#bouton_copier, 295, 60, 50, 20,"Copier")
    ButtonGadget(#bouton_hasher, 350, 60, 50,20, "Hasher")
    EditorGadget(#editeur, 15, 90, #WIDTH*0.93, #HEIGHT*0.65, #PB_Editor_ReadOnly)
    
    TextGadget(#text_info, 15, #HEIGHT-25, #WIDTH-20, 20, "")   
EndIf

Repeat ;début de la boucle principale du programme.
    Event   =   WaitWindowEvent()
    Select EventGadget()

        Case #bouton_hasher
            Debug "Dupe"

    EndSelect
Until Event = #PB_Event_CloseWindow ;fin de la boucle principale du programme.
Quand je clique sur le bouton Hasher, le debug me donne trois fois "Dupe". Dans mon programme complet, j'associe ce clique à une fonction qui contient différentes instruction dont la création d'un thread et cela créer des problèmes. Pour palier à ce comportement non voulu j'ai eu recours à DisableGadget() que l'on peut voir ici :

Code : Tout sélectionner

;-constantes
Enumeration
    #main_window
    #frame
    #bouton_parcourir
    #string_path
    #text_path
    #editeur
    #bouton_hasher
    #bouton_copier
    #text_info
EndEnumeration
#HEIGHT = 350
#WIDTH = 415
#FLAGS = #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget



;-Main
If OpenWindow(#main_window, 0,0, #WIDTH, #HEIGHT, "", #FLAGS) 
    Frame3DGadget(#frame, 5, 5, #WIDTH-10, #HEIGHT-10, "")
    TextGadget(#text_path, 15, 30, #WIDTH*0.2, 20, "Fichier :")
    StringGadget(#string_path, 55, 30, #WIDTH*0.74, 20, "", #PB_String_ReadOnly)
    ButtonGadget(#bouton_parcourir, 370, 30, 30, 20, "...")
    ButtonGadget(#bouton_copier, 295, 60, 50, 20,"Copier")
    ButtonGadget(#bouton_hasher, 350, 60, 50,20, "Hasher")
    EditorGadget(#editeur, 15, 90, #WIDTH*0.93, #HEIGHT*0.65, #PB_Editor_ReadOnly)
    
    TextGadget(#text_info, 15, #HEIGHT-25, #WIDTH-20, 20, "")   
EndIf

Repeat ;début de la boucle principale du programme.
    Event   =   WaitWindowEvent()
    Select EventGadget()

        Case #bouton_hasher
            DisableGadget(#bouton_hasher, 1)
            Debug "Dupe"            
            DisableGadget(#bouton_hasher, 0)

    EndSelect
Until Event = #PB_Event_CloseWindow ;fin de la boucle principale du programme.
Cette bidouille me donne une seule fois "Dupe" avec le debug ce qui est ce que j'attends.

Sauriez-vous me dire d'où vient ce comportement, s'il est normal et comment le gérer ?

Je vous remercie d'avance,

TitraxX

Re: Un clique sur un bouton réalise plusieurs évènements

Publié : dim. 18/nov./2012 23:32
par graph100
C'est normal, tu as oublié de filtrer les events par origine : gadget, menu, etc...

correction:

Code : Tout sélectionner

;-constantes
Enumeration
	#main_window
	#frame
	#bouton_parcourir
	#string_path
	#text_path
	#editeur
	#bouton_hasher
	#bouton_copier
	#text_info
EndEnumeration
#HEIGHT = 350
#WIDTH = 415
#FLAGS = #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget



;-Main
If OpenWindow(#main_window, 0,0, #WIDTH, #HEIGHT, "", #FLAGS)
	Frame3DGadget(#frame, 5, 5, #WIDTH-10, #HEIGHT-10, "")
	TextGadget(#text_path, 15, 30, #WIDTH*0.2, 20, "Fichier :")
	StringGadget(#string_path, 55, 30, #WIDTH*0.74, 20, "", #PB_String_ReadOnly)
	ButtonGadget(#bouton_parcourir, 370, 30, 30, 20, "...")
	ButtonGadget(#bouton_copier, 295, 60, 50, 20,"Copier")
	ButtonGadget(#bouton_hasher, 350, 60, 50,20, "Hasher")
	EditorGadget(#editeur, 15, 90, #WIDTH*0.93, #HEIGHT*0.65, #PB_Editor_ReadOnly)
	
	TextGadget(#text_info, 15, #HEIGHT-25, #WIDTH-20, 20, "")   
EndIf

Repeat ;début de la boucle principale du programme.
	Event   =   WaitWindowEvent()
	
	If event = #PB_Event_Gadget
		Select EventGadget()
				
			Case #bouton_hasher
				Debug "Dupe"
				
		EndSelect
	EndIf
	
Until Event = #PB_Event_CloseWindow ;fin de la boucle principale du programme.
Il ne faut se servir d'un EventGadget() que derrière un test pour déterminer si l'event généré par windows viens bien d'un gadget.

Ps : c'est nickel d'avoir mis que le code qui pose problème, c'est bien plus facile à résoudre :D

Re: Un clique sur un bouton réalise plusieurs évènements

Publié : dim. 18/nov./2012 23:41
par titraxx
Ha merci, c'est parfait, je vais pouvoir virer mes DisableGadget() :D
graph100 a écrit :Ps : c'est nickel d'avoir mis que le code qui pose problème, c'est bien plus facile à résoudre
Oui et du coup j'ai une réponse rapide :wink: