Re: Indenting on the fly

Return to index



Sergey Tkachenko

Posted: 10/15/2003 19:31:12

TRVStyle component (linked to this editor) contains collections of text

styles (defining text fonts, colors, etc.) and paragraph styles (defining

paragraph alignments, indents, etc.). They are available as properties

TextStyles and ParaStyles.

You can edit these collections at run time or at design time.

For example, you can define two text styles (for normal text and for bold

text) and use their indices as the second parameter of AddNL.

(NOTE: the second patameter of AddNL is an index in editor.Style.TextStyles;

editor.Style.ItemNo must not be used here, it is a completely different


Besides, you can define a paragraph style with the proper LeftIndent and use

its index as the third parameter of AddNL.

The main problem is identing text loaded from rtfStream.

I can suggest the following solution:

1) Make sure that "Allow adding styles dynamically" is set in the component

editor for this TRichViewEdit (in Delphi, right click this TRichViewEdit,

choose "Settings" in the context menu).

2) Make sure that TRVStyle component linked to this TRichViewEdit (as

editor.Style) is not linked to any other TRichViewEdit

3) Store the number of paragraph styles before the RTF loading in a


   ParaStyleCount := editor.Style.ParaStyles.Count;

4) LoadRTFFromStream will add paragraph styles in

editor.Style.ParaStyles.Count. After loading, increase left indent of these


  for i := ParaStyleCount to editor.Style.ParaStyles.Count-1 do

    editor.Style.ParaStyles[i].LeftIndent :=


That's all. Well, almost all. There may be a problem: LoadRTFFromStream may

reuse some existing paragraph styles that is already in the collection

instead of adding new styles (if some paragraph in RTF has the same

attributes as existing paragraph styles).

You can use a trick to avoid this:

- after the step 3, temporary assign to existing paragraph styles some

properties that cannot be in RTF. For example, set LeftIndent to -1000:

  for i := 0 to ParaStyleCount-1 do

    editor.Style.ParaStyles[i].LeftIndent := -1000;

- after the step 4, restore their left indents:

  for i := 0 to ParaStyleCount-1 do

    editor.Style.ParaStyles[i].LeftIndent := 0;

> I am loading a TRichViewEdit and want to indent some text on the fly.


> is for replying to a mail message, so the original message will be


> I'm not sure how to do this.  Please see the code below.

Powered by ABC Amber Outlook Express Converter