Charger et Enregistrer au Format RTF

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Charger et Enregistrer au Format RTF

Message par nico »

Ce n'est certe pas nouveau pour certains d'entre vous, mais comme aucun exemple n'a été posté pour montrer la façon de procéder, je me suis décidé à le faire.

Le plus grand intérêt de l'EditorGadget est de pouvoir afficher des couleurs, je propose ce code qui permet de lire un fichier *.rtf ainsi que le sauvegarder dans ce même format.

Je tiens aussi à signaler que ce code n'est pas une reprise d'un quelconque code que l'on pourrait retrouver sur d'autres Forums, il est le résultat de mes propres recherches.

Code : Tout sélectionner


; PB Version 3.93 
; Le 14/05/05 
; Exemple de chargement et d'enregistrement au format RTF 
; By Nico 

Procedure EditCallBack_Ecriture(dwCookie.l, *pbBuff.l, cb.l, *pcb.l) 
  If WriteData(*pbBuff, cb) 
    ProcedureReturn 0 
  Else 
    ProcedureReturn 1 
  EndIf 
EndProcedure 

Procedure EditCallBack_Lecture(dwCookie.l, *pbBuff.l, cb.l, *pcb.l) 
  If ReadFile_(dwCookie, *pbBuff, cb, *pcb, 0) 
    ProcedureReturn 0 
  Else 
    ProcedureReturn 1 
  EndIf 
EndProcedure 


