我目前正在将我们的软件解决方案从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的变化有很大关系,但我没有任何运气来纠正这个问题。
任何有助于此工作的帮助将非常感激。感谢
答案 0 :(得分:11)
好的,我明白了。
用于加载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有关;)
答案 1 :(得分:5)
当PlainText为False时,LoadFromStream()首先尝试加载RTF代码,如果失败则LoadFromStream()尝试再次以纯文本形式加载流。所有Delphi版本都是如此。随着Unicode的引入,我想在LoadFromStream()的EM_STREAMIN
回调处理程序中可能会出现问题。我建议你使用调试器进入LoadFromStream()的实际源代码,看看到底发生了什么。