ButtonGadget qui ne repond plus [ RESOLU ]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
cirederff
Messages : 54
Inscription : ven. 15/mai/2009 19:57

ButtonGadget qui ne repond plus [ RESOLU ]

Message par cirederff »

Bonjour

J'ai découvert pure il y a un an environ et je me décide à poser ma première question aujourd'hui.
Je débute dans le domaine mis à part un petit programme simple sur microcontroleur en basic avec un compilateur Mikroelektronika.



Dans le code suivant après avoir quitté la deuxième fenêtre mon bouton REGLAGE ne répond plus et la croix non plus, d'où cela peut il venir.

Code : Tout sélectionner

;********PURE 4.20**********
;******************************


#fenetre = 1 
#fenetre_largeur = 1024 
#fenetre_hauteur = 600 


OpenWindow(#fenetre ,0,0,#fenetre_largeur ,#fenetre_hauteur ,"GUIDAGE",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget)
Fenetre_une = WindowID(#fenetre )
CreateGadgetList(Fenetre_une)
couleur = RGB(0,150,0) ;on met la fenetre en bleu foncé
SetWindowColor(1,couleur)
ButtonGadget(1, 900, 10, 100, 30, "REGLAGE" )



Procedure fenetre_reglage()

	
	OpenWindow(2 ,0,0,#fenetre_largeur ,#fenetre_hauteur ,"fenetre2" ,#PB_Window_ScreenCentered)
	CreateGadgetList(WindowID(2))   
	ButtonGadget(2, 10,  500, 200, 20, "quiter")
	ButtonGadget(3, 10,  400, 200, 20, "quiter")
	
	Repeat
	event = WaitWindowEvent() ;on met à jour les évenements

	If event = #PB_Event_Gadget ;un gadget est il utilisé ?
	clicgadget = EventGadget() ;OUI, on identifie le gadget
	Else
	clicgadget = 0 ;NON, on renvoie 0
	EndIf
	
	If clicgadget = 2	 
	CloseWindow(2)
	EndIf
	
	If clicgadget = 3	 
	 TextGadget(0, 10, 10,250,20,"BLA BLA BLA")
	EndIf
	
	Until event=#PB_Event_CloseWindow ;si on appuie sur la croix on quitte le programme.
EndProcedure



Repeat
event = WaitWindowEvent() ;on met à jour les évenements

If event = #PB_Event_Gadget ;un gadget est il utilisé ?
clicgadget = EventGadget() ;OUI, on identifie le gadget
Else
clicgadget = 0 ;NON, on renvoie 0
EndIf

If clicgadget = 1 ;appui sur le bouton Bonjour
	fenetre_reglage()
EndIf

Until event=#PB_Event_CloseWindow ;si on appuie sur la croix on quitte le programme.

CloseWindow(1)
Dernière modification par cirederff le lun. 22/juin/2009 9:21, modifié 1 fois.
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

Salut,
Il y a plusieurs erreures dans ta deuxième fenêtre, à la ligne 36 tu as :

Code : Tout sélectionner

If clicgadget = 2    
  CloseWindow(2) 
EndIf
Le fait d'appeler la commande CloseWindow() ne quittera pas ta procédure fenetre_reglage(), elle éffacera simplement la fenêtre ainsi que les gadgets associés.

Second problème, la boucle principale de la procédure fenetre_reglage() ne quitte que lorsque l'utilisateur clique sur la petite croix en haut à droite de sa fenêtre, or il n'y en a pas, ton programme ne sortira jamais de cette procédure, c'est donc pour ça que tu ne peux plus rappeler le bouton.

Solution :
ligne 36, remplacer :

Code : Tout sélectionner

If clicgadget = 2    
  CloseWindow(2) 
EndIf
par :

Code : Tout sélectionner

If clicgadget = 2    
  quitter_reglage = #True 
EndIf
puis, ligne 44, remplacer :

Code : Tout sélectionner

Until event=#PB_Event_CloseWindow
par :

Code : Tout sélectionner

Until quitter_reglage = #True
CloseWindow(2)
Explication :
Au lieu d'appeler CloseWindow(2) pour fermer la fenêtre, je créer une variable 'quitter_reglage = #True' qui indiquera à la boucle de la procédure qu'elle doit quitter si 'quitter_reglage = #True' au lieux d'attendre que l'utilisateur appuie sur la croix, ce qui n'arrivera jamais :wink:
enfin, j'appel CloseWindow(2) pour éffacer la fenêtre, après être sorti de la boucle car sinon elle restera affichée en permanence.

Si tu as des questions n'hésites pas à en poser.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

[REEDIT]
mince grillé par Atomo :)


fermer une fenetre, ne veux pas dire liberer sa gestion des events !! :)
regarde ligne 60

Code : Tout sélectionner

;********PURE 4.20**********
;******************************
Declare  fenetre_reglage()

Enumeration
#fenetre
#fenetre2
#bouton_quitter1
#bouton_quitter2
#bouton_reglage

#fenetre_largeur = 1024
#fenetre_hauteur = 600
EndEnumeration

OpenWindow(#fenetre ,0,0,#fenetre_largeur ,#fenetre_hauteur ,"GUIDAGE",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget)
Fenetre_une = WindowID(#fenetre )
 ; CreateGadgetList(Fenetre_une) ceci ne sert plus dans la v 4.31
couleur = RGB(0,150,0) ;on met la fenetre en bleu foncé
SetWindowColor(#fenetre,couleur)
ButtonGadget(#bouton_reglage, 900, 10, 100, 30, "REGLAGE" )

Repeat
  Event1 = WaitWindowEvent() ;on met à jour les évenements
  
  If Event1 = #PB_Event_Gadget ;un gadget est il utilisé ?
    clicgadget = EventGadget() ;OUI, on identifie le gadget
  Else
    clicgadget = 0 ;NON, on renvoie 0
  EndIf
  
  If clicgadget = #bouton_reglage ;appui sur le bouton Bonjour
    fenetre_reglage()
    SetActiveWindow(#fenetre)
  EndIf
  
Until Event1=#PB_Event_CloseWindow ;si on appuie sur la croix on quitte le programme.

CloseWindow(#fenetre)

; **************** zone des procedures ********************************

Procedure fenetre_reglage() 
  OpenWindow(#fenetre2 ,0,0,#fenetre_largeur ,#fenetre_hauteur ,"fenetre2" ,#PB_Window_ScreenCentered)
 ; CreateGadgetList(WindowID(2))   ceci ne sert plus dans la v 4.31
  StickyWindow(#fenetre2,1)
  ButtonGadget(#bouton_quitter1, 10,  500, 200, 20, "quiter")
  ButtonGadget(#bouton_quitter2, 10,  400, 200, 20, "quiter")
  
  Repeat
    Event = WaitWindowEvent() ;on met à jour les évenements
    
    If Event = #PB_Event_Gadget ;un gadget est il utilisé ?
      clicgadget = EventGadget() ;OUI, on identifie le gadget
    Else
      clicgadget = 0 ;NON, on renvoie 0
    EndIf
    
    If clicgadget = 2   
      CloseWindow(#fenetre2) ; <<<<<< ton erreur est la !! tu ferme la fenetre, mais elle a toujour la main
      ; en matiere d'event !!
      ; il te faut donc mettre fin a ses events !!
      ; comme ça : Event=#PB_Event_CloseWindow 
      Event=#PB_Event_CloseWindow  ; et voila
    EndIf
    
    If clicgadget = 3   
      TextGadget(0, 10, 10,250,20,"BLA BLA BLA")
    EndIf
    
  Until Event=#PB_Event_CloseWindow ;si on appuie sur la croix on quitte le programme.
EndProcedure
cirederff
Messages : 54
Inscription : ven. 15/mai/2009 19:57

Message par cirederff »

Merci pour cette réponse, je me doutais bien que je ne sortais pas de la procédure.

Mais je vois aussi que tu fais la distinction des "Events"

Et autre chose, comment sont distingués clicgadget = 2 et clicgadget = 3 par rapport à clicgadget = #bouton_reglage :?:
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

Et autre chose, comment sont distingués clicgadget = 2 et clicgadget = 3 par rapport à clicgadget = #bouton_reglage
Grâce à la fonction Enumeration, la constante #bouton_reglage se voit attribuer une valeure automatiquement.

extrait de la doc :

Code : Tout sélectionner

Les énumérations sont très pratiques pour déclarer rapidement une série de constantes sans s'occuper de leur valeur numérique. La première constante de l'énumération prendra la valeur 0, la constante suivante prendra la valeur 1 etc.

Code : Tout sélectionner

Enumeration
  #fenetre ;Sera égal à 0
  #fenetre2 ;Sera égal à 1
  #bouton_quitter1 ;Sera égal à 2
  #bouton_quitter2 ;Sera égal à 3
  #bouton_reglage ;Sera égal à 4
EndEnumeration
Dans le code de Dobro, la valeure de #bouton_reglage sera donc égale à 4.
cirederff
Messages : 54
Inscription : ven. 15/mai/2009 19:57

Message par cirederff »

Oui je viens de faire un essai, je ne peux pas les nommer directement, :?

merci à+
Atomo
Messages : 207
Inscription : lun. 17/sept./2007 12:27

Message par Atomo »

Je n'ai pas compris, tu essaies de faire quoi ?
cirederff
Messages : 54
Inscription : ven. 15/mai/2009 19:57

Message par cirederff »

je voulais me passer de l'énumération tout simplement :oops: :oops: :oops:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

cirederff a écrit :je voulais me passer de l'énumération tout simplement :oops: :oops: :oops:
c'est domage !!

parceque justement en utilisant des constantes ton code deviens plus claire !!


au lieu de

Code : Tout sélectionner

  If clicgadget = 3   
tu aurai
If clicgadget = #bouton_blabla

de plus les enumerations tu peut les faire commencer a ce que tu veux !!
ex :


Enumeration 100 step 100
#fenetre ;Sera égal à 100
#fenetre2 ;Sera égal à 200

si tu veux revenir a ton system archaique
tu vire enumeration, et endenumetion

et chaque constante tu lui atribue une valeur !
#fenetre=100 ;Sera égal à 100
#fenetre2=200 ;Sera égal à 200
cirederff
Messages : 54
Inscription : ven. 15/mai/2009 19:57

Message par cirederff »

Dobro a écrit : si tu veux revenir a ton système archaïque
tu vire enumeration, et endenumetion
non non :lol:

"J'archaïse" pour pouvoir me concentre sur l'essentiel et après.........mais bien après je remet les petits automatismes :wink:
Répondre