If OpenWindow(0,200,100,560,570,#PB_Window_SystemMenu,"EditorGadget") And CreateGadgetList(WindowID(0)) 
  EditorGadget (0,10,60,540,500,#PB_Container_Raised) 
  ButtonGadget(2, 40, 20, 100, 20, "Ouvrir un fichier *.rtf") 
  ButtonGadget(1, 180, 20, 180, 20, "Enregistrer le contenu de l'éditeur")  
  ButtonGadget(3, 400, 20, 100, 20, "Quitter") 
  
  Repeat 
    EventID = WaitWindowEvent() 
    
    Select EventID 
      Case  #PB_EventGadget 
        Select EventGadgetID() 
            
          Case 1 
            file$ = SaveFileRequester("Enregistrer un fichier *.rtf", "c:\","*.*|*.*", 0) 
            If file$<>"" 
              If CreateFile(0, file$) 
                Edit.EDITSTREAM 
                Edit\dwCookie=0 
                Edit\pfnCallback=@EditCallBack_Ecriture() 
                SendMessage_(GadgetID(0),#EM_STREAMOUT,#SF_RTF,Edit) 
                If Edit\dwError=0 
                  Debug "L'écriture s'est bien déroulée" 
                Else 
                  Debug "L'écriture du fichier a provoqué une erreur" 
                EndIf 
                CloseFile(0) 
              EndIf 
            EndIf 
            
          Case 2 
            file$ = OpenFileRequester("Ouvrir un fichier rtf", "c:\","*.*|*.*", 0) 
            If file$<>"" 
              hFile=OpenFile(1, file$) 
              Edit.EDITSTREAM 
              Edit\dwCookie=hFile 
              Edit\pfnCallback=@EditCallBack_Lecture() 
              SendMessage_(GadgetID(0),#EM_STREAMIN,#SF_RTF,Edit) 
              If Edit\dwError=0 
                Debug "La lecture s'est bien déroulée" 
              Else 
                Debug "La lecture du fichier a provoqué une erreur" 
              EndIf 
              CloseFile(1) 
            EndIf 
            
          Case 3 
            Quit=1 
            
        EndSelect  
    EndSelect 
  Until Quit=1 
EndIf  
Dernière modification par nico le dim. 15/mai/2005 9:55, modifié 2 fois.
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

bon idée
Dernière modification par bernard13 le dim. 15/mai/2005 9:20, modifié 1 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est pas étonnant que t'y comprennes rien, déjà t'es pas capable de te relire.
en s'en fou
Si c'est pas une preuve du peu d'application dont tu es capable ça, c'est ton gros problème!
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

je bosse sur un logiciel pour moi
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Sympa ça peut être utile !! :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Code : Tout sélectionner

; PB Version 3.93 
; Le 14/05/05 
; Exemple de chargement et d'enregistrement au format RTF
; à partir de la mémoire 
; By Nico 

Structure settextex 
  flags.l
  codepage.l
EndStructure 

Global chaine$,*pointeur,longueur

;/ Cette procédure sert à sauvegarder le contenu de l'éditeur
;/ au format RTF en mémoire (ici dans une chaine).
Procedure EditCallBack_E(dwCookie.l, *pbBuff.l, cb.l, *pcb.l)
  chaine$=chaine$+PeekS(*pbBuff,cb)
  PokeL(*pcb,Len(chaine$))
  ProcedureReturn 0
EndProcedure

;/ Cette procédure sert à charger dans l'éditeur
;/ du texte RTF  à partir de la mémoire.
;/ Il existe des solutions plus simple proposée plus bas.
Procedure EditCallBack_L(dwCookie.l, *pbBuff.l, cb.l, *pcb.l)
  longueur=longueur-cb
  If longueur>0
    PokeL(*pcb,cb)
    CopyMemory(*pointeur,*pbBuff,cb)
  Else
    CopyMemory(*pointeur,*pbBuff,longueur+cb) 
    PokeL(*pcb,longueur+cb)
  EndIf
  *pointeur=*pointeur+cb
  ProcedureReturn 0
EndProcedure


If OpenWindow(0,0,0,400,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"EditorGadget") And CreateGadgetList(WindowID(0)) 
  EditorGadget (0,10,40,160,340,#PB_Container_Raised) 
  EditorGadget (1,220,40,160,340,#PB_Container_Raised)
  ButtonGadget(2,10,10,160,20,"Copier dans l'autre éditeur")
  ButtonGadget(3,220,10,160,20,"Effacer le contenu")
  
  AddGadgetItem(0,-1,"Pour simplifier ce code,")
  AddGadgetItem(0,-1,"il n'y a pas de couleur")
  AddGadgetItem(0,-1,"mais rien ne vous empêche")
  AddGadgetItem(0,-1,"d'en coller!")
  
  Repeat
    EventID.l=WaitWindowEvent()
    Select EventID  
      Case #PB_EventGadget
        Select EventGadgetID()
 
          Case 2
            ;/ Ici on enregistre le contenu de l'éditeur 
            ;/ au format RTF dans une chaine
            ;/ Il ne sert à rien de tester Edit\dwError
            ;/ car la procédure d'appel renvoie toujours 0
            chaine$=""
            longueur= Len(GetGadgetText(0)) 
            Edit.EDITSTREAM
            Edit\dwCookie=0  
            Edit\pfnCallback=@EditCallBack_E()
            SendMessage_(GadgetID(0),#EM_STREAMOUT,#SF_RTF,Edit)

            
            ;/ N'utiliser qu'une seule de ces solutions à la fois!
            
            ;/ Première solution pour copier du texte RTF à partir de la mémoire
            ;/ Là non plus, il ne sert à rien de tester Edit\dwError
            ;/ car la procédure d'appel renvoie toujours 0
            ; Edit.EDITSTREAM
            ; longueur=Len(chaine$)
            ; *pointeur=@chaine$
            ; Edit\pfnCallback=@EditCallBack_L()
            ; SendMessage_(GadgetID(1),#EM_STREAMIN,#SF_RTF,Edit)

            
            ;/ Deuxième solution pour copier du texte RTF à partir de la mémoire
            ; #ST_SELECTION=2
            ; donne.settextex
            ; donne\flags=#ST_SELECTION
            ; donne\codepage=#CP_ACP
            ; SendMessage_(GadgetID(1),#EM_SETTEXTEX,@donne,chaine$) 
            
            ;/ Troisième solution pour copier du texte RTF à partir de la mémoire            
            SetGadgetText(1, chaine$)
            
          Case 3
            ClearGadgetItemList(1)
            
        EndSelect
        
      Case #WM_CLOSE
        Quit=1
    EndSelect
    
  Until Quit=1
EndIf 
Dernière modification par nico le dim. 15/mai/2005 12:43, modifié 1 fois.
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

Bon code et clair ! Thank


@Bernard13 : tu t'en fou et bosses sur un logiciel ?
Et bien je pense qu'on s'en fou aussi
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Si vous souhaitez colorier facilement dutete, utilisez ma lib LibEditorPlus
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Merci Nico pour l'exemple.

bernard13, ras-le-bol de tes interventions débiles; tu dénigres les codeurs qui postent des exemples pour faire avancer les autres (Nico en particulier poste de très bons exemples), mais toi, c'est le vide complet.

Bien souvent, il te suffirait d'ouvrir l'aide pour avoir la réponse à tes questions mais là encore, le vide complet.

Alors, respectes le travail des autres, et tu auras déjà fait un pas.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Salut,

Une petite inversion à corriger, sans conséquence si ce n'est une déroute à la compile :

Code : Tout sélectionner

Case 1 
            file$ = SaveFileRequester("Ouvrir un fichier *.rtf", "c:\","*.*|*.*", 0) 
            If file$<>"" 
et

Code : Tout sélectionner

Case 2 
            file$ = OpenFileRequester("Enregistrer un le fichier rtf", "c:\","*.*|*.*", 0) 
            If file$<>"" 
Inverser " Ouvrir un fichier " et "Enregistrer un fichier"

Merci Nico pour cette simplification de l'usage du rtf.
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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Merci Jacobus, c'est corrigé. :)
Répondre