簡體   English   中英

將數據庫中的RTF文本加載到TRichEdit中

[英]Loading RTF text from database into TRichEdit

我目前正在將我們的軟件解決方案從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()的實際源代碼,看看到底發生了什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM