我目前正在进行的迁移我们的软件解决方案,从德尔斐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实际的源代码的调试器,看看什么是真正发生的事情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top