Загрузка 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 () с отладчиком и посмотреть, что происходит на самом деле.