Un repertoire ...

Programmation d'applications complexes
Paul
Messages : 8
Inscription : jeu. 07/sept./2017 20:36

Un repertoire ...

Message par Paul »

Code : Tout sélectionner

Un petit répertoire que chacun ... moyennant quelques aménagements pourra adapter à ses désirs.

;----------------------------------
;  Répertoire ...
;  Paul(PE)
;  08-09-2017
;  PureBasic 5.60 (Linux - x64)
;-------------------------------


Declare contact_fenetre(Fen)
Declare contact_nouveau()
Declare quitter(Fen)
Declare contact_chargement()
Declare enregistrer_contact_nouveau()
Declare changement_dans_liste()
Declare touche_entree()
Declare contact_sauvegarde()
Declare contact_consulter ()
Declare contact_supprimer ()
Declare contact_lister()
Declare contact_modifier()
Declare contact_modification()


Enumeration Fenetres
  #Fenetre_Contact
  #Fenetre_Nouveau
  #Fenetre_Consulter
  #Fenetre_Modifier
  #Fenetre_lister 
EndEnumeration

Enumeration Gadgets  
  #Contact_Cont1
  #Lib_Contact_Lib1
  #Bou_Contact_Consulter
  #Bou_Contact_Modifier
  #Bou_Contact_Supprimer
  #Bou_Contact_Neant4
  #Bou_Contact_Nouveau
  #Bou_Contact_Fermer
  #Contact_combo
  #Contact_Cont2
  #Contact_Calendrier
  
  #Nouveau_Nom
  #Nouveau_Prenom
  #Nouveau_Info1
  #Nouveau_Info2
  #Nouveau_Info3
  #Nouveau_Info4
  #Bou_Nouveau_enregistrer
  #Bou_Nouveau_sortir
  
  #Consulter_Nom
  #Consulter_Prenom
  #Consulter_Info1
  #Consulter_Info2
  #Consulter_Info3
  #Consulter_Info4
  #Bou_Consulter_retour
  
  #Modifier_Nom
  #Modifier_Prenom
  #Modifier_Info1
  #Modifier_Info2
  #Modifier_Info3
  #Modifier_Info4
  #Bou_Modifier_Valider
  #Bou_Modifier_Retour
    
  #Bou_Contact_liste
  #Contact_lister_liste
  #Bou_contact_lister_Retour  
EndEnumeration

Enumeration
  #Return
EndEnumeration


Structure identite
  Nom$
  Prenom$
  Info1$
  Info2$
  Info3$
  Info4$
EndStructure

Global NewMap Contact1.identite()
Global n$, p$, v1$, v2$, v3$, v4$
Global selection$, filename$
filename$ = "repertoire.txt"

Procedure quitter(Fen)
  CloseWindow(Fen)
  End
EndProcedure

Procedure contact_chargement()
  
  If ReadFile(0, filename$)
    While Eof(0) = 0
      n$=ReadString(0)
      p$=ReadString(0)
      v1$=ReadString(0)
      v2$=ReadString(0)
      v3$=ReadString(0)
      v4$=ReadString(0)
    
      a$ = n$+" "+p$

      Contact1(a$)\Nom$ = n$
      Contact1(a$)\Prenom$ = p$
      Contact1(a$)\Info1$ = v1$
      Contact1(a$)\Info2$ = v2$
      Contact1(a$)\Info3$ = v3$
      Contact1(a$)\Info4$ = v4$
    Wend
  Else
    If CreateFile(0, filename$)
    EndIf
    
  EndIf
  CloseFile(0)
  ProcedureReturn
EndProcedure

Procedure contact_sauvegarde()
  If CreateFile(0, filename$)
    ForEach Contact1()
      WriteStringN(0, (Contact1()\Nom$))
      WriteStringN(0, (Contact1()\Prenom$))
      WriteStringN(0, (Contact1()\Info1$))
      WriteStringN(0, (Contact1()\Info2$))
      WriteStringN(0, (Contact1()\Info3$))
      WriteStringN(0, (Contact1()\Info4$))
    Next
    CloseFile(0)
  EndIf
  ProcedureReturn
EndProcedure

