RTF a memo

RTF a memo

Postby rolando » Thu Nov 20, 2008 11:14 am

Buen día,

Para hacer pruebas hice este código pero por alguna razón no funciona como debiera.

La idea es guardar un texto RTF en el memo de una DBF, pero, para evitar que el RTF sea leído si hubo corrupcion de datos en el memo (a veces suele pasar que en un memo están los datos de otro), intento agregarle el recno() y un par de caracteres "/*/" al RTF cuando es guardado en el memo.

Esto lo hace aparentemente bién, pero al recuperarlo, el texto en el richedit no sale, sólo está en blanco.

Adjunto el código. Gracias.

Code: Select all  Expand view  RUN
#include "Fivewin.ch"
#include "richedit.ch"


external dbfcdx

REQUEST ordkeyno, ordkeycount, ordkeygoto

REQUEST DBFCDX, DBFFPT


function Reditoold                  // en cMemo entro el memo a editar

    # define fondo1 nrgb(236,226,202)
    # define fondo3 nrgb(236,226,232)

    local oDlg, oRich, cText, cMemo , cVar ,oSay, cDisk, cDir

    local cMemoRich          // rtf creado a partir del contenido del memo
    local cRTFaMEMO      // el contenido del rich guardado como RTF en
                         //cRTFaMEMO para luego ponerlo en el memo
    local cRTF


    local hRichDLL := LoadLibrary( "riched20.dll" )

    local cAlias:=cGetNewAlias('richi')


    set resources to "richrolo.dll"


     use TRABAJOS shared new alias (cAlias)
          (cAlias)->(ordsetfocus(1) , dbgotop())


    define font oFont name "arial" size -5,-12 bold

   define dialog oDlg resource "rich" ;
          color nrgb(0,0,0) , fondo3


    redefine richedit oRich var cText id 4001 of oDlg;
                font oFont

      REDEFINE BUTTON ID 4003 ;       //leo el rtf guardado en el memo
                                      //y lo paso al editor

              action (cRTF:=PasoRTFdesdeMemo(cAlias,"REPARACION",recno()) , ;
                      msginfo(cRTF) , cMemoRich:=oRich:LoadAsRtf(cRTF) , ;
                     oRich:SetText(cMemoRich)) //


      REDEFINE BUTTON ID 4004 ;      // guardo lo que tengo en editor,
                                     //al campo memo con formato rtf

      action (cRTFaMEMO:=oRich:SaveAsRTF(cText) , ;
                 GuardoRTFenMemo(cAlias,"REPARACION",cRTFaMEMO,recno()) )



   ACTIVATE DIALOG oDlg CENTERED on init oRich:SetText((cAlias)->REPARACION)

    FreeLibrary( hRichDLL )

return nil







//----------------------------------------------------------------------------------------------------------------------------------

Function GuardoRTFenMemo(cAlias,cMemo,cRTFaMEMO,nRecord)

                                       // en esta funcion guarda el RTF en el memo
                                       // indicado agragandole el recno()
                                       // para poder luego controlar que coincida ciando
                                       // se carge así evito leer
                                       // errores si el meo se corrompió

   IF &cAlias.->(DBRLOCK())
       REPLACE &cAlias.->&cMemo. WITH (alltrim(str(nRecord)) + "/*/" + cRTFaMEMO)
       &cAlias.->(DBCOMMIT())
      &cAlias.->(DBUNLOCK())
       return .t.
   else
      msginfo("NO SE PUDO BLOQUEAR DBF, NO SE GUARDÖ EL RTF")
      return .f.
   endif
return nil


//----------------------------------------------------------------------------------------------------------------------------------



//-----------------------------------------------------------------------------

Function PasoRTFdesdeMemo(cAlias,cMemo,nRecno)     // en esta funcion leo el
                                                                            // memo y le saco el recno.
                                                    //si no coincide con el recno(),
                                                   // informo y leo espacios
                                                                    // vacios. Si coincide, le saco
                                                   //el recno
                                                   // y las "/*/" y devuelvo el rtf
    local cMemoRich , nPosi , cRecno , cMemoRTFListo

    cMemoRich:=&cAlias.->&cMemo.

    nPosi := at("/*/",cMemoRich)

    if nPosi > 0
       cRecno:=substr(cMemoRich,1,(nPosi-1))
      else
       msginfo("El memo está alterado")
       return nil
    endif

    if int(val(cRecno)) <> nRecno
       msginfo("El memo está alterado")
       return nil
     else
       msginfo(str(nPosi))
       cMemoRTFListo := substr(cMemoRich,(nPosi+3),(len(cMemoRich)-(nPosi+2)) )
       msginfo(cMemoRTFListo)
       return cMemoRTFListo
    endif

return nil
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 37 guests