pour qu'on voit bien la différence avec les modules, j'ai transformé le programme que j'ai posté plus haut en module, sinon à part les DeclareModule, Module et UseModule, je n'ai rien changé:
Code : Tout sélectionner
;Gestion Liste d'achats
; 13 avril 2018
; PB 5.70
; par Micoute
DeclareModule Remplissage
Enumeration Fichiers
#FichierJSON
EndEnumeration
Enumeration Fenetres
#Fenetre_edition
EndEnumeration
Enumeration Gadgets
#Liste_produits
#Txt_Magasin
#Txt_Rayon
#Txt_Nom_Produit
#Txt_CP
#Txt_Ville
#Str_Magasin
#Str_Rayon
#Str_Nom_Produit
#Btn_Nouveau
#Btn_Maj
#Btn_Supprimer
#Btn_Sauvegarder
#Btn_Quitter
#Txt_Nb_Enreg
EndEnumeration
Enumeration Polices
#Police
#Police2
#Police_Txt
EndEnumeration
;Structure d'un produit
Structure Produit
Magasin.s
Rayon.s
Produit.s
EndStructure
Global.l Evenement
;Création d'une liste vierge pour les produits
Global NewList produits.produit()
Global$ FichierJson = "D:\Programmation\Donnees\produits_achats.json"
Declare Quitter()
Declare Charger_produits()
Declare GestionEvenements()
Declare Nouveauproduit()
Declare Selectionproduit()
Declare Supprimerproduit()
Declare Majproduit()
Declare Sauvegardeproduits()
LoadFont(#Police, "Cambria", 16, #PB_Font_Bold)
LoadFont(#Police_Txt, "A_Nefel_Botan", 10, #PB_Font_Bold)
LoadFont(#Police2, "FontAwesome", 18, #PB_Font_Bold)
EndDeclareModule
Module Remplissage
Macro TrierListeStruc(_NomListe_, _Options_, _Champ_Structure_)
; Cette macro simplifie l'utilisation de la fonction intégrée SortStructuredList().
SortStructuredList(_NomListe_, _Options_, OffsetOf(_Champ_Structure_), TypeOf(_Champ_Structure_))
EndMacro
Procedure Quitter()
CloseWindow(#Fenetre_edition)
End
EndProcedure
;Chargement des produits existants
Procedure Charger_produits()
If ReadFile(#FichierJSON, FichierJson)
CloseFile(#FichierJSON)
;Lecture du fichier JSON
LoadJSON(#FichierJSON, FichierJson, #PB_JSON_NoCase)
;Extraction de la chaine JSON vers la liste chainée produits
ExtractJSONList(JSONValue(#FichierJSON), produits())
TrierListeStruc(produits(), #PB_Sort_Ascending, produit\Produit)
TrierListeStruc(produits(), #PB_Sort_Ascending, produit\Rayon)
TrierListeStruc(produits(), #PB_Sort_Ascending, produit\Magasin)
;Affichage de la liste des produits
ForEach(produits())
With produits()
AddGadgetItem(#Liste_produits, -1, \Magasin + #LF$ + \Rayon + #LF$ + \Produit)
SetGadgetItemData(#Liste_produits, CountGadgetItems(#Liste_produits)-1, ListIndex(produits()))
EndWith
Next
EndIf
EndProcedure
;Gestionnaire de contrôle de la saisie
Procedure GestionEvenements()
Protected Evenement = EventType()
Select Evenement
Case #PB_EventType_Change
If Trim(GetGadgetText(#Str_Magasin)) <> ""
DisableGadget(#Btn_Nouveau, #True)
DisableGadget(#Btn_Maj, #False)
DisableGadget(#Btn_Sauvegarder, #False)
Else
DisableGadget(#Btn_Nouveau, #False)
DisableGadget(#Btn_Maj, #True)
DisableGadget(#Btn_Sauvegarder, #True)
EndIf
EndSelect
EndProcedure
;Nouveau produit (Remise à zéro des champs de saisie)
Procedure Nouveauproduit()
SetWindowData(#Fenetre_edition, 0) ;C'est une création
SetGadgetText(#Str_Magasin, "")
SetGadgetText(#Str_Rayon, "")
SetGadgetText(#Str_Nom_Produit, "")
DisableGadget(#Btn_Nouveau, #False)
DisableGadget(#Btn_Maj, #True)
DisableGadget(#Btn_Supprimer, #True)
SetGadgetText(#Btn_Maj, Chr($F067))
SetActiveGadget(#Str_Magasin)
EndProcedure
;Un produit est sélectionné dans la liste
Procedure Selectionproduit()
Protected Item = GetGadgetState(#Liste_produits)
If Item <> -1
SelectElement(produits(), GetGadgetItemData(#Liste_produits, Item))
With produits()
SetGadgetText(#Str_Magasin, \Magasin)
SetGadgetText(#Str_Rayon, \Rayon)
SetGadgetText(#Str_Nom_Produit, \Produit)
EndWith
EndIf
;C'est une modification de produit
SetWindowData(#Fenetre_edition, 1)
DisableGadget(#Btn_Nouveau, #False)
DisableGadget(#Btn_Maj, #False)
DisableGadget(#Btn_Supprimer, #False)
SetGadgetText(#Btn_Maj, Chr($F040))
SetActiveGadget(#Str_Magasin)
EndProcedure
;Suppression d'un produit
Procedure Supprimerproduit()
If MessageRequester("Information", "Etes vous sûr de supprimer un produit ?" + #CRLF$ + "cette action est irrémédiable !", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
SetWindowData(#Fenetre_edition, 3) ;C'est une suppression
Majproduit()
EndIf
EndProcedure
;Gestionnaire de mise à jour des produits
Procedure Majproduit()
Protected.s Magasin = GetGadgetText(#Str_Magasin)
Protected.s Rayon = GetGadgetText(#Str_Rayon)
Protected.s Nom_Produit = GetGadgetText(#Str_Nom_Produit)
DisableGadget(#Btn_Sauvegarder, 0)
Select GetWindowData(#Fenetre_edition)
Case 0 ;Création d'un produit
AddElement(produits())
With produits()
\Magasin = Magasin
\Rayon = Rayon
\Produit = Nom_Produit
AddGadgetItem(#Liste_produits, -1, \Magasin + #LF$ + \Rayon + #LF$ + \Produit)
SetGadgetItemData(#Liste_produits, CountGadgetItems(#Liste_produits)-1, ListIndex(produits()))
EndWith
Case 1 ;Modification d'un produit
With produits()
\Magasin = Magasin
\Rayon = Rayon
\Produit = Nom_Produit
SetGadgetItemText(#Liste_produits, ListIndex(produits()), \Magasin, 0)
SetGadgetItemText(#Liste_produits, ListIndex(produits()), \Rayon, 1)
SetGadgetItemText(#Liste_produits, ListIndex(produits()), \Produit, 2)
EndWith
Nouveauproduit()
Case 3 ;Suppression d'un produit
RemoveGadgetItem(#Liste_produits, ListIndex(produits()))
DeleteElement(produits())
;Mise à jour des index de liaison ListIconGadget <-> produits()
ForEach(produits())
SetGadgetItemData(#Liste_produits, ListIndex(produits()), ListIndex(produits()))
Next
EndSelect
EndProcedure
;Sauvegarde automatique des produits à la fermeture de l'application
Procedure Sauvegardeproduits()
;Création d'un objet JSON
CreateJSON(#FichierJSON)
;Insertion de la liste chainée "produits" dans l'objet JSON
InsertJSONList(JSONValue(#FichierJSON), produits())
;Sauvegarde du fichier
SaveJSON(#FichierJSON, FichierJson, #PB_JSON_PrettyPrint)
MessageRequester("Information", "Le fichier " + #DQUOTE$ + GetFilePart(FichierJson) + #DQUOTE$ + " a été sauvegardé" + #LF$ + #LF$ + "et va se fermer", #PB_MessageRequester_Info)
Quitter()
EndProcedure
EndModule
Procedure Programme_principal()
UseModule Remplissage
If OpenWindow(#Fenetre_edition, 767, 175, 520, 500, "Base de données", #PB_Window_TitleBar|#PB_Window_ScreenCentered)
SetWindowColor(#Fenetre_edition, $F8BFB8)
SetGadgetFont(#PB_Default, FontID(#Police))
ListIconGadget(#Liste_produits, 10, 10, WindowWidth(#Fenetre_edition)-20, 260, "Rayon", 130, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_HeaderDragDrop)
AddGadgetColumn(#Liste_produits, 1, "Produit", 130)
AddGadgetColumn(#Liste_produits, 2, "Nom", 220)
TextGadget(#Txt_Magasin, 10, 280, 140, 25, "Magasin", #PB_Text_Right)
TextGadget(#Txt_Rayon, 10, 310, 140, 25, "Rayon", #PB_Text_Right)
TextGadget(#Txt_Nom_Produit, 10, 340, 140, 25, "Nom produit", #PB_Text_Right)
StringGadget(#Str_Magasin, 160, 280, 350, 25, "")
StringGadget(#Str_Rayon, 160, 310, 350, 25, "")
StringGadget(#Str_Nom_Produit, 160, 340, 350, 25, "")
ButtonGadget(#Btn_Nouveau, 10, 400, 130, 40, "Nouveau")
ButtonGadget(#Btn_Maj, 200, 400, 130, 40, "Mise à jour")
ButtonGadget(#Btn_Supprimer, 380, 400, 130, 40, "Supprimer")
ButtonGadget(#Btn_Sauvegarder, 10, 450, 130, 40, "Sauvegarder")
ButtonGadget(#Btn_Quitter, 380, 450, 130, 40, "Quitter")
TextGadget(#Txt_Nb_Enreg, 180, 460, 200, 25, "")
;Lectures des produits
Charger_produits()
For i = #Btn_Nouveau To #Btn_Quitter
SetGadgetFont(i, FontID(#Police2))
Next i
SetGadgetText(#Txt_Nb_Enreg, Str(ListSize(produits())) + " enregistrements")
SetGadgetColor(#Txt_Nb_Enreg, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_edition))
For i = #Txt_Magasin To #Txt_Nom_Produit
SetGadgetFont(i, FontID(#Police_Txt))
SetGadgetFont(#Txt_Nb_Enreg, FontID(#Police_Txt))
SetGadgetColor(i, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_edition))
Next i
For i = #Str_Magasin To #Str_Nom_Produit
SetGadgetFont(i, FontID(#Police_Txt))
SetGadgetColor(i, #PB_Gadget_BackColor, $B8F7F8)
Next i
For i = 0 To CountGadgetItems(#Liste_produits) ;ListIconGadget
If i%2 = 1 ; si notre compteur est pair
SetGadgetItemColor(#Liste_produits, i, #PB_Gadget_FrontColor, $0000FF)
SetGadgetItemColor(#Liste_produits, i, #PB_Gadget_BackColor, $FFE8FF)
Else ; sinon, s'il est impair
SetGadgetItemColor(#Liste_produits, i, #PB_Gadget_FrontColor, $FF0000)
SetGadgetItemColor(#Liste_produits, i, #PB_Gadget_BackColor, $FFE9E8)
EndIf
Next i
;Contrôle de la saisie (Le Magasin ou la raison sociale est obligatoire)
BindGadgetEvent(#Str_Magasin, @GestionEvenements())
;Mise en place d'un nouveau produit
BindGadgetEvent(#Btn_Nouveau, @Nouveauproduit())
;Un produit est selectionné dans la liste
BindGadgetEvent(#Liste_produits, @Selectionproduit())
;Ajout ou modification d'un produit
BindGadgetEvent(#Btn_Maj, @Majproduit())
;Supression d'un produit
BindGadgetEvent(#Btn_Supprimer, @Supprimerproduit())
;Fermeture de l'application et sauvegarde des produits
BindGadgetEvent(#Btn_Sauvegarder, @Sauvegardeproduits())
;Quitter le programme sans sauvegarder
BindEvent(#PB_Event_CloseWindow, @Quitter())
BindGadgetEvent(#Btn_Quitter, @Quitter())
DisableGadget(#Btn_Sauvegarder, #True)
;DisableGadget(#Btn_Nouveau, #False)
Nouveauproduit()
SetActiveGadget(#Str_Magasin)
EndIf
EndProcedure
Programme_principal()
;- Boucle
Repeat
Evenement = WaitWindowEvent()
Select Evenement
Case #PB_Event_Gadget
Select EventGadget()
Case #Btn_Quitter
Quitter()
EndSelect
Case #PB_Event_CloseWindow
Select EventWindow()
Case #Fenetre_edition
Quitter()
Break
EndSelect
EndSelect
ForEver