装载RTF文字从数据库进TRichEdit
-
28-09-2019 - |
题
我目前正在进行的迁移我们的软件解决方案,从德尔斐7至2010年。主要的变化已经简单的,只有少量的障碍离开去。
在形成我们的使用TRichEdit这显示rtf案文抓住了从blob领域中的一MSSQL数据库。这是它是如何工作的,在德尔斐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);
这将显示RTF为预计在TRichEdit组成部分,但同样的代码,在德尔斐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;
这花费了我的时间太长了图了:)我想我已经学会了一件事虽然...如果出了什么错误的,在德尔斐2010年时,其通常关系到unicode;)
其他提示
当明是虚假的,LoadFromStream()第一次尝试载RTF代码,如果失败,然后LoadFromStream()试图负荷流再次作为普通文本。一直的情况下在所有德尔斐版本。介绍Unicode,我想事情可能已经打破在LoadFromStream()'s EM_STREAMIN
回调处理程序。我建议你步入LoadFromStream()'s实际的源代码的调试器,看看什么是真正发生的事情。
不隶属于 StackOverflow