PureBasic
https://www.purebasic.fr/french/

[Résolu] Enumérations nommées et module
https://www.purebasic.fr/french/viewtopic.php?f=1&t=17247
Page 1 sur 1

Auteur:  Ulix [ Sam 28/Avr/2018 22:53 ]
Sujet du message:  [Résolu] Enumérations nommées et module

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:


;   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

Auteur:  Micoute [ Dim 29/Avr/2018 7:07 ]
Sujet du message:  Re: Enumérations nommées et module

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.

Auteur:  Ulix [ Dim 29/Avr/2018 7:29 ]
Sujet du message:  Re: Enumérations nommées et module

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:

Auteur:  Demivec [ Dim 29/Avr/2018 8:30 ]
Sujet du message:  Re: Enumérations nommées et module

Exemple:

Code:
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

Auteur:  MLD [ Dim 29/Avr/2018 10:22 ]
Sujet du message:  Re: Enumérations nommées et module

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.

Auteur:  GallyHC [ Dim 29/Avr/2018 10:32 ]
Sujet du message:  Re: Enumérations nommées et module

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:
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

Auteur:  Ulix [ Dim 29/Avr/2018 12:13 ]
Sujet du message:  [Résolu]: Enumérations nommées et module

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

Page 1 sur 1 Heures au format UTC + 1 heure
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/