Page 1 sur 1

Charger et Enregistrer au Format RTF

Publié : sam. 14/mai/2005 19:03
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  

Publié : sam. 14/mai/2005 20:30
par bernard13
bon idée

Publié : sam. 14/mai/2005 20:45
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!

Publié : sam. 14/mai/2005 20:51
par bernard13
je bosse sur un logiciel pour moi

Publié : sam. 14/mai/2005 21:05
par Droopy
Sympa ça peut être utile !! :)

Publié : sam. 14/mai/2005 22:42
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 

Publié : sam. 14/mai/2005 23:15
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

Publié : dim. 15/mai/2005 1:07
par Progi1984
Si vous souhaitez colorier facilement dutete, utilisez ma lib LibEditorPlus

Publié : dim. 15/mai/2005 6:28
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.

Publié : dim. 15/mai/2005 8:47
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.

Publié : dim. 15/mai/2005 9:54
par nico
Merci Jacobus, c'est corrigé. :)