Tableur

Programmation d'applications complexes
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Tableur

Message par Micoute »

Bonjour à tous,

je voulais apprendre à sauvegarder autrement qu'en JSON, alors j'ai eu l'idée de créer un petit tableur tout simple et de sauvegarder les donnes dans un fichier "Tableur.csv".

Code : Tout sélectionner

; Exemple de création d'une interface utilisateur avec une grille et saisie de données

Enumeration fenetres
  #Fenetre
EndEnumeration
Enumeration Gadgets
  #Grille
  #Champ_Nom
  #Champ_Prenom
  #Champ_Age
  #Btn_Charger
  #Btn_Ajouter
  #Btn_Modifier
  #Btn_Supprimer
  #Btn_Sauvegarder
EndEnumeration
Enumeration Fichiers
  #Fichier
EndEnumeration

Global Evenement
Global.s Fichier.s = "Tableur.csv"

Declare Programme_principal()
Declare Charger()
Declare Ajouter()
Declare Modifier()
Declare Supprimer()
Declare Sauvegarder()
Declare RemplirChamps()

Programme_principal()

Procedure Programme_principal()
If OpenWindow(#Fenetre, 100, 100, 540, 380, UCase("Tableur avec interface par Micoute"), #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ; Création de la grille
  ListIconGadget(#Grille, 10, 10, 410, 270, "Nom", 150)
  AddGadgetColumn(#Grille, 1, "Prénom", 150)
  AddGadgetColumn(#Grille, 2, "Âge", 100)
  
  ; Création des champs de saisie
  TextGadget(#PB_Any, 10, 290, 100, 20, "Nom :")
  StringGadget(#Champ_Nom, 120, 290, 150, 20, "")
  
  TextGadget(#PB_Any, 10, 320, 100, 20, "Prénom :")
  StringGadget(#Champ_Prenom, 120, 320, 150, 20, "")
  
  TextGadget(#PB_Any, 10, 350, 100, 20, "Âge :")
  StringGadget(#Champ_Age, 120, 350, 150, 20, "")
  
  ; Création des boutons
  ButtonGadget(#Btn_Charger, 430, 10, 100, 30, "Charger")
  ButtonGadget(#Btn_Ajouter, 430, 70, 100, 30, "Ajouter")
  ButtonGadget(#Btn_Modifier, 430, 130, 100, 30, "Modifier")
  ButtonGadget(#Btn_Supprimer, 430, 190, 100, 30, "Supprimer")
  ButtonGadget(#Btn_Sauvegarder, 430, 250, 100, 30, "Sauvegarder")
  
  
  Repeat
    Evenement = WaitWindowEvent()
    
    Select Evenement
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #Btn_Charger
            Charger()
            
          Case #Btn_Ajouter
            Ajouter()
            
          Case #Btn_Modifier
            Modifier()
            
          Case #Btn_Supprimer
            Supprimer()
            
          Case #Grille
            RemplirChamps()
            
          Case #Btn_Sauvegarder
            Sauvegarder()
        EndSelect
      Case #PB_Event_CloseWindow
        Select EventWindow()
          Case #Fenetre
            CloseWindow(#Fenetre)
            End
        EndSelect
    EndSelect
  Until Event = #PB_Event_CloseWindow
EndIf
EndProcedure

Procedure Charger()
  If ReadFile(#Fichier, Fichier)
    ClearGadgetItems(#Grille)  ; Efface les anciennes données de la grille
    While Eof(#Fichier) = 0
      Ligne$ = ReadString(#Fichier)
      If Ligne$ <> "" And FindString(Ligne$, "Nom,Prénom,Âge") = 0  ; Ignore la ligne des en-têtes
        Elements$ = StringField(Ligne$, 1, ",") + #LF$ + StringField(Ligne$, 2, ",") + #LF$ + StringField(Ligne$, 3, ",")
        AddGadgetItem(#Grille, -1, Elements$)
      EndIf
    Wend
    CloseFile(#Fichier)
  Else
    MessageRequester("Information", "Impossible d'ouvrir le fichier !")
  EndIf
EndProcedure

  Procedure Ajouter()
    Nom$ = GetGadgetText(#Champ_Nom)
    Prenom$ = GetGadgetText(#Champ_Prenom)
    Age$ = GetGadgetText(#Champ_Age)
    AddGadgetItem(#Grille, -1, Nom$ + #LF$ + Prenom$ + #LF$ + Age$)
    SetGadgetText(#Champ_Nom, "")
    SetGadgetText(#Champ_Prenom, "")
    SetGadgetText(#Champ_Age, "")
  EndProcedure
  
  Procedure Modifier()
    LigneChoisie = GetGadgetState(#Grille)
    If LigneChoisie <> -1
      SetGadgetItemText(#Grille, LigneChoisie, GetGadgetText(#Champ_Nom), 0)
      SetGadgetItemText(#Grille, LigneChoisie, GetGadgetText(#Champ_Prenom), 1)
      SetGadgetItemText(#Grille, LigneChoisie, GetGadgetText(#Champ_Age), 2)
      SetGadgetText(#Champ_Nom, "")
      SetGadgetText(#Champ_Prenom, "")
      SetGadgetText(#Champ_Age, "")
    EndIf
  EndProcedure
  
  Procedure Supprimer()
    RemoveGadgetItem(#Grille, GetGadgetState(#Grille))
  EndProcedure
  
  Procedure RemplirChamps()
  LigneChoisie = GetGadgetState(#Grille)
  If LigneChoisie <> -1
    SetGadgetText(#Champ_Nom, GetGadgetItemText(#Grille, LigneChoisie, 0))
    SetGadgetText(#Champ_Prenom, GetGadgetItemText(#Grille, LigneChoisie, 1))
    SetGadgetText(#Champ_Age, GetGadgetItemText(#Grille, LigneChoisie, 2))
  EndIf
EndProcedure
  
  Procedure Sauvegarder()
    If Fichier
      If CreateFile(#Fichier, Fichier)
        WriteStringN(#Fichier, "Nom,Prénom,Âge")
        For i = 0 To CountGadgetItems(#Grille) - 1
          Ligne$ = GetGadgetItemText(#Grille, i, 0) + "," + GetGadgetItemText(#Grille, i, 1) + "," + GetGadgetItemText(#Grille, i, 2)
          WriteStringN(0, Ligne$)
        Next i
        CloseFile(#Fichier)
        MessageRequester("Info", "Le fichier a été sauvegardé avec succès.")
      Else
        MessageRequester("Erreur", "Impossible de sauvegarder le fichier.")
      EndIf
    EndIf
  EndProcedure
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Tableur

Message par Jacobus »

Salut Micoute,
sympa ton tableur, simple et efficace.
Juste un truc, tu devrais ajouter le Flag #PB_Ascii lors de la création et la lecture du fichier pour éviter les problèmes d'accents :
...If CreateFile(#Fichier, Fichier,#PB_Ascii)...
...If ReadFile(#Fichier, Fichier,#PB_Ascii)...
Pour ce type de fichier ça va bien.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
plabouro472
Messages : 39
Inscription : sam. 23/juil./2022 10:17

Re: Tableur

Message par plabouro472 »

Très bon travail, le code est soigné et bien clair. Il peut facilement être adapté à nos besoins.
Il peut servir de base dans une application sans aucun problème.
Bravo et merci pour le partage.
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Tableur

Message par Micoute »

Jacobus a écrit : lun. 24/févr./2025 10:20 tu devrais ajouter le Flag #PB_Ascii lors de la création et la lecture du fichier pour éviter les problèmes d'accents :
...If CreateFile(#Fichier, Fichier,#PB_Ascii)...
...If ReadFile(#Fichier, Fichier,#PB_Ascii)...
Pour ce type de fichier ça va bien.
C'est un bon conseil et je vais l'appliquer.

Merci Jacobus.
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre