从数据库加载 RTF 文本到 TRichEdit

问题描述 投票:0回答:2

我目前正在将我们的软件解决方案从 Delphi 7 迁移到 2010。大部分更改都很简单,只剩下少量障碍需要解决。

在一个表单上,我们使用了一个 TRichEdit,它显示了从 MSSQL 数据库中的 blob 字段中抓取的 rtf 文本。这就是它在 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);

这将在 TRichEdit 组件中按预期显示 RTF,但 Delphi 2010 中的相同代码将 RTF 显示为纯文本,每个字符之间有制表符。我认为这与从 Ansi 到 Unicode 的变化有很大关系,但我没有任何运气来解决这个问题。

任何帮助让它工作的人都将不胜感激。谢谢

delphi unicode rtf delphi-2010 richedit
2个回答
15
投票

好吧,我想通了。

加载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 相关;)


5
投票

当 PlainText 为 False 时,LoadFromStream() 首先尝试加载 RTF 代码,如果失败,则 LoadFromStream() 尝试再次加载纯文本流。在所有 Delphi 版本中,情况一直如此。随着 Unicode 的引入,我想 LoadFromStream() 的

EM_STREAMIN
回调处理程序中可能出现了问题。我建议您使用调试器进入 LoadFromStream() 的实际源代码,看看到底发生了什么。

© www.soinside.com 2019 - 2024. All rights reserved.