Page 1 sur 1

Gestionnaire de contacts (Simplifié)

Publié : lun. 18/mai/2015 16:30
par falsam
Une base pour un gestionnaire de contacts (Création, Modification, Suppression) avec une sauvegarde dans un fichier JSON.

Caractéristiques principales.
-Chaque contact se compose d'un nom et d'un téléphone. A vous d'ajouter ce que vous voulez.
-Le fichier JSON contenant les contacts est lu et transféré dans une liste chaînée à l'ouverture de l'application.
-La sauvegarde des contacts est exécutée à la fermeture de l'application.

- 3 Boutons
     Nouveau pour la saisie d'un nouveau contact. La plupart du temps il ne sert à rien.
     Ajouter/Modifier pour ajouter ou mettre à jour un contact
     Supprimer pour .... supprimer un contact.

Avantage du fichier JSON: Si vous modifiez la structure de la liste chaînée en ajoutant un email ou une adresse de contact, vous n'avez pas besoin de modifier la procédure de sauvegarde.

Enregistrer ce code dans un dossier avant de l'utiliser.

Code : Tout sélectionner

;Gestionnaire de contacts
;
;Contributor : falsam
;PureBasic   : 5.30 minimum
;

Enumeration
  #JSONFile
EndEnumeration

Enumeration Window
  #mf             ;Fenetre 
EndEnumeration

Enumeration Gadget
  #mfName         ;Saisie du nom du contact
  #mfTel          ;Saisie du téléphone d'un contact
  
  #mfContacts     ;Liste des contacts
  
  #mfContactNew   ;Bouton nouveau contact
  #mfContactUpdate;Bouton ajout ou mise à jour d'un contact 
  #MfContactDelete;Bouton suppression d'un contact
EndEnumeration

;Structure d'un contact
Structure Contact
  Name.s
  Tel.s
EndStructure

;Création d'une liste vierge des contacts
Global NewList Contacts.Contact()

;Declaration des traitements
Declare MainFormShow()  ;Ouverture de l'application
Declare ContactsLoad()  ;Chargement des contacts existants
Declare ContactEvent()  ;Gestionnaire de controle de la saisie
Declare ContactNew()    ;Nouveau contact
Declare ContactSelect() ;Un contact est sélectionné dansla liste
Declare ContactDelete() ;Suppression d'un contact
Declare ContactUpdate() ;Gestionnaire de mise à jour des contacts 
Declare ContactsSave()  ;Sauveagarde des contacts

MainFormShow()

;Ouverture de l'application
Procedure MainFormShow()
  OpenWindow(#mf, 0, 0, 500, 400, "Mes Contacts", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  TextGadget(#PB_Any, 20, 23, 100, 22, "Nom")
  StringGadget(#mfName, 120, 20, 250, 24, "")
  
  TextGadget(#PB_Any, 20, 53, 100, 22, "Téléphone")
  StringGadget(#mfTel, 120, 50, 250, 24, "")
  
  ListIconGadget(#mfContacts, 20, 120, 460, 250, "Nom", 150, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(#MfContacts, 1, "Téléphone", 150)
  
  ButtonGadget(#mfContactNew, 400, 20, 80, 24, "Nouveau")
  ButtonGadget(#mfContactUpdate, 400, 50, 80, 24, "Ajouter")
  ButtonGadget(#MfContactDelete, 400, 80, 80, 24, "Supprimer")  
  
  ;Control de la saisie (Le nom est obligatoire)
  BindGadgetEvent(#mfName, @ContactEvent())
  
  ;Mise en place d'un nouveau contact
  BindGadgetEvent(#mfContactNew, @ContactNew()) 
  
  ;Un contact est selectionné dans la liste
  BindGadgetEvent(#mfContacts, @ContactSelect())
  
  ;Ajout ou modification d'un contact
  BindGadgetEvent(#mfContactUpdate, @ContactUpdate()) 
  
  ;Supression d'un contact
  BindGadgetEvent(#MfContactDelete, @ContactDelete()) 
  
  ;Fermeture de l'application et sauvegarde des contacts
  BindEvent(#PB_Event_CloseWindow, @ContactsSave()) 
  
  ;Lectures des contacts 
  ContactsLoad()
  
  ;L'application est préte pour la saisie d'un contact
  ContactNew()
  
  Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
EndProcedure

;Chargement des contacts existants
Procedure ContactsLoad()
  If ReadFile(#JSONFile, "contacts.json")
    CloseFile(#JSONFile)
    
    ;Lecture du fichier JSON
    LoadJSON(#JSONFile, "contacts.json", #PB_JSON_NoCase)

    ;Extraction de la chaine JSOn vers la liste chainée Contacts
    ExtractJSONList(JSONValue(#JSONFile), Contacts())  
    
    ;Affichage de la liste des contacts
    ForEach(Contacts())
      With Contacts()
        AddGadgetItem(#mfContacts, -1, \Name + Chr(10) + \Tel)
        SetGadgetItemData(#mfContacts, CountGadgetItems(#mfContacts)-1, ListIndex(Contacts()))
      EndWith                
    Next
  
  EndIf
EndProcedure

;Gestionnaire de controle de la saisie
Procedure ContactEvent()
  Protected Event = EventType()
  
  Select Event
    Case #PB_EventType_Change
      If Trim(GetGadgetText(#mfName)) <> ""
        DisableGadget(#mfContactNew, #False)
        DisableGadget(#mfContactUpdate, #False)
      Else
        DisableGadget(#mfContactNew, #True)
        DisableGadget(#mfContactUpdate, #True)
      EndIf         
  EndSelect
  
EndProcedure

;Nouveau contact (Reset des champs de saisie)
Procedure ContactNew()
  SetWindowData(#mf, 0) ;C'est une création
  
  SetGadgetText(#mfName, "")
  SetGadgetText(#mfTel, "")
  
  DisableGadget(#mfContactNew, #True)
  DisableGadget(#mfContactUpdate, #True)
  DisableGadget(#MfContactDelete, #True)
  
  SetGadgetText(#mfContactUpdate, "Ajouter")
  SetActiveGadget(#mfName)
EndProcedure

;Un contact est sélectionné dans la liste
Procedure ContactSelect()  
  Protected Item = GetGadgetState(#MfContacts)
  
  If Item <> -1
    SelectElement(Contacts(), GetGadgetItemData(#mfContacts, Item))
    With Contacts()
      SetGadgetText(#mfName, \Name)
      SetGadgetText(#mftel, \Tel)
    EndWith  
  EndIf
  
  ;C'est une modification de contact
  SetWindowData(#mf, 1) 
  
  DisableGadget(#mfContactNew, #False)
  DisableGadget(#mfContactUpdate, #False)
  DisableGadget(#MfContactDelete, #False)
  
  SetGadgetText(#mfContactUpdate, "Modifier")
  SetActiveGadget(#mfName)
EndProcedure

;Suppression d'un contact
Procedure ContactDelete()
  If MessageRequester("Information", "Etes vous certain de supprimer un contact ?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
    SetWindowData(#mf, 3) ;C'est une suppression
    ContactUpdate()
  EndIf
EndProcedure

;Gestionnaire de mise à jour des contacts 
Procedure ContactUpdate()
  Protected Name.s = GetGadgetText(#mfName)
  Protected Tel.s  = GetGadgetText(#mfTel)
  
  Select GetWindowData(#mf)
    Case 0 ;Création d'un contact
      AddElement(Contacts())
      With Contacts()
        \Name = Name
        \Tel = Tel
        AddGadgetItem(#mfContacts, -1, \Name + Chr(10) + \Tel)
        SetGadgetItemData(#mfContacts, CountGadgetItems(#mfContacts)-1, ListIndex(Contacts()))
      EndWith
      
    Case 1 ;Modification d'un contact
      With Contacts()
        \Name = Name
        \Tel = Tel
        SetGadgetItemText(#mfContacts, ListIndex(Contacts()), \Name, 0)
        SetGadgetItemText(#mfContacts, ListIndex(Contacts()), \Tel, 1)        
      EndWith
      ContactNew()
      
    Case 3 ;Suppression d'un contact
      RemoveGadgetItem(#mfContacts, ListIndex(Contacts()))
      DeleteElement(Contacts())
      
      ;Mise à jour des indexs de liaisons ListIconGadget <-> Contacts()
      ForEach(Contacts())
        SetGadgetItemData(#mfContacts, ListIndex(Contacts()), ListIndex(Contacts()))
      Next
      
  EndSelect
  
EndProcedure

;Sauvegarde des contacts à la fermeture de l'application
Procedure ContactsSave()
  
  ;Création d'un objet JSON
  CreateJSON(#JSONFile)
  
  ;Insertion de la liste chainée "Contacts" dans l'objet JSON
  InsertJSONList(JSONValue(#JSONFile), Contacts())

  ;Sauvegarde du fichier
  SaveJSON(#JSONFile, "contacts.json")
  
EndProcedure

Re: Gestionnaire de contacts (Simplifié)

Publié : lun. 18/mai/2015 19:16
par Kwai chang caine
Marche bien
Merci 8)

Re: Gestionnaire de contacts (Simplifié)

Publié : lun. 18/mai/2015 20:00
par G-Rom
Je ne connaissais pas le format JSON , du moins sont utilité , très facile d'enregistré et de chargé des données en vrac du coup. pas besoin de faire des loaders / savers de dingue pour des datas perso.

Merci de m'avoir fait découvrir cela ! ;)

Re: Gestionnaire de contacts (Simplifié)

Publié : lun. 18/mai/2015 21:48
par majikeyric
Je n'avais pas envisagé cette utilisation du format JSON. ça permet de se passer d'une BDD SQLite ! :)

Merci du partage!

Re: Gestionnaire de contacts (Simplifié)

Publié : mar. 19/mai/2015 7:51
par Micoute
Du beau et bon travail comme de bien entendu !

Re: Gestionnaire de contacts (Simplifié)

Publié : mar. 19/mai/2015 14:13
par Ar-S
C'est excellent !

Re: Gestionnaire de contacts (Simplifié)

Publié : mar. 19/mai/2015 15:52
par falsam
@G-Rom: La prise en charge native du format JSON est apparu avec la version 5.30 de PureBasic. C'est un format qui pas mal utilisé avec Php et JavaScrip par exemple.

J'en ai un peu parler dans ce sujet JSON (JavaScript Object Notation)
:arrow: http://www.purebasic.fr/french/viewtopi ... 65#p163465

Re: Gestionnaire de contacts (Simplifié)

Publié : jeu. 21/mai/2015 9:38
par Kwai chang caine
majikeyric a écrit :Je n'avais pas envisagé cette utilisation du format JSON. ça permet de se passer d'une BDD SQLite ! :)
Bonne idée, mais est ce que ce serait aussi rapide ? et je pense que cela doit dépendre de la taille du fichier ?

Re: Gestionnaire de contacts (Simplifié)

Publié : jeu. 18/juin/2015 13:22
par Anonyme2
Salut falsam,

excellent code.
Merci pour le partage, je suis en train de l'adapter pour la gestion de ma bibliothèque. :D

Re: Gestionnaire de contacts (Simplifié)

Publié : jeu. 18/juin/2015 13:30
par falsam
Denis a écrit :Merci pour le partage, je suis en train de l'adapter pour la gestion de ma bibliothèque. :D
Avoir inclus la gestion des fichiers JSON à PureBasic est une excellente chose car ce type de fichier fonctionne parfaitement avec d'autres langages et je pense en particulier aux applications web avec JavaScript et Php.

Re: Gestionnaire de contacts (Simplifié)

Publié : jeu. 18/juin/2015 16:17
par microdevweb
Dans le cadre de mon projet "Euréka" j'utilise json et c'est vraiment terrible. Je n'ai besoins que d'un peux plus de 60 lignes de code alors que sans... 10 fois plus je penses. En plus même si mes structures évoluent je n'ai rien à changé, il sauve automatiquement (le seul problème qui n'en est pas vraiment un dans mon cas est quel le fichier est éditable et visible en clair avec n'importe quel éditeur)

Code : Tout sélectionner

Procedure LoadProjectFile(file$)
      Protected myJson
      ;ClearStructure(myProject)
      myJson=LoadJSON(#PB_Any,file$,#PB_JSON_NoCase)
      If myJson=0
            MessageRequester(#Title,"Load Json Error of line "+JSONErrorLine()+" : "+JSONErrorPosition())
            ProcedureReturn #False
      EndIf
      ExtractJSONStructure(JSONValue(myJson),@myProject,project)        
      gBackupFile$=file$
      MakeTree()
      ProcedureReturn #True
EndProcedure
Procedure OpenFileProject()
      Protected file$,filter$
      Dim ms$(0,#NbLg)
      ms$(0,#Fr)="Choisissez le projet à ouvrir"
      ms$(0,#En)="Select the projet to open"
      filter$="Euréka file |*.erk"
      file$=OpenFileRequester(ms$(0,gLg),"",filter$,1)
      If file$<>""
            LoadProjectFile(file$)
      EndIf
EndProcedure
Procedure SaveFileProject()
      Protected file$
      Protected Filter$="Euréka file |*.erk"
      Protected myJson,myFile
      Dim ms$(0,#NbLg)
      Dim er$(1,#NbLg)
      er$(0,#Fr)="Erreur Json"
      er$(0,#En)="Json error"
      er$(1,#Fr)="Impossible de créer le fichier de sauvegarde"
      er$(1,#En)="Can not create the backup file"
      ms$(0,#Fr)="Sauvegarde du projet"
      ms$(0,#En)="Boackup of project"
      ;Pas encore sauvegarde et pas d'ouverture de projet
      If gBackupFile$=""
            file$=SaveFileRequester(ms$(0,gLg),"my_project.erk",Filter$,1)
            If file$="":ProcedureReturn :EndIf
            ;Ajout de l'extention si nécessaire
            If Right(file$,4)<>".erk"
                  file$+".erk"
            EndIf
            gBackupFile$=file$
      EndIf
      myJson=CreateJSON(#PB_Any)
      If myJson=0
            MessageRequester(#Title,er$(0,gLg))
            gBackupFile$=""
            ProcedureReturn #False
      EndIf
      InsertJSONStructure(JSONValue(myJson),@myProject,project)
      If SaveJSON(myJson,gBackupFile$,#PB_JSON_PrettyPrint)=0
            MessageRequester(#Title,er$(1,gLg))
            gBackupFile$=""
            ProcedureReturn #False
      EndIf
      ;Signale que c'est sauver
      Tb::SetImageButtonSate(#Menu,#O_Index,#G_Project,#Bto_SaveProject,#False)
      Tb::Show(#Menu)
      ProcedureReturn #True
EndProcedure

Re: Gestionnaire de contacts (Simplifié)

Publié : jeu. 18/juin/2015 16:27
par Marc56
microdevweb a écrit :...le seul problème qui n'en est pas vraiment un dans mon cas est quel le fichier est éditable et visible en clair avec n'importe quel éditeur)...
Tout est dans la boite avec PB: encode tes données avant enregistrement et décode-les au chargement
http://www.purebasic.com/french/documen ... index.html

Non, le seul pb d'enregistrer au forma JSON c'est qu'à l'écriture, c'est du tout ou rien: s'il y a un problème, le fichier ne sera pas écrit contrairement au système des INI (prefs) ou d'une base de données SQL.

Donc format JSON: faire un backup du fichier initial avant enregistrement :)

:wink:

Re: Gestionnaire de contacts (Simplifié)

Publié : jeu. 18/juin/2015 16:39
par microdevweb
@Marc56,

Merci du conseil

Re: Gestionnaire de contacts (Simplifié)

Publié : ven. 06/mai/2016 23:27
par falsam
Une erreur dans mon code.
Quand on modifie le téléphone, la réactualisation n'est pas correct dans le listicongadget.
Cette erreur ne compromet pas la sauvegarde finale.

J'ai corrigé la procédure ContactUpdate() en remplaçant

Code : Tout sélectionner

AddGadgetItem(#mfContacts, -1, \Name + Chr(10) + \Tel)
Par

Code : Tout sélectionner

SetGadgetItemText(#mfContacts, ListIndex(Contacts()), \Name, 0)
SetGadgetItemText(#mfContacts, ListIndex(Contacts()), \Tel, 1)

Re: Gestionnaire de contacts (Simplifié)

Publié : sam. 07/mai/2016 6:02
par Micoute
Merci falsam pour cette correction.