Загрузка RTF-текста из базы данных в TRichEdit

в настоящее время я занимаюсь миграцией нашего программного решения с Delphi 7 на 2010. В основном изменения были простыми, и осталось лишь небольшое количество препятствий.

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

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

2 ответов


хорошо, я понял это.

для загрузки 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 ;)


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