Procedure enregistrer_contact_nouveau()
  n$ = (GetGadgetText(#Nouveau_Nom))
  p$ = (GetGadgetText(#Nouveau_Prenom))
  v1$ = (GetGadgetText(#Nouveau_Info1))
  v2$ = (GetGadgetText(#Nouveau_Info2))
  v3$ = (GetGadgetText(#Nouveau_Info3))
  v4$ = (GetGadgetText(#Nouveau_Info4))
  
  SetGadgetText(#Nouveau_Nom, "")
  SetGadgetText(#Nouveau_Prenom, "")
  SetGadgetText(#Nouveau_Info1, "")
  SetGadgetText(#Nouveau_Info2, "")
  SetGadgetText(#Nouveau_Info3, "")
  SetGadgetText(#Nouveau_Info4, "")
  
  a$ = n$+" "+p$
  
  Contact1(a$)\Nom$ = n$
  Contact1(a$)\Prenom$ = p$
  Contact1(a$)\Info1$ = v1$
  Contact1(a$)\Info2$ = v2$
  Contact1(a$)\Info3$ = v3$
  Contact1(a$)\Info4$ = v4$
  SetActiveGadget(#Nouveau_Nom)
  contact_sauvegarde()
  ProcedureReturn
EndProcedure

Procedure contact_consulter()
   CloseWindow(#Fenetre_Contact)
  If OpenWindow(#Fenetre_Consulter, 480, 160, 250, 250, "Contact", #PB_Window_SystemMenu )

        StringGadget(#Consulter_Nom, 10, 10, 230, 30, Contact1(selection$)\Nom$) 
        StringGadget(#Consulter_Prenom, 10, 40, 230, 30, Contact1(selection$)\Prenom$)
        StringGadget(#Consulter_Info1, 10, 80, 230, 30, Contact1(selection$)\Info1$)
        StringGadget(#Consulter_Info2, 10, 110, 230, 30, Contact1(selection$)\Info2$)
        StringGadget(#Consulter_Info3, 10, 140, 230, 30, Contact1(selection$)\Info3$)
        StringGadget(#Consulter_Info4, 10, 170, 230, 30, Contact1(selection$)\Info4$)
        ;ButtonGadget(#Bou_Nouveau_enregistrer, 10, 210, 112, 20, "Ok")
        ButtonGadget(#Bou_Consulter_retour, 10, 210, 230, 20, "Retour")
     
        Repeat
          Event = WaitWindowEvent()
          
          Select Event        
            Case #PB_Event_Gadget
              Select EventGadget()
                  Case #Bou_Consulter_retour
                    contact_fenetre(#Fenetre_Consulter)
              EndSelect
       
          EndSelect
        Until Event = #PB_Event_CloseWindow
      EndIf
 EndProcedure
    
 
 Procedure contact_modification()  
   DeleteMapElement(Contact1(), selection$)
   n$ = (GetGadgetText(#Modifier_Nom))
   p$ = (GetGadgetText(#Modifier_Prenom))
   v1$ = (GetGadgetText(#Modifier_Info1))
   v2$ = (GetGadgetText(#Modifier_Info2))
   v3$ = (GetGadgetText(#Modifier_Info3))
   v4$ = (GetGadgetText(#Modifier_Info4))
   
    a$ = n$+" "+p$
  Contact1(a$)\Nom$ = n$
  Contact1(a$)\Prenom$ = p$
  Contact1(a$)\Info1$ = v1$
  Contact1(a$)\Info2$ = v2$
  Contact1(a$)\Info3$ = v3$
  Contact1(a$)\Info4$ = v4$
  
  contact_sauvegarde()
  contact_fenetre(#Fenetre_Modifier)
EndProcedure 

Procedure contact_modifier()
   CloseWindow(#Fenetre_Contact)
  If OpenWindow(#Fenetre_Modifier, 480, 160, 250, 250, "Contact", #PB_Window_SystemMenu )

        StringGadget(#Modifier_Nom, 10, 10, 230, 30, Contact1(selection$)\Nom$) 
        StringGadget(#Modifier_Prenom, 10, 40, 230, 30, Contact1(selection$)\Prenom$)
        StringGadget(#Modifier_Info1, 10, 80, 230, 30, Contact1(selection$)\Info1$)
        StringGadget(#Modifier_Info2, 10, 110, 230, 30, Contact1(selection$)\Info2$)
        StringGadget(#Modifier_Info3, 10, 140, 230, 30, Contact1(selection$)\Info3$)
        StringGadget(#Modifier_Info4, 10, 170, 230, 30, Contact1(selection$)\Info4$)
        ButtonGadget(#Bou_Modifier_Valider, 10, 210, 112, 20, "Modifier")
        ButtonGadget(#Bou_Modifier_Retour, 127, 210, 112, 20, "Annuler")
     
        Repeat
          Event = WaitWindowEvent()          
          Select Event        
            Case #PB_Event_Gadget
              Select EventGadget()
                  Case #Bou_Modifier_Valider
                    contact_modification()
                  Case #Bou_Modifier_Retour
                    contact_fenetre(#Fenetre_Modifier)
              EndSelect
       
         EndSelect
       Until Event = #PB_Event_CloseWindow
  EndIf
EndProcedure

Procedure contact_lister()
  If OpenWindow(#Fenetre_lister, 530, 205, 195, 200, "listing", #PB_Window_SystemMenu )
    ListViewGadget(#Contact_lister_liste,10,10,175,150)
    
    NewList listing1.s()
      ForEach Contact1()
        AddElement(listing1())
        listing1() = (MapKey (Contact1()))
      Next   
      SortList( listing1(), #PB_Sort_Ascending )
      
      ForEach listing1()
        AddGadgetItem(#Contact_lister_liste, -1, listing1())
      Next
         
   ButtonGadget(#Bou_contact_lister_Retour, 10, 165, 175, 25, "Annuler")
     
        Repeat
          Event = WaitWindowEvent()          
          Select Event        
            Case #PB_Event_Gadget
              Select EventGadget()
                Case #Bou_contact_lister_Retour
                  CloseWindow(#Fenetre_lister)
                  ProcedureReturn
                Case #Contact_lister_liste
                      Select EventType()
                        Case #PB_EventType_LeftClick  
                          changement_dans_liste()
                          CloseWindow(#Fenetre_lister)
                          ProcedureReturn
                          
                      EndSelect
             EndSelect
         EndSelect
       Until Event = #PB_Event_CloseWindow
  EndIf
EndProcedure

Procedure contact_supprimer()
  DeleteMapElement(Contact1(), selection$)
  contact_sauvegarde()
  contact_fenetre(#Fenetre_Contact)
EndProcedure

Procedure changement_dans_liste()
  selection$ = (GetGadgetText(#Contact_lister_liste))
  DisableGadget(#Bou_Contact_Consulter, #False)
  DisableGadget(#Bou_Contact_Modifier, #False)
  DisableGadget(#Bou_Contact_Supprimer, #False)
  ProcedureReturn
EndProcedure

Procedure touche_entree()
   Nb.i = GetActiveGadget()
   Select Nb
     Case #Nouveau_Nom
       SetActiveGadget(#Nouveau_Prenom)
     Case #Nouveau_Prenom
       SetActiveGadget(#Nouveau_Info1)
     Case #Nouveau_Info1
       SetActiveGadget(#Nouveau_Info2)
     Case #Nouveau_Info2
       SetActiveGadget(#Nouveau_Info3)
     Case #Nouveau_Info3
       SetActiveGadget(#Nouveau_Info4)
     Case #Nouveau_Info4
       enregistrer_contact_nouveau()     
  EndSelect   
  ProcedureReturn
  
EndProcedure

Procedure contact_nouveau()
  CloseWindow(#Fenetre_Contact)
  If OpenWindow(#Fenetre_Nouveau, 480, 160, 250, 250, "Nouveau Contact", #PB_Window_SystemMenu )

        StringGadget(#Nouveau_Nom, 10, 10, 230, 30, "Nom") 
        StringGadget(#Nouveau_Prenom, 10, 40, 230, 30, "Prenom")
        StringGadget(#Nouveau_Info1, 10, 80, 230, 30, "Info1")
        StringGadget(#Nouveau_Info2, 10, 110, 230, 30, "Info2")
        StringGadget(#Nouveau_Info3, 10, 140, 230, 30, "Info3")
        StringGadget(#Nouveau_Info4, 10, 170, 230, 30, "Info4")
        ButtonGadget(#Bou_Nouveau_enregistrer, 10, 210, 112, 20, "Enregistrer")
        ButtonGadget(#Bou_Nouveau_sortir, 127, 210, 112, 20, "Annuler")
        
        AddKeyboardShortcut(#Fenetre_Nouveau, #PB_Shortcut_Return, #Return)        
        SetActiveGadget(#Nouveau_Nom)
     
        Repeat
          Event = WaitWindowEvent()
       
          Select Event        
            Case #PB_Event_Gadget
              Select EventGadget()
                  Case #Bou_Nouveau_enregistrer 
                    enregistrer_contact_nouveau()
                  Case #Bou_Nouveau_sortir
                    contact_fenetre(#Fenetre_Nouveau)
              EndSelect
                
           Case #PB_Event_Menu
              Select EventMenu()
                  Case #Return
                    touche_entree()
              EndSelect                
       EndSelect
     Until Event = #PB_Event_CloseWindow
   EndIf
EndProcedure

Procedure contact_fenetre(Fen)
  CloseWindow(Fen)
  contact_chargement()
  colorContact = $87C1A3
    If OpenWindow(#Fenetre_Contact, 380, 160, 510, 400, "Répertoire", #PB_Window_SystemMenu )
      If LoadFont(0, "Arial", 13)
        SetGadgetFont(#PB_Default, FontID(0))   ; la police par défaut est remplacée par celle chargée (Arial 16)
      EndIf
      TextGadget(#Lib_Contact_Lib1, 180, 10,130,20,"  REPERTOIRE  ",#PB_Text_Center | #PB_Text_Border)
      SetGadgetColor(#Lib_Contact_Lib1, #PB_Gadget_BackColor, colorContact)
      SetGadgetFont(#PB_Default, #PB_Default)  ; remet la police par défaut originale (standard)
      ButtonGadget(#Bou_Contact_Consulter, 10, 45, 130, 30, "Consulter")
      DisableGadget(#Bou_Contact_Consulter, #True)
      ButtonGadget(#Bou_Contact_Modifier, 10, 77, 130, 30, "Modifier")
      DisableGadget(#Bou_Contact_Modifier, #True)
      ButtonGadget(#Bou_Contact_Supprimer, 10, 109, 130, 30, "Supprimer")
      DisableGadget(#Bou_Contact_Supprimer, #True)
      ButtonGadget(#Bou_Contact_Nouveau, 355, 45, 135, 30, "Nouveau") 
      ButtonGadget(#Bou_Contact_Fermer, 355, 77, 135, 30, "Fermer") 
      ButtonGadget(#Bou_Contact_Neant4, 355, 109, 135, 30, "")
      ContainerGadget(#Contact_Cont2, 50, 150, 400, 30, #PB_Container_Double)
      SetGadgetColor(#Contact_Cont2, #PB_Gadget_BackColor, colorContact) 
      CloseGadgetList() 
      
      ButtonGadget(#Bou_Contact_liste, 150, 45, 195, 20, "listing")
      
      CalendarGadget(#Contact_Calendrier, 100, 190, 300, 170)
    
      Repeat        
        Event = WaitWindowEvent()       
        Select Event
            Case #PB_Event_Gadget
              Select EventGadget()
                  
                  Case #Bou_Contact_Consulter : contact_consulter()
                    
                  Case #Bou_Contact_Modifier : contact_modifier()
                    
                  Case #Bou_Contact_Supprimer : contact_supprimer()
                    
                  Case #Bou_Contact_liste : contact_lister()
                    
                  Case #Bou_Contact_Nouveau
                    contact_nouveau()
                  Case #Bou_Contact_Fermer
                    quitter(#Fenetre_Contact)
                  
            EndSelect
       EndSelect       
     Until Event = #PB_Event_CloseWindow
      
  EndIf
EndProcedure

contact_fenetre(-1)
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Un repertoire ...

Message par Micoute »

Merci pour le partage, fonctionne sur Windows aussi.
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 !
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Un repertoire ...

Message par Marc56 »

Bienvenu Paul,

Joli, mais quelques défauts de conception :wink:
  • Un CloseFile(0) au mauvais endroit et qui échoue si le fichier n’existe pas.
    :arrow: Mettre un CloseFile dans chaque boucle concernée ou utiliser If Isfile(0) : CloseFile(0) : EndIf
  • Il est conseillé d'utiliser aussi des constantes ou des variables pour les handles de fichier plutôt que des numéros
    :arrow: CloseFile(#DataFile)
    Avec un handele numérique, le jour où tu as plusieurs fichiers, tu as vite fais d'oublier le numéro en cours et de fermer/ouvrir/écrire le mauvais fichier.
  • Plusieurs boucles WaitWindowEvent() ce qui n'est pas conseillé
    :arrow: (Si l'utilisateur passe d'une fenêtre à l'autre, la gestion des évènements ne fonctionne plus)
8)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Un repertoire ...

Message par Kwai chang caine »

Pas mal :wink:

Rapidement :

Le bouton Listing manque la majuscule du début
Dans le listing, la croix ne ferme pas la fenêtre et ferme l'application complète si on insiste

Merci du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Un repertoire ...

Message par falsam »

Bienvenu Paul.

■ Je ne serais pas aussi gentil que mes camarades de jeux.
- Ton code souffre de plusieurs soucis de conception et ça se ressent. Il y a quelques bugues.
- La convivialité de ton application n'est pas au rendez vous .

■ Argumentation en vrac.
- Pourquoi décrire trois fenêtres pour la création, modification et consultation ? Une seule suffit.
- Cinq boucles événementielles WaitWindowEvent() ? Une seule suffisait.
- Quand tu es dans ton listing tu peux cliquer sur un espace sans nom et faire modification pour créer un nouveau contact.
- Fenêtre Modifier et Nouveau : Cliquez sur le bouton close ne fonctionne pas si tu clique ensuite sur Annuler la fenêtre ne se ferme pas.
- En création la touche Entrée pour passer de champ de saisie en champ de saisie c'est pas mal. On pourrait croire que sur le dernier champ de saisie, la touche entrée permet de revenir au premier et surprise : Reset du formulaire de saisie et enregistrement automatique de la saisie précédente. Ca peut surprendre quand on ne le sait pas.
- je ne comprends pas ces ProcedureReturn à la fin de la plupart de tes procédures. A mon avis tu pratiques un autre langage :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Un repertoire ...

Message par falsam »

Tu peux simplifié la procédure de sauvegarde/chargement de tes contacts avec les fonctionnalités JSON.

Code : Tout sélectionner

Procedure contact_chargement()
  If LoadJSON(0, filename$)
    ExtractJSONMap(JSONValue(0), Contact1())
  EndIf
EndProcedure

Procedure contact_sauvegarde()
  If CreateJSON(0)
    InsertJSONMap(JSONValue(0), Contact1())
    SaveJSON(0, filename$)
  EndIf
EndProcedure
Avantage: Tu peux modifier ta structure de map sans modifier tes procédures de sauvegarde/chargement de fichier.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Paul
Messages : 8
Inscription : jeu. 07/sept./2017 20:36

Re: Un repertoire ...

Message par Paul »

Merci de vous être donné la peine d'étudier mon travail, ça fait plaisir.
Je vais essayer d'apporter un correctif à mon programme en tenant compte de vos remarques et je reposterai une fois celui ci corrigé.
Commençons par diminuer le nombre de fenêtres ...
Paul
Messages : 8
Inscription : jeu. 07/sept./2017 20:36

Re: Un repertoire ...

Message par Paul »

Nouvelle mouture en tenant compte de vos remarques

Code : Tout sélectionner

;----------------------------------
;  Répertoire ...
;  Paul(PE)
;  08-09-2017
;-------------------------------


Declare contact_fenetre(Fen)
Declare contact_nouveau()
Declare quitter(Fen)
Declare contact_chargement()
Declare enregistrer_contact_nouveau()
Declare changement_dans_liste()
Declare touche_entree()
Declare contact_sauvegarde()
Declare contact_sel ()
Declare contact_supprimer ()
Declare contact_modification()


Enumeration Fenetres
  #Fenetre_Contact
  #Fenetre_Nouveau
  #Fenetre_Sel
EndEnumeration

Enumeration Gadgets  
  #Lib1
  #Bou_Contact_Nouveau
  #Bou_Contact_2
  #Bou_Contact_3
  #Bou_Contact_Fermer
  #Bou_Contact_5
  #Bou_Contact_6
  #Bou_listing
  #liste
  #Cont1
  #Calendrier
  
  #Nouveau_Nom
  #Nouveau_Prenom
  #Nouveau_Info1
  #Nouveau_Info2
  #Nouveau_Info3
  #Nouveau_Info4
  #Bou_Nouveau_enregistrer
  #Bou_Nouveau_sortir
  
  #Sel_Nom
  #Sel_Prenom
  #Sel_Info1
  #Sel_Info2
  #Sel_Info3
  #Sel_Info4
  #Bou_modifier_sel
  #Bou_supprimer_sel
  #Bou_sortir_sel
EndEnumeration

Enumeration
  #Filename
  #Return
EndEnumeration


Structure identite
  Nom$
  Prenom$
  Info1$
  Info2$
  Info3$
  Info4$
EndStructure

Global NewMap Contact1.identite()
Global n$, p$, v1$, v2$, v3$, v4$
Global selection$, filename$
filename$ = "repertoire1.txt"

Procedure quitter(Fen)
  CloseWindow(Fen)
  End
EndProcedure

Procedure contact_chargement()
  If LoadJSON(0, filename$)
    ExtractJSONMap(JSONValue(0), Contact1())
  EndIf
EndProcedure

Procedure contact_sauvegarde()
  If CreateJSON(0)
    InsertJSONMap(JSONValue(0), Contact1())
    SaveJSON(0, filename$)
  EndIf
EndProcedure

Procedure enregistrer_contact_nouveau()
  n$ = (GetGadgetText(#Nouveau_Nom))
  p$ = (GetGadgetText(#Nouveau_Prenom))
  v1$ = (GetGadgetText(#Nouveau_Info1))
  v2$ = (GetGadgetText(#Nouveau_Info2))
  v3$ = (GetGadgetText(#Nouveau_Info3))
  v4$ = (GetGadgetText(#Nouveau_Info4))
  
  SetGadgetText(#Nouveau_Nom, "")
  SetGadgetText(#Nouveau_Prenom, "")
  SetGadgetText(#Nouveau_Info1, "")
  SetGadgetText(#Nouveau_Info2, "")
  SetGadgetText(#Nouveau_Info3, "")
  SetGadgetText(#Nouveau_Info4, "")
  
  a$ = n$+" "+p$
  
  Contact1(a$)\Nom$ = n$
  Contact1(a$)\Prenom$ = p$
  Contact1(a$)\Info1$ = v1$
  Contact1(a$)\Info2$ = v2$
  Contact1(a$)\Info3$ = v3$
  Contact1(a$)\Info4$ = v4$
  SetActiveGadget(#Nouveau_Nom)
  contact_sauvegarde()
EndProcedure

Procedure contact_sel()
   CloseWindow(#Fenetre_Contact)
  If OpenWindow(#Fenetre_Sel, 480, 160, 250, 270, "Contact", #PB_Window_SystemMenu )

        StringGadget(#Sel_Nom, 10, 10, 230, 30, Contact1(selection$)\Nom$) 
        StringGadget(#Sel_Prenom, 10, 40, 230, 30, Contact1(selection$)\Prenom$)
        StringGadget(#Sel_Info1, 10, 80, 230, 30, Contact1(selection$)\Info1$)
        StringGadget(#Sel_Info2, 10, 110, 230, 30, Contact1(selection$)\Info2$)
        StringGadget(#Sel_Info3, 10, 140, 230, 30, Contact1(selection$)\Info3$)
        StringGadget(#Sel_Info4, 10, 170, 230, 30, Contact1(selection$)\Info4$)
        
        ButtonGadget(#Bou_modifier_sel, 10, 210, 113, 20, "Modifier")
        ButtonGadget(#Bou_supprimer_sel, 125, 210, 113, 20, "Supprimer")
        ButtonGadget(#Bou_sortir_sel, 10, 240, 230, 20, "Sortir")        
     
        Repeat
          Event = WaitWindowEvent()
          
          Select Event        
            Case #PB_Event_Gadget
              Select EventGadget()
                  Case #Bou_modifier_sel
                    contact_modification()
                  Case #Bou_supprimer_sel
                    contact_supprimer()
                  Case #Bou_sortir_sel
                    contact_fenetre(#Fenetre_Sel)
              EndSelect
       
          EndSelect
        Until Event = #PB_Event_CloseWindow
      EndIf
 EndProcedure
    
 
 Procedure contact_modification()  
   DeleteMapElement(Contact1(), selection$)
   n$ = (GetGadgetText(#Sel_Nom))
   p$ = (GetGadgetText(#Sel_Prenom))
   v1$ = (GetGadgetText(#Sel_Info1))
   v2$ = (GetGadgetText(#Sel_Info2))
   v3$ = (GetGadgetText(#Sel_Info3))
   v4$ = (GetGadgetText(#Sel_Info4))
   
    a$ = n$+" "+p$
  Contact1(a$)\Nom$ = n$
  Contact1(a$)\Prenom$ = p$
  Contact1(a$)\Info1$ = v1$
  Contact1(a$)\Info2$ = v2$
  Contact1(a$)\Info3$ = v3$
  Contact1(a$)\Info4$ = v4$
  
  contact_sauvegarde()
  contact_fenetre(#Fenetre_Sel)
EndProcedure 


Procedure contact_supprimer()
  DeleteMapElement(Contact1(), selection$)
  contact_sauvegarde()
  contact_fenetre(#Fenetre_Sel)
EndProcedure

Procedure changement_dans_liste()
  selection$ = (GetGadgetText(#liste))
  contact_sel()
EndProcedure

Procedure touche_entree()
   Nb.i = GetActiveGadget()
   Select Nb
     Case #Nouveau_Nom
       SetActiveGadget(#Nouveau_Prenom)
     Case #Nouveau_Prenom
       SetActiveGadget(#Nouveau_Info1)
     Case #Nouveau_Info1
       SetActiveGadget(#Nouveau_Info2)
     Case #Nouveau_Info2
       SetActiveGadget(#Nouveau_Info3)
     Case #Nouveau_Info3
       SetActiveGadget(#Nouveau_Info4)
     Case #Nouveau_Info4
       SetActiveGadget(#Nouveau_Nom)     
  EndSelect   
EndProcedure

Procedure contact_nouveau()
  CloseWindow(#Fenetre_Contact)
  If OpenWindow(#Fenetre_Nouveau, 480, 160, 250, 250, "Nouveau Contact", #PB_Window_SystemMenu )

        StringGadget(#Nouveau_Nom, 10, 10, 230, 30, "Nom") 
        StringGadget(#Nouveau_Prenom, 10, 40, 230, 30, "Prenom")
        StringGadget(#Nouveau_Info1, 10, 80, 230, 30, "Info1")
        StringGadget(#Nouveau_Info2, 10, 110, 230, 30, "Info2")
        StringGadget(#Nouveau_Info3, 10, 140, 230, 30, "Info3")
        StringGadget(#Nouveau_Info4, 10, 170, 230, 30, "Info4")
        ButtonGadget(#Bou_Nouveau_enregistrer, 10, 210, 112, 20, "Enregistrer")
        ButtonGadget(#Bou_Nouveau_sortir, 127, 210, 112, 20, "Retour")
        
        AddKeyboardShortcut(#Fenetre_Nouveau, #PB_Shortcut_Return, #Return)        
        SetActiveGadget(#Nouveau_Nom)
     
        Repeat
          Event = WaitWindowEvent()
       
          Select Event        
            Case #PB_Event_Gadget
              Select EventGadget()
                  Case #Bou_Nouveau_enregistrer 
                    enregistrer_contact_nouveau()
                  Case #Bou_Nouveau_sortir
                    contact_fenetre(#Fenetre_Nouveau)
              EndSelect
                
           Case #PB_Event_Menu
              Select EventMenu()
                  Case #Return
                    touche_entree()
              EndSelect                
       EndSelect
     Until Event = #PB_Event_CloseWindow
   EndIf
EndProcedure

Procedure contact_fenetre(Fen)
  CloseWindow(Fen)
  contact_chargement()
  colorContact = $87C1A3
  test.i = 0
    If OpenWindow(#Fenetre_Contact, 380, 160, 510, 400, "Contacts", #PB_Window_SystemMenu )
      If LoadFont(0, "Arial", 13)
        SetGadgetFont(#PB_Default, FontID(0))   ; la police par défaut est remplacée par celle chargée (Arial 16)
      EndIf
      TextGadget(#Lib1, 180, 10,127,20,"    CONTACTS   ",#PB_Text_Center | #PB_Text_Border)
      SetGadgetColor(#Lib1, #PB_Gadget_BackColor, colorContact)
      SetGadgetFont(#PB_Default, #PB_Default)  ; remet la police par défaut originale (standard)
      ButtonGadget(#Bou_Contact_Nouveau, 10, 45, 130, 30, "Nouveau")
      ButtonGadget(#Bou_Contact_2, 10, 77, 130, 30, "")
      ButtonGadget(#Bou_Contact_3, 10, 110, 130, 30, "")
      
      ButtonGadget(#Bou_Contact_Fermer, 355, 45, 130, 30, "Fermer") 
      ButtonGadget(#Bou_Contact_5, 355, 77, 130, 30, "")
      ButtonGadget(#Bou_Contact_6, 355, 110, 130, 30, "")
      
      ContainerGadget(#Cont1, 50, 150, 400, 30, #PB_Container_Double)
      SetGadgetColor(#Cont1, #PB_Gadget_BackColor, colorContact) 
      CloseGadgetList() 
      
      ButtonGadget(#Bou_listing, 150, 45, 195, 30, "Listing")
      
      ;---------------Liste ---------
      
      ListViewGadget(#liste,162,75,175,100)
      HideGadget(#liste,1)
		    NewList listing1.s()
		    ForEach Contact1()
			    AddElement(listing1())
			    listing1() = (MapKey (Contact1()))
		    Next   
		    SortList( listing1(), #PB_Sort_Ascending )
      
		    ForEach listing1()
			    AddGadgetItem(#liste, -1, listing1())
			  Next
			  
		  ;--------------------------------
		    
      CalendarGadget(#Calendrier, 100, 190, 300, 170)
    
      Repeat        
        Event = WaitWindowEvent()       
        Select Event
          Case #PB_Event_Gadget
            
              Select EventGadget()                  
                    
                  Case #Bou_listing
                      If test = 0
					              HideGadget(#liste,0)
					              test = 1
					            Else 
					              HideGadget(#liste,1)
					              test = 0
					            EndIf
					            
                  Case #Bou_Contact_Nouveau
                    contact_nouveau()
                    
                  Case #Bou_Contact_Fermer
                    quitter(#Fenetre_Contact)
                    
                  Case #liste
                      Select EventType()           
						            Case #PB_EventType_LeftClick  
							            changement_dans_liste()
					            EndSelect					   
              EndSelect
       EndSelect       
     Until Event = #PB_Event_CloseWindow      
  EndIf
EndProcedure

contact_fenetre(-1)
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Un repertoire ...

Message par falsam »

Il y a du mieux bravo :)

Par contre :
- Il y a encore 2 boucles evenementielles WaitWindowEvent()
- Ce bloc d'instruction se répete deux fois

Code : Tout sélectionner

n$ = (GetGadgetText(#Contact_Nom))
      p$ = (GetGadgetText(#Contact_Prenom))
      v1$ = (GetGadgetText(#Contact_Info1))
      v2$ = (GetGadgetText(#Contact_Info2))
      v3$ = (GetGadgetText(#Contact_Info3))
      v4$ = (GetGadgetText(#Contact_Info4))
      
      a$ = n$+" "+p$
      
      Contact1(a$)\Nom$ = n$
      Contact1(a$)\Prenom$ = p$
      Contact1(a$)\Info1$ = v1$
      Contact1(a$)\Info2$ = v2$
      Contact1(a$)\Info3$ = v3$
      Contact1(a$)\Info4$ = v4$
Etant donné que tu sauvegardes à chaque création/modification/suppression, je pense qu'il faudrait intégrer ce bloc d'instruction dans la procédure de sauvegarde.

- Tu as aussi des identifiants redondants #Nouveau_Nom ou #Sel_Nom par exemple c'est la même chose. Idem pour le groupe [#Nouveau_Prenom, #Nouveau_Info1, #Nouveau_Info2, #Nouveau_Info3, #Nouveau_Info4] qui est identique au groupe [#Sel_Prenom, #Sel_Info1, #Sel_Info2, #Sel_Info3, #Sel_Info4]

En tenant compte de ces remarque et de la philosophie dans ta façon de coder, je te propose une première correction de ton code.

Code : Tout sélectionner

;----------------------------------
;  Répertoire ...
;  Paul(PE)
;  08-09-2017
;-------------------------------


Declare contact_fenetre(Fen)
Declare contact_nouveau()
Declare quitter(Fen)
Declare contact_chargement()
Declare enregistrer_contact_nouveau()
Declare changement_dans_liste()
Declare touche_entree()
Declare contact_sauvegarde(Mode)
Declare contact_sel ()
Declare contact_supprimer ()
Declare contact_modification()


Enumeration Fenetres
  #Fenetre_Contact
  #Fenetre_Nouveau
  #Fenetre_Sel
EndEnumeration

Enumeration Gadgets  
  #Lib1
  #Bou_Contact_Nouveau
  #Bou_Contact_2
  #Bou_Contact_3
  #Bou_Contact_Fermer
  #Bou_Contact_5
  #Bou_Contact_6
  #Bou_listing
  #liste
  #Cont1
  #Calendrier
  
  #Contact_Nom
  #Contact_Prenom
  #Contact_Info1
  #Contact_Info2
  #Contact_Info3
  
  #Contact_Info4
  #Bou_Nouveau_enregistrer
  #Bou_Nouveau_sortir  
  #Bou_modifier_sel
  #Bou_supprimer_sel
  #Bou_sortir_sel
EndEnumeration

Enumeration
  #Filename
  #Return
EndEnumeration

Structure identite
  Nom$
  Prenom$
  Info1$
  Info2$
  Info3$
  Info4$
EndStructure

Global NewMap Contact1.identite()
Global n$, p$, v1$, v2$, v3$, v4$
Global selection$, filename$, HideList.b 
filename$ = "repertoire1.txt"

Procedure quitter(Fen)
  CloseWindow(Fen)
  End
EndProcedure

Procedure contact_chargement()
  If LoadJSON(0, filename$)
    ExtractJSONMap(JSONValue(0), Contact1())
  EndIf
EndProcedure

Procedure contact_sauvegarde(Mode)
  ; Mode 
  ; 1 Creation
  ; 2 Modification
  ; 3 Suppression
  Select Mode
    Case 1, 2
      If mode = 2
        DeleteMapElement(Contact1(), selection$)
      EndIf
      
      n$ = (GetGadgetText(#Contact_Nom))
      p$ = (GetGadgetText(#Contact_Prenom))
      v1$ = (GetGadgetText(#Contact_Info1))
      v2$ = (GetGadgetText(#Contact_Info2))
      v3$ = (GetGadgetText(#Contact_Info3))
      v4$ = (GetGadgetText(#Contact_Info4))
      
      a$ = n$+" "+p$
      
      Contact1(a$)\Nom$ = n$
      Contact1(a$)\Prenom$ = p$
      Contact1(a$)\Info1$ = v1$
      Contact1(a$)\Info2$ = v2$
      Contact1(a$)\Info3$ = v3$
      Contact1(a$)\Info4$ = v4$
    Case 3
      DeleteMapElement(Contact1(), selection$)     
  EndSelect
  
  If CreateJSON(0)
    InsertJSONMap(JSONValue(0), Contact1())
    SaveJSON(0, filename$)
  EndIf
EndProcedure

Procedure enregistrer_contact_nouveau()  
  contact_sauvegarde(1)  
  SetGadgetText(#Contact_Nom, "")
  SetGadgetText(#Contact_Prenom, "")
  SetGadgetText(#Contact_Info1, "")
  SetGadgetText(#Contact_Info2, "")
  SetGadgetText(#Contact_Info3, "")
  SetGadgetText(#Contact_Info4, "")
  SetActiveGadget(#Contact_Nom)
EndProcedure

Procedure contact_sel()
  CloseWindow(#Fenetre_Contact)
  If OpenWindow(#Fenetre_Sel, 480, 160, 250, 270, "Contact", #PB_Window_SystemMenu )
    StringGadget(#Contact_Nom, 10, 10, 230, 30, Contact1(selection$)\Nom$) 
    StringGadget(#Contact_Prenom, 10, 40, 230, 30, Contact1(selection$)\Prenom$)
    StringGadget(#Contact_Info1, 10, 80, 230, 30, Contact1(selection$)\Info1$)
    StringGadget(#Contact_Info2, 10, 110, 230, 30, Contact1(selection$)\Info2$)
    StringGadget(#Contact_Info3, 10, 140, 230, 30, Contact1(selection$)\Info3$)
    StringGadget(#Contact_Info4, 10, 170, 230, 30, Contact1(selection$)\Info4$)
    
    ButtonGadget(#Bou_modifier_sel, 10, 210, 113, 20, "Modifier")
    ButtonGadget(#Bou_supprimer_sel, 125, 210, 113, 20, "Supprimer")
    ButtonGadget(#Bou_sortir_sel, 10, 240, 230, 20, "Sortir")            
  EndIf
EndProcedure

Procedure contact_modification()    
  contact_sauvegarde(2)
  contact_fenetre(#Fenetre_Sel)
EndProcedure

Procedure contact_supprimer()
  DeleteMapElement(Contact1(), selection$)
  contact_sauvegarde(3)
  contact_fenetre(#Fenetre_Sel)
EndProcedure

Procedure changement_dans_liste()
  selection$ = (GetGadgetText(#liste))
  HideList = 0
  contact_sel()
EndProcedure

Procedure touche_entree()
  Nb.i = GetActiveGadget()
  Select Nb
    Case #Contact_Nom
      SetActiveGadget(#Contact_Prenom)
    Case #Contact_Prenom
      SetActiveGadget(#Contact_Info1)
    Case #Contact_Info1
      SetActiveGadget(#Contact_Info2)
    Case #Contact_Info2
      SetActiveGadget(#Contact_Info3)
    Case #Contact_Info3
      SetActiveGadget(#Contact_Info4)
    Case #Contact_Info4
      SetActiveGadget(#Contact_Nom)     
  EndSelect   
EndProcedure

Procedure contact_nouveau()
  CloseWindow(#Fenetre_Contact)
  If OpenWindow(#Fenetre_Nouveau, 480, 160, 250, 250, "Nouveau Contact", #PB_Window_SystemMenu )
    
    StringGadget(#Contact_Nom, 10, 10, 230, 30, "Nom") 
    StringGadget(#Contact_Prenom, 10, 40, 230, 30, "Prenom")
    StringGadget(#Contact_Info1, 10, 80, 230, 30, "Info1")
    StringGadget(#Contact_Info2, 10, 110, 230, 30, "Info2")
    StringGadget(#Contact_Info3, 10, 140, 230, 30, "Info3")
    StringGadget(#Contact_Info4, 10, 170, 230, 30, "Info4")
    ButtonGadget(#Bou_Nouveau_enregistrer, 10, 210, 112, 20, "Enregistrer")
    ButtonGadget(#Bou_Nouveau_sortir, 127, 210, 112, 20, "Retour")
    
    AddKeyboardShortcut(#Fenetre_Nouveau, #PB_Shortcut_Return, #Return)        
    SetActiveGadget(#Contact_Nom)
  EndIf
EndProcedure

Procedure contact_fenetre(Fen)
  CloseWindow(Fen)
  contact_chargement()
  colorContact = $87C1A3
  If OpenWindow(#Fenetre_Contact, 380, 160, 510, 400, "Contacts", #PB_Window_SystemMenu )
    If LoadFont(0, "Arial", 13)
      SetGadgetFont(#PB_Default, FontID(0))   ; la police par défaut est remplacée par celle chargée (Arial 16)
    EndIf
    TextGadget(#Lib1, 180, 10,127,20,"    CONTACTS   ",#PB_Text_Center | #PB_Text_Border)
    SetGadgetColor(#Lib1, #PB_Gadget_BackColor, colorContact)
    SetGadgetFont(#PB_Default, #PB_Default)  ; remet la police par défaut originale (standard)
    ButtonGadget(#Bou_Contact_Nouveau, 10, 45, 130, 30, "Nouveau")
    ButtonGadget(#Bou_Contact_2, 10, 77, 130, 30, "")
    ButtonGadget(#Bou_Contact_3, 10, 110, 130, 30, "")
    
    ButtonGadget(#Bou_Contact_Fermer, 355, 45, 130, 30, "Fermer") 
    ButtonGadget(#Bou_Contact_5, 355, 77, 130, 30, "")
    ButtonGadget(#Bou_Contact_6, 355, 110, 130, 30, "")
    
    ContainerGadget(#Cont1, 50, 150, 400, 30, #PB_Container_Double)
    SetGadgetColor(#Cont1, #PB_Gadget_BackColor, colorContact) 
    CloseGadgetList() 
    
    ButtonGadget(#Bou_listing, 150, 45, 195, 30, "Listing")
    
    ;---------------Liste ---------
    
    ListViewGadget(#liste,162,75,175,100)
    HideGadget(#liste,1)
    NewList listing1.s()
    ForEach Contact1()
      AddElement(listing1())
      listing1() = (MapKey (Contact1()))
    Next   
    SortList( listing1(), #PB_Sort_Ascending )
    
    ForEach listing1()
      AddGadgetItem(#liste, -1, listing1())
    Next
    
    ;--------------------------------
    
    CalendarGadget(#Calendrier, 100, 190, 300, 170)  
  EndIf
EndProcedure

contact_fenetre(-1)

;Une seule boucle evenementielle
Repeat        
  Event = WaitWindowEvent()       
  Select Event
      
    Case #PB_Event_Gadget ;Evenemeent Gadgets         
      Select EventGadget()                  
        Case #Bou_listing
          If HideList = 0
            HideGadget(#liste,0)
            HideList = 1
          Else 
            HideGadget(#liste,1)
            HideList = 0
          EndIf
          
        Case #Bou_Contact_Nouveau
          contact_nouveau()
          
        Case #Bou_Contact_Fermer
          quitter(#Fenetre_Contact)
          
        Case #liste
          Select EventType()           
            Case #PB_EventType_LeftClick  
              changement_dans_liste()
          EndSelect    
          
        Case #Bou_modifier_sel
          contact_modification()
          
        Case #Bou_supprimer_sel
          contact_supprimer()
          
        Case #Bou_Nouveau_enregistrer 
          enregistrer_contact_nouveau()
          
        Case #Bou_Nouveau_sortir
          contact_fenetre(#Fenetre_Nouveau)
          
        Case #Bou_sortir_sel
          contact_fenetre(#Fenetre_Sel)             
      EndSelect
      
    Case #PB_Event_CloseWindow ;Evenements Fenetres
      Select EventWindow()
        Case #Fenetre_Contact
          End
          
        Case #Fenetre_Nouveau
          CloseWindow(#Fenetre_Nouveau)
          contact_fenetre(-1)
          
        Case #Fenetre_Sel
          CloseWindow(#Fenetre_Sel)
          contact_fenetre(-1)
      EndSelect
      
  EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Paul
Messages : 8
Inscription : jeu. 07/sept./2017 20:36

Re: Un repertoire ...

Message par Paul »

Merci à Falsam pour la réponse pratique qu'il a fournie au problème qu'il avait soulevé, ainsi que Marc56 et KCC d'ailleurs, autour de la boucle évenementielle. Cela m'a permis de comprendre et ... de pouvoir y remédier.
J'ignorais qu'il était possible d'extraire la boucle évenementielle du "if" de la fenêtre et par delà ... de n'en créer qu'une pour toute les fenêtres.
Encore merci à tous.
Répondre