Shortcut to this article
Printer Friendly


In article <39d19247$1_1@dnews>, Borland wrote:
> From: "Borland" <‚úČ>

Please change your from name, you are not a Borland employee.

> I need to display formatted Text. So I decided to use TRichEdit. But: It
> doesn't work the way I expect it to do. I want to use it for something like
> this:
>   RichEdit1.Text := 'This is \b bold\b0 .';

No, it's not that simple (remember: this is a Microsoft control we are 
talking about <G>). It is possible to feed rich text chunks to the control 
but it is kind of convoluted. There are three options: the clipboard, the 
rich edits OLE interface, and the EM_STREAMIN message. Lets start with the 
clipboard since i happen to have a related post on file.

OK, the first step is to register a clipboard format for RTF, since this is not a predefined format:
  Var     CF_RTF : Word;
  CF_RTF :=RegisterClipboardFormat('Rich Text Format');
The format name has to appear as typed above, this is the name used by MS Word for Windows and similar MS products.
NOTE: The Richedit Unit declares a constant CF_RTF, which is NOT the clipboard format handle but the string you need to pass to RegisterClipboard format! So you can place Richedit into your uses clause and change the line above to
  CF_RTF :=RegisterClipboardFormat(Richedit.CF_RTF);
The next step is to build a RTF string with the embedded format information. You will get a shock if you inspect the mess of RTF stuff Wordpad (or *much* worse: Word) will put into the clipboard if you copy just a few characters ), but you can get away with a lot less. The bare minimum would be something like this (inserts a 12 followed by an underlined 44444):
 Const    testtext: PChar = '{\rtf1\ansi\pard\plain 12{\ul 44444}}';
The correct balance of opening and closing braces is extremely important, one mismatch and the target app will not be able to interpret the text correctly. If you want to control the font used for the pasted text you need to add a fonttable (the default font is Tms Rmn, not the active font in the target app!). See example testtext2 below. If you want more info, the full RTF specs can be found on, a subset is also described in the Windows help compiler docs (hcw.hlp, comes with Delphi).
procedure TForm1.BtnSetRTFClick(Sender: TObject); Const   testtext: PChar = '{\rtf1\ansi\pard\plain 12{\ul 44444}}';   testtext2: PChar = '{\rtf1\ansi'+   '\deff4\deflang1033{\fonttbl{\f4\froman\fcharset0\fprq2 Times New Roman;}}'                      +'\pard\plain 12{\ul 44444}}';   flap: Boolean = False; Var   MemHandle: THandle;   rtfstring: PChar; begin     If flap Then       rtfstring := testtext2     Else       rtfstring := testtext;     flap := not flap;     MemHandle := GlobalAlloc( GHND or GMEM_SHARE, StrLen(rtfstring)+1 );     If MemHandle <> 0 Then Begin       StrCopy( GlobalLock( MemHandle ), rtfstring );       GlobalUnlock( MemHandle );       With Clipboard Do Begin         Open;         try           AsText := '1244444';           SetAsHandle( CF_RTF, MemHandle );         finally           Close;         end;       End;     End     Else       MessageDlg('Global Alloc failed!',                  mtError, [mbOK], 0 ); end;
Once the text is in the clipboard you can call the richedits PasteFromClipboard method to insert it at the caret.
For using the OLE interface (which keeps the clipboard untouched) i have to direct you to Brian Longs Delphi Clinic column in the Delphi Magazine, he published some code in issue 58. You may find it on the companion disk for this issue, see
For EM_STREAMIN go to, or and search the newsgroups for GetRTFSelection and PutRTFSelection. That will give you methods to insert rich text from a stream (e.g. a TStringstream) into a rich edit control.
Peter Below (TeamB) ‚úČ No e-mail responses, please, unless explicitly requested!
FYI: Phrase searches are enclosed in either single or double quotes
Originally created by
Mon, 08 Feb 2016 03:48:43 GMT
Copyright © 2009-2016
HREF Tools Corp.