Page 1 sur 1

Comment sauvegarder le contenu d'un éditeur ?

Publié : dim. 10/sept./2023 9:29
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

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

Publié : dim. 10/sept./2023 16:36
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:

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

Publié : dim. 10/sept./2023 17:24
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 ?

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

Publié : dim. 10/sept./2023 18:51
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:

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

Publié : lun. 11/sept./2023 9:00
par Micoute
Merci beaucoup boddhi pour cette aide providentielle et très prompte.

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

Publié : lun. 11/sept./2023 11:20
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...

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

Publié : mar. 12/sept./2023 9:07
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.

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

Publié : mer. 13/sept./2023 17:48
par boddhi
Micoute a écrit : mar. 12/sept./2023 9:07 Mille mercis boddhi...
Ravi d'avoir pu t'aider :wink: