9

我目前正在将我们的软件解决方案从 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 的变化有很大关系,但我没有任何运气来纠正这个问题。

任何帮助使它工作将不胜感激。谢谢

4

2 回答 2

13

好吧,我想通了。

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

于 2010-11-03T04:05:34.353 回答
5

当 PlainText 为 False 时,LoadFromStream() 首先尝试加载 RTF 代码,如果失败,则 LoadFromStream() 尝试再次将流加载为纯文本。在所有 Delphi 版本中都是如此。随着 Unicode 的引入,我想 LoadFromStream() 的EM_STREAMIN回调处理程序中可能出现了问题。我建议您使用调试器进入 LoadFromStream() 的实际源代码,看看实际发生了什么。

于 2010-11-02T18:41:16.780 回答