2010-11-02 4 views
7

Я сейчас в процессе миграции нашего программного решения от Delphi 7 до 2010 года. В основном изменения были простыми и осталось только небольшое количество препятствий.Загрузка RTF-текста из базы данных в TRichEdit

В форме мы используем TRichEdit, который отображает текст rtf, захваченный из поля blob в MSSQL db. Вот как это работает в 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); 

Это будет отображать формат RTF, как ожидается, в компоненте TRichEdit, но тот же самый код в Delphi 2010 отображает RTF в виде обычного текста с закладками между символами. Я предполагаю, что это имеет много общего с изменением от Ansi до Unicode, но мне не удавалось устранить проблему.

Любая помощь в получении этого для работы будет очень признательна. Спасибо

ответ

9

Хорошо, я понял.

Для загрузки текста в формате 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; 

Для сохранения текста в формате 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; 

Это заняло у меня слишком много времени, чтобы выяснить :) Я думаю, что я узнал одна вещь, хотя ... если что-то пойдет не так в Delphi 2010, ее обычно связано с unicode;)

+0

http://kspnew.googlecode.com/svn-history/r334/trunk/additional/bass/AnsiStringStream.pas или что-то подобное? –

4

Когда PlainText False, LoadFromStream() сначала пытается загрузить RTF-код, и если это не удается, LoadFromStream() пытается снова загрузить поток в виде обычного текста. Это всегда имело место во всех версиях Delphi. С введением Unicode я полагаю, что что-то могло сломаться в обработчике обратного вызова LoadFromStream() EM_STREAMIN. Я предлагаю вам перейти в исходный код LoadFromStream() с помощью отладчика и посмотреть, что на самом деле происходит.

+0

Спасибо за подсказку. По какой-то причине я не смог проследить в коде LoadFromStream, но это заставило меня задуматься над этим правильным способом, который привел к моему решению. –

+1

Традиционно Delphi использовал RTDEdit v.1.0 и игнорировал v.2.0 и v.3.0 * (которые использовались RxLib, JediVCL, TRichView и т. Д.). И можно прочитать, что UNICODE запрещен для EM_STREAMIN на http://msdn.microsoft.com/en-us/library/windows/desktop/bb774302.aspx, если только Delphi имеет TAnsiStringStream или использует более современные средства редактирования RTF. –

+1

Unicode не запрещено для 'EM_STREAMIN', его можно использовать, но только с флагом' SF_TEXT', который используется как 'TRichEdit'. 'SF_UNICODE' не поддерживается в RE 1.0, но' TRichEdit' в последних версиях VCL (включая 2010) явно загружает RE 2.0 (который тихо загружает RE 3.0 в версиях Windows, поддерживающих 3.0). –

 Смежные вопросы

  • Нет связанных вопросов^_^