[Résolu] Enumérations nommées et module

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

[Résolu] Enumérations nommées et module

Message par Ulix »

Salut a tous !

J'ai encore des problème avec les modules ! :oops:
J'utilise les énumérations nommées (ex: enumeration fenetre, enum... gadget..etc) !
Mais apparemment cela ne marche pas dans les modules (énumération recommence a 0),
d'où des conflits (j'ai la parade, mais attribué des valeurs manuellement aux gadgets...)

J'ai préparer un petit bout de code pour que vous puissiez testé, dite moi :
BUG ou pas ! Dite moi ou je me suis planté ! :twisted:
Merci d'avance

Code : Tout sélectionner



;	Enumérations nommées et module

;	Quelle est l’intérêt si on ne peut pas utilisé les "Enumérations nommées"
;	C'est exemple illustrer par le 1er Test !!! Le programme plante a la fermeture 
;	de la deuxième fenêtre (Normal les constante de la fenêtre et des gadget ont 
;	été réattribués  !! Donc plus des fenêtre de retour)

;	Le bon comportement est le Test 2  ! 
;	Quelle est l’intérêt si l'on doit donner les valeur manuellement au constante ?
;	Essayé et dite moi si on peut le considérer comme un BUG !!


;	=======Test n° 1=========
;	Lancer la compil tel quel, le programme plante a la sortie de la 2ème fenétre !


Enumeration fenetre
#f1
EndEnumeration

Enumeration Gadgets
#f1Gadget1 
#f1Gadget2
#f1Gadget3
#f1Gadget4
#f1Gadget5
#f1Gadget6
EndEnumeration 	
 
 
;	=======Test n° 2=========
;	Commenter les énumération du test  1 (programme principal et module)
;	et décommenter les énumération du test 2, (programme principal et module)
;	et relancer la compil 


; Enumeration fenetre
; #f1 = 1
; EndEnumeration
; 
; Enumeration Gadgets
; #f1Gadget1 = 1
; #f1Gadget2
; #f1Gadget3
; #f1Gadget4
; #f1Gadget5
; #f1Gadget6
; EndEnumeration 

	
;Debug "La prochaine valeur d'énumération est : " + #PB_Compiler_EnumerationValue
;	Ici : Structure 
;	ici : Globale
;	Ici : Déclaration
;	Ici mes includes de mes modules 
;	XIncludeFile "xxxx... module   "

;====================================================
;====================================================
DeclareModule Patate
		;Toutes les Procedures déclarer ici seront accessible depuis l'extérieure du module !


;	Debug "La prochaine valeur d'énumération  = " + #PB_Compiler_EnumerationValue
;	Donne une valeur qui n'est pas reprise pour la énumération ????




;	=======Test n° 1=========
;	Lancer la compil tel quel, le programme plante a la sortie de la 2ème fenetre !


Enumeration Fenetres
#f2
EndEnumeration

Enumeration Gadgets
;#f2Gadget1 = #PB_Compiler_EnumerationValue		;	Ne marche pas !!!
#f2Gadget1 
#f2Gadget2
#f2Gadget3
#f2Gadget4
#f2Gadget5
#f2Gadget6
EndEnumeration 



;	=======Test n° 2=========
;	Commenter les énumération du test  1
;	et décommenter les énumération du test 2, y compris dans le programme principale
;	et lancer la compil 


; Enumeration Fenetres
; #f2 = 2
; EndEnumeration
; 
; Debug "La prochaine valeur d'énumération est : " + #PB_Compiler_EnumerationValue
; Enumeration Gadgets
; ;#f2Gadget1 = #PB_Compiler_EnumerationValue		;	Ne marche pas !!!
; #f2Gadget1 = 10
; #f2Gadget2
; #f2Gadget3
; #f2Gadget4
; #f2Gadget5
; #f2Gadget6
;  EndEnumeration 
 
 
 
Declare  Fenetre2()
		
EndDeclareModule

Module Patate

Procedure Fenetre2()


