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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
titraxx
Messages : 10
Inscription : mar. 22/mars/2011 19:25

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

Message 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
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

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

Message 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
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
titraxx
Messages : 10
Inscription : mar. 22/mars/2011 19:25

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

Message 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:
Répondre