DBRichViewEdit doesn't display correctly BLOB-field

General TRichView support forum. Please post your questions here
Post Reply
nrichter
Posts: 2
Joined: Sat Aug 01, 2020 9:26 am

DBRichViewEdit doesn't display correctly BLOB-field

Post by nrichter »

Hello,

I'm working with Delphi 10.3 and the TRichview controls (18.3). In my current project I encountered a strange problem with TDBRichView und BLOB-Fields.

I have an TRichViewEdit control and need to store the formatted RTF-text to a BLOB-field (Firebird, subtype "text", character set UTF8) via stream (TMemoryStream). For saving the RTF to a stream I use "rve.SaveRTFToStream(bs,False)", for saving the stream to a BLOB-field I use "TBlobField(ds.fieldbyname(s_field)).LoadFromStream(bs)". When I read the content of the BLOB-field via stream and load it into a TRichViewEdit, everything works fine so far. The RTF-text is displayed correctly (1). When I load the stream to TMemo I can see the plain RTF-text (2). It's also okay. But when I bind a TDBRichViewEdit to the datafield the text contains stange characters (chinese, I suppose), and the original RTF-text will not be displayed (3). Because of the architecture of my application I must use streams to store the RTF-text, but sometimes I must use databound TDBRichViewEdit to display it. I have no clue how to handle this problem.

Thank you very much in advance

Norbert Richter
Attachments
DBRichViewEdit with BLOB-data.jpg
DBRichViewEdit with BLOB-data.jpg (173.52 KiB) Viewed 12267 times
Sergey Tkachenko
Site Admin
Posts: 17569
Joined: Sat Aug 27, 2005 10:28 am
Contact:

Re: DBRichViewEdit doesn't display correctly BLOB-field

Post by Sergey Tkachenko »

Did you try to connect TDBMemo to this field? I believe it will show the same weird text as TDBRichView.

I think this is a wide memo field (Field.DataType = ftWideMemo).
For these fields, TRichView expects RTF stored in UnicodeString.

Data can be stored in this way:

Code: Select all

var 
  bs: TMemoryStream;
  sW: UnicodeString;
  sA: AnsiString;

  bs := TMemoryStream.Create;
  // saving RTF
  rv.SaveRTFToStream(bs, False);
  // loading it to sA
  SetLength(sA, bs.Size);
  bs.ReadBuffer(PAnsiChar(sA)^, bs.Size);
  // converting RTF code to Unicode string sW
  sW := UnicodeString(sA); // lossless conversion, because all RTF characters has codes less than 128)
  // writing Unicode RTF to TmpStream
  bs.Clear;
  bs.WriteBuffer(PWideChar(sW)^, Length(sW)*sizeof(WideChar));
  // saving to DB
  BlobField(ds.fieldbyname(s_field)).LoadFromStream(bs);
  bs.Free;
When you need to load this Unicode representation of RTF back, you can simply use rv.LoadFromStream, it can autodetect the format.
nrichter
Posts: 2
Joined: Sat Aug 01, 2020 9:26 am

Re: DBRichViewEdit doesn't display correctly BLOB-field

Post by nrichter »

Dear Sergey,

thank you very much for the quick response. Works perfectly now!

Regards

Norbert Richter
Post Reply