FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour RTF a memo
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
RTF a memo
Posted: 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.

#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

Continue the discussion