Comment sauvegarder le contenu d'un éditeur ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Comment sauvegarder le contenu d'un éditeur ?

Message par Micoute »

Bonjour à tous,

Il y a un moment que je n'avais programmé un logiciel de bureautique et je m'aperçois que j'ai quelques lacunes, voici mon problème :
je souhaiterais afficher mes rendez-vous courants dans un éditeur sans utiliser de structure qui me permettrait de sauvegarder en Json, car ces textes ne seront pas formattés.

Peut-être au contraire que je devrais avoir une structure, mais je préfère vous demander votre aide qui me sera précieuse et je vous en remercie tous.

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Fenêtres
Enumeration
  #Fenetre_principale
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Edt
EndEnumeration
;}
;{ Polices
Enumeration
  #Police
EndEnumeration
;}
;}
;{ Variables
Global Evenement
;}
;{ Chargement et assignation des polices
LoadFont(#Police, "DejaVu Sans Mono", 10, #PB_Font_Bold)
SetGadgetFont(#PB_Default, FontID(#Police))
;}
;{ Déclaration des procédures
Declare Programme_principal()
Declare Redimentionner()
Declare Quitter()
;}
;{ Lancement du programme principal
Programme_principal()
;}
Procedure Programme_principal()
  If OpenWindow(#Fenetre_principale, 450, 200, 400, 400, "Mes rendez-vous", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget)
    EditorGadget(#Edt, 10, 10, 380, 380)
    
    ;{ Evènements liés
    ; Redimensionnement de la fenêtre
    BindEvent(#PB_Event_SizeWindow, @Redimentionner())
    ; Fermeture de la fenêtre
    BindEvent(#PB_Event_CloseWindow, @Quitter())
    ;}
    Repeat
      Evenement = WaitWindowEvent()
    ForEver
  EndIf
EndProcedure
Procedure Redimentionner()
  ResizeGadget(#Edt, #PB_Ignore, #PB_Ignore, WindowWidth(#Fenetre_principale) - 20, WindowHeight(#Fenetre_principale) - 20)
EndProcedure
Procedure Quitter()
  CloseWindow(#Fenetre_principale)
  End
EndProcedure
Dernière modification par Micoute le dim. 05/nov./2023 16:23, modifié 1 fois.
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 !
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Comment sauvegarder le contenu d'une éditeur ?

Message par Marc56 »

Bonjour Micoute,

GetGadgetText(#Edt) permet de récupérer le contenu du gadget.
Il suffit ensuite de le sauvegarder dans un fichier texte.
(si c'est juste ce que tu cherche à faire)

Ton programme une fois modifié (voir ; --- ajouté pour ce qui est nouveau)
Version très simplifiée: ne vérifie pas que le fichier existe déjà.

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Fenêtres
Enumeration
    #Fenetre_principale
EndEnumeration
;}
;{ Gadgets
Enumeration
    #Edt
    #Btn ; --- ajouté
EndEnumeration
;}
;{ Polices
Enumeration
    #Police
EndEnumeration
;}
;}
;{ Variables
Global Evenement
;}
;{ Chargement et assignation des polices
LoadFont(#Police, "DejaVu Sans Mono", 10, #PB_Font_Bold)
SetGadgetFont(#PB_Default, FontID(#Police))
;}
;{ Déclaration des procédures
Declare Programme_principal()
Declare Redimentionner()
Declare Quitter()
Declare Sauvegarder() ; --- ajouté
;}
;{ Lancement du programme principal
Programme_principal()
;}
Procedure Programme_principal()
    If OpenWindow(#Fenetre_principale, 450, 200, 400, 400, "Mes rendez-vous", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget)
        EditorGadget(#Edt, 10, 10, 380, 350)
        ButtonGadget(#Btn, 10, 360, 380, 30, "Sauvegarder") ; --- ajouté
        
        ;{ Evènements liés
        ; Redimensionnement de la fenêtre
        BindEvent(#PB_Event_SizeWindow, @Redimentionner())
        ; Fermeture de la fenêtre
        BindEvent(#PB_Event_CloseWindow, @Quitter())
        BindGadgetEvent(#Btn, @Sauvegarder())
        ;}
        Repeat
            Evenement = WaitWindowEvent()
        ForEver
    EndIf
EndProcedure

Procedure Redimentionner()
    ResizeGadget(#Edt, #PB_Ignore, #PB_Ignore, WindowWidth(#Fenetre_principale) - 20, WindowHeight(#Fenetre_principale) - 20)
EndProcedure
Procedure Quitter()
    CloseWindow(#Fenetre_principale)
    End
EndProcedure

; --- Sauvegarde
Procedure Sauvegarder()
    Protected Txt$ = GetGadgetText(#Edt)  
    Protected File$ = SaveFileRequester("Sauvegarder", "MonFichier.txt", "Fichier Texte|*.txt", 0)
    If File$ <> ""
        If CreateFile(0, File$)
            WriteString(0, Txt$)
            CloseFile(0)
            MessageRequester("Succès", "Fichier sauvegardé", #PB_MessageRequester_Info) 
        Else
            MessageRequester("Erreur", "Ne peux sauvegarder " + File$, #PB_MessageRequester_Error)
        EndIf
    EndIf   
    EndProcedure
Améliorations:
- Préférer OpenFile() à CreateFile()
- Utiliser FileSize() pour voir si le fichier existe déjà
:wink:
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Comment sauvegarder le contenu d'une éditeur ?

Message par boddhi »

Salut,
Micoute a écrit : [...]sans utiliser de structure qui me permettrait de sauvegarder en Json, car ces textes ne seront pas formattés.[...]
Ton but est bien de sauvegarder tes données en JSON mais sans faire appel à une variable structurée ?
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Comment sauvegarder le contenu d'une éditeur ?

Message par boddhi »

Si tel est le cas, sur la base des codes fournis précédemment :

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Fenêtres
Enumeration
  #Fenetre_principale
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Edt
  #Btn ; --- ajouté
EndEnumeration
;}
;{ Polices
Enumeration
  #Police
EndEnumeration
;}
;{ JSON
Enumeration
  #JSON
EndEnumeration
;}
;}
;{ Variables
Global Evenement
;}
;{ Chargement et assignation des polices
LoadFont(#Police, "DejaVu Sans Mono", 10, #PB_Font_Bold)
SetGadgetFont(#PB_Default, FontID(#Police))
;}
;{ Déclaration des procédures
Declare Programme_principal()
Declare Redimentionner()
Declare Quitter()
Declare Sauvegarder() ; --- ajouté
                      ;}
                      ;{ Lancement du programme principal
Programme_principal()
;}
Procedure Programme_principal()
  If OpenWindow(#Fenetre_principale, 450, 200, 400, 400, "Mes rendez-vous", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget)
    EditorGadget(#Edt, 10, 10, 380, 350)
    ButtonGadget(#Btn, 10, 360, 380, 30, "Sauvegarder") ; --- ajouté
    
    ;{ Evènements liés
    ; Redimensionnement de la fenêtre
    BindEvent(#PB_Event_SizeWindow, @Redimentionner())
    ; Fermeture de la fenêtre
    BindEvent(#PB_Event_CloseWindow, @Quitter())
    BindGadgetEvent(#Btn, @Sauvegarder())
    ;}
    For Compteur=1 To 10
      AddGadgetItem(#Edt,-1,"Rendez-vous no "+Str(Compteur))
    Next
    
    Repeat
      Evenement = WaitWindowEvent()
    ForEver
  EndIf
EndProcedure

Procedure Redimentionner()
  ResizeGadget(#Edt, #PB_Ignore, #PB_Ignore, WindowWidth(#Fenetre_principale) - 20, WindowHeight(#Fenetre_principale) - 20)
EndProcedure
Procedure Quitter()
  CloseWindow(#Fenetre_principale)
  End
EndProcedure

; --- Sauvegarde
Procedure Sauvegarder()
  Protected Txt$,File$
  Protected NbLignes=CountGadgetItems(#Edt)-1,Compteur
  Protected NewList RendezVous.s()
  
  If NbLignes<0
    MessageRequester("","Aucun rendez-vous saisi",#PB_MessageRequester_Warning)
    ProcedureReturn
  EndIf
  File$ = SaveFileRequester("Sauvegarder", "MonFichier.json", "Fichier JSON|*.json", 0)
  If File$ <> ""
    If CreateJSON(#JSON)
      ; //// Un moyen comme un autre d'alimenter une arborescence JSON
      For Compteur=0 To NbLignes
        AddElement(RendezVous())
        RendezVous()=GetGadgetItemText(#Edt,Compteur)
      Next
      InsertJSONList(JSONValue(#JSON),RendezVous())
      ClearList(RendezVous())
      ; ////
      If SaveJSON(#JSON,File$,#PB_JSON_PrettyPrint)
        MessageRequester("Succès", "Fichier sauvegardé", #PB_MessageRequester_Info) 
      Else
        MessageRequester("Erreur", "Échec sauvegarde " + File$, #PB_MessageRequester_Error)
      EndIf
    EndIf
  EndIf   
EndProcedure
PS : A toutes fins utiles, petite astuce pour t'éviter les ';{' et ';}' avant et après les Enumeration et EndEnumeration (ou autres balises For..Next, While..Wend), tu peux aller dans 'Préférences/Pliage" et saisir dans les listes appropriées ces mots-clés. PB se chargera alors de faire lui même le pliage... :wink:
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment sauvegarder le contenu d'une éditeur ?

Message par Micoute »

Merci beaucoup boddhi pour cette aide providentielle et très prompte.
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 !
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Comment sauvegarder le contenu d'une éditeur ?

Message par boddhi »

Micoute a écrit : lun. 11/sept./2023 9:00 Merci beaucoup boddhi pour cette aide providentielle et très prompte.
A ton service :wink:

Par manque de temps, je n'avais pas mis la partie 'chargement'.
Donc, si besoin, le code complété :

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Fenêtres
Enumeration
  #Fenetre_principale
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Edt
  #Btn ; --- ajouté
  #Btn2 ; --- ajouté
EndEnumeration
;}
;{ Polices
Enumeration
  #Police
EndEnumeration
;}
;{ JSON
Enumeration
  #JSON
EndEnumeration
;}
;}
;{ Variables
Global Evenement
;}
;{ Chargement et assignation des polices
LoadFont(#Police, "DejaVu Sans Mono", 10, #PB_Font_Bold)
SetGadgetFont(#PB_Default, FontID(#Police))
;}
;{ Déclaration des procédures
Declare Programme_principal()
Declare Redimentionner()
Declare Quitter()
Declare Sauvegarder() ; --- ajouté
Declare Charger() ; --- ajouté
                      ;}
                      ;{ Lancement du programme principal
Programme_principal()
;}
Procedure Programme_principal()
  If OpenWindow(#Fenetre_principale, 450, 200, 400, 430, "Mes rendez-vous", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget)
    EditorGadget(#Edt, 10, 10, 380, 350)
    ButtonGadget(#Btn, 10, 360, 380, 30, "Sauvegarder") ; --- ajouté
    ButtonGadget(#Btn2, 10, 392, 380, 30, "Charger") ; --- ajouté
    
    ;{ Evènements liés
    ; Redimensionnement de la fenêtre
    BindEvent(#PB_Event_SizeWindow, @Redimentionner())
    ; Fermeture de la fenêtre
    BindEvent(#PB_Event_CloseWindow, @Quitter())
    BindGadgetEvent(#Btn, @Sauvegarder())
    BindGadgetEvent(#Btn2, @Charger())
    ;}
    For Compteur=1 To 10
      AddGadgetItem(#Edt,-1,"Rendez-vous no "+Str(Compteur))
    Next
    
    Repeat
      Evenement = WaitWindowEvent()
    ForEver
  EndIf
EndProcedure

Procedure Redimentionner()
  ResizeGadget(#Edt, #PB_Ignore, #PB_Ignore, WindowWidth(#Fenetre_principale) - 20, WindowHeight(#Fenetre_principale) - 20)
EndProcedure
Procedure Quitter()
  CloseWindow(#Fenetre_principale)
  End
EndProcedure

; --- Sauvegarde
Procedure Sauvegarder()
  Protected Txt$,File$
  Protected NbLignes=CountGadgetItems(#Edt)-1,Compteur
  Protected NewList RendezVous.s()
  
  If NbLignes<0
    MessageRequester("","Aucun rendez-vous saisi",#PB_MessageRequester_Warning)
    ProcedureReturn
  EndIf
  File$ = SaveFileRequester("Sauvegarder", "MonFichier.json", "Fichier JSON|*.json", 0)
  If File$ <> ""
    If CreateJSON(#JSON)
      ; //// Un moyen comme un autre d'alimenter une arborescence JSON
      For Compteur=0 To NbLignes
        AddElement(RendezVous())
        RendezVous()=GetGadgetItemText(#Edt,Compteur)
      Next
      InsertJSONList(JSONValue(#JSON),RendezVous())
      ClearList(RendezVous())
      ; ////
      If SaveJSON(#JSON,File$,#PB_JSON_PrettyPrint)
        MessageRequester("Succès", "Fichier sauvegardé", #PB_MessageRequester_Info) 
      Else
        MessageRequester("Erreur", "Échec sauvegarde " + File$, #PB_MessageRequester_Error)
      EndIf
      FreeJSON(#JSON)
    EndIf
  EndIf   
EndProcedure
Procedure Charger()
  Protected File$
  Protected NewList RendezVous.s()
  
  File$ = OpenFileRequester("Charger", "MonFichier.json", "Fichier JSON|*.json", 0)
  If File$ <> ""
    ClearGadgetItems(#Edt)
    If LoadJSON(#JSON,File$,#PB_JSON_NoCase)
      ExtractJSONList(JSONValue(#JSON),RendezVous())
      If ListSize(RendezVous())
        ForEach RendezVous()
          AddGadgetItem(#Edt,-1,"Chargé : "+RendezVous())
        Next
        ClearList(RendezVous())
        FreeJSON(#JSON)
      Else
        MessageRequester("Chargement","Aucune donnée trouvée",#PB_MessageRequester_Warning) 
      EndIf
    Else
      MessageRequester("Erreur", "Échec chargement " + File$, #PB_MessageRequester_Error)
    EndIf
  EndIf
EndProcedure
Note : Il y a plusieurs moyens d'alimenter une arborescence JSON pour finalement arriver au même résultat. Mais, perso, dans ton cas, passer par une Liste() facilitera grandement et la sauvegarde et le chargement de tes données...
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment sauvegarder le contenu d'une éditeur ?

Message par Micoute »

Mille mercis boddhi pour cette manne qui me tombe du ciel, je n'en attendais pas tant et je ne vais cracher dessus, car c'est trop merveilleux.
Dernière modification par Micoute le dim. 05/nov./2023 16:22, modifié 1 fois.
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 !
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Comment sauvegarder le contenu d'une éditeur ?

Message par boddhi »

Micoute a écrit : mar. 12/sept./2023 9:07 Mille mercis boddhi...
Ravi d'avoir pu t'aider :wink:
Répondre