Gestionnaire de contacts (Simplifié)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Gestionnaire de contacts (Simplifié)

Message 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
Dernière modification par falsam le mar. 19/mai/2015 15:17, modifié 1 fois.
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
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Gestionnaire de contacts (Simplifié)

Message par Kwai chang caine »

Marche bien
Merci 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Gestionnaire de contacts (Simplifié)

Message 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 ! ;)
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Gestionnaire de contacts (Simplifié)

Message par majikeyric »

Je n'avais pas envisagé cette utilisation du format JSON. ça permet de se passer d'une BDD SQLite ! :)

Merci du partage!
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Gestionnaire de contacts (Simplifié)

Message par Micoute »

Du beau et bon travail comme de bien entendu !
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
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Gestionnaire de contacts (Simplifié)

Message par Ar-S »

C'est excellent !
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Gestionnaire de contacts (Simplifié)

Message 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
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
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Gestionnaire de contacts (Simplifié)

Message 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 ?
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Gestionnaire de contacts (Simplifié)

Message 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
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Gestionnaire de contacts (Simplifié)

Message 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.
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
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Gestionnaire de contacts (Simplifié)

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Gestionnaire de contacts (Simplifié)

Message 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:
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Gestionnaire de contacts (Simplifié)

Message par microdevweb »

@Marc56,

Merci du conseil
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Gestionnaire de contacts (Simplifié)

Message 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)
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
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Gestionnaire de contacts (Simplifié)

Message par Micoute »

Merci falsam pour cette correction.
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 !
Répondre