我目前正在将我们的软件解决方案从 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 有关;)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)