Page 1 of 1
[Example] How to export RTF having multicolumn sections
Posted: Thu Sep 11, 2008 8:33 am
by Sergey Tkachenko
The current version of TRichView does not support multiple columns. But if your application needs to create RTF files having sections with multiple columns, it is possible.
You need to insert RTF code directly. The code is \sect\sbknone\colsN, where N is a column count.
There are two methods available:
1) Using text style with rvteoRTFCode option.
2) Using some control and OnSaveComponentToFile event.
The second method is preferred because you can customize how this RTF code looks like in TRichView, but I will show the both methods.
Posted: Thu Sep 11, 2008 8:34 am
by Sergey Tkachenko
Inserting RTF code for column count using a special text style.
Code: Select all
var s: String;
ColCount: Integer;
begin
s := '1';
if not InputQuery('Columns', 'Enter count of columns:', s) then
exit;
ColCount := StrToIntDef(s, 1);
RichViewEdit1.CurTextStyleNo := GetRTFCodeStyleNo(RichViewEdit1.Style);
RichViewEdit1.InsertText('\sect\sbknone\cols'+IntToStr(ColCount));
// text after this position will be saved in RTF as ColCount columns
end;
The code above uses the function returning the index of "RTF code" text style:
Code: Select all
function GetRTFCodeStyleNo(RVStyle: TRVStyle): Integer;
var TextStyle: TFontInfo;
begin
TextStyle := TFontInfo.Create(nil);
TextStyle.Options := [rvteoRTFCode];
TextStyle.Protection :=
[rvprStyleProtect, rvprModifyProtect, rvprConcateProtect,
rvprDoNotAutoSwitch];
Result := RVStyle.TextStyles.FindSuchStyle(0, TextStyle,
RVAllFontInfoProperties);
if Result<0 then begin
with RVStyle.TextStyles.Add do begin
Assign(TextStyle);
Standard := False;
end;
Result := RVStyle.TextStyles.Count-1;
end;
TextStyle.Free;
end;
The disadvantage of this method is in displaying RTF code in TRichView (it may confuse users).
Posted: Thu Sep 11, 2008 8:36 am
by Sergey Tkachenko
Inserting RTF code for column count using controls
You can use any control, in this example I am using TStaticText with Caption = column count.
1) Inserting:
Code: Select all
var s: String;
ColCount: Integer;
StaticText: TStaticText;
begin
s := '1';
if not InputQuery('Columns', 'Enter count of columns:', s) then
exit;
ColCount := StrToIntDef(s, 1);
StaticText := TStaticText.Create(nil);
StaticText.Font.Color := clYellow;
StaticText.Color := clBlack;
StaticText.Caption := IntToStr(ColCount);
StaticText.Hint := IntToStr(ColCount)+' column(s)';
RichViewEdit1.InsertControl('', StaticText, rvvaBaseline);
end;
2) OnSaveComponentToFile event:
Code: Select all
procedure TForm3.RichViewEdit1SaveComponentToFile(Sender: TCustomRichView;
Path: TRVUnicodeString; SaveMe: TPersistent; SaveFormat: TRVSaveFormat;
var OutStr: TRVUnicodeString);
begin
if (SaveFormat=rvsfRTF) and (SaveMe is TStaticText) then
OutStr := '\sect\sbknone\cols'+TStaticText(SaveMe).Caption;
end;
3) TStaticText must be registered (one time, in the initialization section or when the main form is created:
Update:
2018-Apr-9: for compatibility with TRichView 17.3
Posted: Thu Sep 11, 2008 8:40 am
by Sergey Tkachenko
These examples can be used as a template for inserting any codes in RTF or HTML files.
For HTML files, use rvteoHTMLCode instead of rvteoRTFCode (options of text style) and rvsfHTML instead of rvsfRTF (file format for OnSaveComponentToFile).