Loading RTF text from database into TRichEdit

后端 未结 2 1877
心在旅途
心在旅途 2021-01-17 19:59

I am currently in the process of migrating our software solution from Delphi 7 to 2010. Mostly the changes have been simple and there are only a small amount of hurdles left

相关标签:
2条回答
  • 2021-01-17 20:32

    Okay I figured it out.

    For loading the rtf text:

    //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;
    

    For saving the rtf text:

    //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;
    

    This took me way too long to figure out :) I guess I have learned one thing though... if something goes wrong in Delphi 2010, its usually related to unicode ;)

    0 讨论(0)
  • 2021-01-17 20:50

    When PlainText is False, LoadFromStream() first attempts to load the RTF code, and if that fails then LoadFromStream() attempts to load the stream again as plain text. That has always been the case in all Delphi versions. With the introduction of Unicode, I suppose something could have broken in LoadFromStream()'s EM_STREAMIN callback handler. I suggest you step into LoadFromStream()'s actual source code with the debugger and see what is really happening.

    0 讨论(0)
提交回复
热议问题