2010-11-02 42 views
7

Actualmente estoy en el proceso de migrar nuestra solución de software de Delphi 7 a 2010. La mayoría de los cambios han sido simples y solo quedan una pequeña cantidad de obstáculos por recorrer.Cargando texto RTF de la base de datos en TRichEdit

En un formulario utilizamos un TRichEdit que muestra el texto rtf tomado de un campo de blob en un MSSQL db. Esta es la forma en que trabajó en Delphi 7:

//Get RTF text from Blob field using TADOQuery 
rtfStream := sql.CreateBlobStream(sql.FieldByName('rtftext'), BmRead) as TMemoryStream; 

//Load into TRichEdit 
RichEdit.PlainText := False; 
RichEdit.Lines.LoadFromStream(rtfStream); 

Esto mostrará la RTF como se esperaba en el componente TRichEdit, pero el mismo código en Delphi 2010 muestra la RTF como texto sin formato con tabulaciones entre cada carácter. Supongo que esto tiene mucho que ver con el cambio de Ansi a Unicode, pero no he tenido suerte corrigiendo el problema.

Cualquier ayuda para hacer que esto funcione sería muy apreciada. Gracias

Respuesta

9

Bien, lo descubrí.

Para cargar el texto RTF:

//Get the data from the database as AnsiString 
rtfString := sql.FieldByName('rtftext').AsAnsiString; 

//Write the string into a stream 
stream := TMemoryStream.Create; 
stream.Clear; 
stream.Write(PAnsiChar(rtfString)^, Length(rtfString)); 
stream.Position := 0; 

//Load the stream into the RichEdit 
RichEdit.PlainText := False; 
RichEdit.Lines.LoadFromStream(stream); 

stream.Free; 

Para guardar el texto RTF:

//Save to stream 
stream := TMemoryStream.Create; 
stream.Clear; 

RichEdit.Lines.SaveToStream(stream); 
stream.Position := 0; 

//Read from the stream into an AnsiString (rtfString) 
if (stream.Size > 0) then begin 
    SetLength(rtfString, stream.Size); 
    if (stream.Read(rtfString[1], stream.Size) <= 0) then 
     raise EStreamError.CreateFmt('End of stream reached with %d bytes left to read.', [stream.Size]); 
end; 

stream.Free; 

//Save to database 
sql.FieldByName('rtftext').AsAnsiString := rtfString; 

Esto me llevó demasiado tiempo para averiguar :) supongo que he aprendido una cosa sin embargo ... si algo sale mal en Delphi 2010, por lo general está relacionado con unicode;)

+0

http://kspnew.googlecode.com/svn-history/r334/trunk/additional/bass/AnsiStringStream.pas o algo similar? –

4

Cuando PlainText es falso, LoadFromStream() primero intenta cargar el código RTF, y si eso falla, LoadFromStream() intenta volver a cargar la secuencia como texto sin formato. Ese ha sido siempre el caso en todas las versiones de Delphi. Con la introducción de Unicode, supongo que algo podría haberse roto en el controlador de devolución de llamadas EM_STREAMIN de LoadFromStream(). Sugiero que ingrese en el código fuente actual de LoadFromStream() con el depurador y vea qué está sucediendo realmente.

+0

Gracias por la sugerencia. No pude rastrear el código de LoadFromStream por algún motivo, pero esto me hizo pensar en ello de la manera correcta que me llevó a mi solución. –

+1

Tradicionalmente Delphi usó RTDEdit v.1.0 e ignoró v.2.0 y v.3.0 * (que fueron utilizados por RxLib, JediVCL, TRichView, etc.). Y se puede leer que UNICODE está prohibido para EM_STREAMIN por http://msdn.microsoft.com/en-us/library/windows/desktop/bb774302.aspx si Only Delphi tenía TAnsiStringStream o utiliza controles de edición RTF más modernos –

+1

Unicode no está prohibido para 'EM_STREAMIN', se puede usar pero solo con el indicador' SF_TEXT', que es como 'TRichEdit' lo usa. 'SF_UNICODE' no es compatible con RE 1.0, pero' TRichEdit' en versiones recientes de VCL (incluido 2010) carga explícitamente RE 2.0 (que carga de manera silenciosa RE 3.0 en las versiones de Windows que admiten 3.0). –

Cuestiones relacionadas