我目前正在将我们的软件解决方案从 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 的变化有很大关系,但我没有任何运气来解决这个问题。
任何帮助让它工作的人都将不胜感激。谢谢
好吧,我想通了。
加载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 相关;)
当 PlainText 为 False 时,LoadFromStream() 首先尝试加载 RTF 代码,如果失败,则 LoadFromStream() 尝试再次加载纯文本流。在所有 Delphi 版本中,情况一直如此。随着 Unicode 的引入,我想 LoadFromStream() 的
EM_STREAMIN
回调处理程序中可能出现了问题。我建议您使用调试器进入 LoadFromStream() 的实际源代码,看看到底发生了什么。