If OpenWindow(#f2, 400, 100, 300, 300, "PanelGadget", #PB_Window_SystemMenu) 
TextGadget(#f2Gadget1, 		20,   20, 130, 30, "Message  !")
StringGadget(#f2Gadget2, 	160, 20, 130, 30, "")
TextGadget(#f2Gadget3, 		20,  70, 130, 30, "Message !")
StringGadget(#f2Gadget4, 	160, 70, 130, 30, "")

ButtonGadget(#f2Gadget5, 45,   240, 80, 30,"FERMER")
ButtonGadget(#f2Gadget6, 170, 240, 80, 30,"QUITTER")

Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
         	Select EventGadget()
           	Case #f2Gadget5		:	 f2Quitter = 1
           	Case #f2Gadget6 		:	 f2Quitter = 1
         	EndSelect
            
Case #PB_Event_CloseWindow	:	 f2Quitter = 1

EndSelect
Until f2Quitter = 1
EndIf
CloseWindow(#f2)  
EndProcedure

	
EndModule

UseModule Patate

;====================================================
;====================================================

;	Mes procedures du programme principales

Procedure Affiche()

Debug "#f1Gadget1 = "+Str(#f1Gadget1)
Debug "#f1Gadget6 = "+Str(#f1Gadget6)

Debug "#f2Gadget1 = "+Str(#f2Gadget1)		
Debug "#f2Gadget6 = "+Str(#f2Gadget6)

EndProcedure

Procedure Fenetre1()
If OpenWindow(#f1, 50, 100, 300, 300, "PanelGadget", #PB_Window_SystemMenu ) 
PanelGadget     (#f1Gadget1, 10, 10, 280, 200)
		AddGadgetItem (#f1Gadget1, -1, "Onglet 1")
		FrameGadget	(#f1Gadget2,		0,		-7,		280,	180,	"")
		AddGadgetItem (#f1Gadget1, -1,"Onglet 2")
		FrameGadget	(#f1Gadget3,		0,		-7,		280,	180,	"")
		CloseGadgetList()

ButtonGadget(#f1Gadget5, 45,   240, 80, 30,"AFFICHE")
ButtonGadget(#f1Gadget6, 170, 240, 80, 30,"FENETRE 2")
EndIf
EndProcedure

;====================================================

Fenetre1()		;	Lancement du programme

Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
         	Select EventGadget()
           	Case #f1Gadget5	:	 Affiche()
           	Case #f1Gadget6 	:	Fenetre2();Patate::
         	EndSelect
            
Case #PB_Event_CloseWindow	:	 f1Quitter = 1

EndSelect
Until f1Quitter = 1

End
 




A+
Ulix
Dernière modification par Ulix le dim. 29/avr./2018 12:14, modifié 1 fois.
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Enumérations nommées et module

Message par Micoute »

C'est normal puisque tu donnes toujours le même nom à tes gadgets, une énumération sert à donner des valeurs à des constantes qui sont nommées et dans tous les cas #f1Gadget1 aura toujours la même valeur, donc si l'énumération finit par #f1Gadget6, la suivante doit commencer par #f1Gadget7 etc...

Donc le bug se situe entre le chaise et le clavier, comme dit le bon John.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Re: Enumérations nommées et module

Message par Ulix »

Non !!! je suis pas sûr que tu est tester ! :cry:

D'abord mes gadgets ne porte pas le même nom :
dans la première fenêtre les gadgets commence par #f1 et dans la 2ème ils commence par #f2 !

Ensuite l'énumération nommées est justement fait pour éviter que des gadgets ne porte le même numéro !

Donc mon propos est de démontrer que l'énumération ne marche pas ! A nom avis il s'agit là d'un BUG !

Le Test n°2 reproduit le bon comportement, seulement il faut tester ! :cry:


Petite note : "Donc le bug se situe entre le chaise et le clavier, comme dit le bon John."
Lui aussi n'a pas tester la dernière fois que j'ai posté !! :cry:
Demivec
Messages : 90
Inscription : sam. 18/sept./2010 18:13

Re: Enumérations nommées et module

Message par Demivec »

Exemple:

Code : Tout sélectionner

DeclareModule commun
  Enumeration fenetres 1
  EndEnumeration
  
  Enumeration Gadgets 1
  EndEnumeration
EndDeclareModule

Module commun
EndModule


UseModule commun
Enumeration fenetres
#f1
EndEnumeration

Enumeration Gadgets
#f1Gadget1 
#f1Gadget2
#f1Gadget3
#f1Gadget4
#f1Gadget5
#f1Gadget6
EndEnumeration    


;====================================================
;====================================================
DeclareModule Patate
      ;Toutes les Procedures déclarer ici seront accessible depuis l'extérieure du module !


UseModule commun
Enumeration fenetres
#f2
EndEnumeration

Enumeration Gadgets
#f2Gadget1 
#f2Gadget2
#f2Gadget3
#f2Gadget4
#f2Gadget5
#f2Gadget6
EndEnumeration 

Declare  Fenetre2()
      
EndDeclareModule

Module Patate

Procedure Fenetre2()


If OpenWindow(#f2, 400, 100, 300, 300, "PanelGadget", #PB_Window_SystemMenu) 
TextGadget(#f2Gadget1,       20,   20, 130, 30, "Message  !")
StringGadget(#f2Gadget2,    160, 20, 130, 30, "")
TextGadget(#f2Gadget3,       20,  70, 130, 30, "Message !")
StringGadget(#f2Gadget4,    160, 70, 130, 30, "")

ButtonGadget(#f2Gadget5, 45,   240, 80, 30,"FERMER")
ButtonGadget(#f2Gadget6, 170, 240, 80, 30,"QUITTER")

Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
            Select EventGadget()
              Case #f2Gadget5      :    f2Quitter = 1
              Case #f2Gadget6       :    f2Quitter = 1
            EndSelect
            
Case #PB_Event_CloseWindow   :    f2Quitter = 1

EndSelect
Until f2Quitter = 1
EndIf
CloseWindow(#f2)  
EndProcedure

   
EndModule

UseModule Patate

;====================================================
;====================================================

;   Mes procedures du programme principales

Procedure Affiche()

Debug "#f1Gadget1 = "+Str(#f1Gadget1)
Debug "#f1Gadget6 = "+Str(#f1Gadget6)

Debug "#f2Gadget1 = "+Str(#f2Gadget1)      
Debug "#f2Gadget6 = "+Str(#f2Gadget6)

EndProcedure

Procedure Fenetre1()
If OpenWindow(#f1, 50, 100, 300, 300, "PanelGadget", #PB_Window_SystemMenu ) 
PanelGadget     (#f1Gadget1, 10, 10, 280, 200)
      AddGadgetItem (#f1Gadget1, -1, "Onglet 1")
      FrameGadget   (#f1Gadget2,      0,      -7,      280,   180,   "")
      AddGadgetItem (#f1Gadget1, -1,"Onglet 2")
      FrameGadget   (#f1Gadget3,      0,      -7,      280,   180,   "")
      CloseGadgetList()

ButtonGadget(#f1Gadget5, 45,   240, 80, 30,"AFFICHE")
ButtonGadget(#f1Gadget6, 170, 240, 80, 30,"FENETRE 2")
EndIf
EndProcedure

;====================================================

Fenetre1()      ;   Lancement du programme

Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
            Select EventGadget()
              Case #f1Gadget5   :    Affiche()
              Case #f1Gadget6    :   Fenetre2();Patate::
            EndSelect
            
Case #PB_Event_CloseWindow   :    f1Quitter = 1

EndSelect
Until f1Quitter = 1

End
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Enumérations nommées et module

Message par MLD »

Perso je n'utilise plus l'énumération automatique.
Dans des programmes complexes, ou il y a beaucoup de gadgets, cela devient vite ingérable. On ne sait plus vraiment quel numéro a un gadget donné.
ce qui est un peu frustrant pour faire des boucles de coloration de gadget par exemple.
en fait PB attribue a chaque gadget une constante un peu cachée.
Alors autant faire directement par exemple: #Bouton_1 = 10 : #Bouton_2 = 11 ect. Ce qui n'est pas beaucoup plus long que l'énumération, mais permet ensuite une utilisation beaucoup plus souple
des gadgets par leur numéro.
Ceci demande un peu plus d'organisation lors du projet de programme. expl prévoir les numéros de 5 a 20 pour les boutons, de 21 a 30 pour les strings etc.
Mais chacun fait comme il veut.
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Enumérations nommées et module

Message par GallyHC »

Bonjour,

Qu'une enum soit dans le programme ou dans un module on en fait ce que l'on veut. Un exemple avec les constantes commençant à 100 et de 10 en 10.

Code : Tout sélectionner

Enumeration test 100 Step 10
  #a
  #b
  #c
  #d
EndEnumeration
  
Debug #a
Debug #b
Debug #c
Debug #d
Après dans un module j'utiliserais plus des "#PB_Any", car le but d'un module est d'être autonome, et avec des constantes en fixe, tu risque tôt ou tard avoir des problème de conflit.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

[Résolu]: Enumérations nommées et module

Message par Ulix »

Merci pour vos réponses !

@Demivec
Effectivement le fait d'utilisé un module commun permet d'utilisé l'énumération nommées !

Je ne l'avais pas compris, l'aide de PB ne dit rien a se sujet (exemple de module,
avec les voitures n'est pas probant...) :cry:

Donc, merci Demivec, ton code d'exemple ! :P

Ulix
Répondre