<< Click to display table of contents >> Controls, Documents, Items in TRichView |
There are three main families of classes.
1. VCL controls, descendants of TCustomRichView.
See the diagram of class hierarchy.
The main visual controls are: TRichView, TRichViewEdit, TDBRichView, TDBRichViewEdit.
2. Documents, objects containing items, descendants of TCustomRVFormattedData.
Documents are objects, but not components.
Each RichView or RichViewEdit has such document accessible as RVData property.
They have the most of methods of RichView controls. For example, calling
MyRichView.AddNL('text',0,0)
is equivalent to
MyRichView.RVData.AddNL('text',0,0)
Tables have cells. Cells are also documents containing items, cells are descendants of TCustomRVFormattedData.
3. Items of documents, descendants of TCustomRVItemInfo.
Items are objects, but not components.
Items are usually hidden from programmers. They can be added and modified by methods of controls or document objects. The only exception is tables (TRVTableItemInfo).
Documents contain items, some items (tables) can contain documents (cells).
There is an important case: cell editing. When editing cell, RichViewEdit creates a special editor (also TRichViewEdit) on the top of the cell. While editing, all items in the cell are moved in this editor. When editing is finished, items are moved back to the cell.
At any time, object containing cell items is accessible as cell.GetRVData (if cell is not edited, it is the cell itself; if edited, it is RVData of its inplace editor).
This example shows that the same procedure can be applied to the main document and table cells.
This example converts all text to upper case
procedure AllUpperCase(RVData: TCustomRVData);
var i,r,c: Integer;
s: String;
table: TRVTableItemInfo;
begin
for i := 0 to RVData.ItemCount-1 do
if RVData.GetItemStyle(i)>=0 then
begin
// this is a text item
s := RVData.GetItemText(i);
s := AnsiUpperCase(s);
RVData.SetItemText(i,s);
end
else if RVData.GetItemStyle(i) is TRVTableItemInfo then
begin
table := TRVTableItemInfo(RVData.GetItem(i));
for r := 0 to table.RowCount-1 do
for c := 0 to table.ColCount-1 do
if table.Cells[r,c]<>nil then
AllUpperCase(table.Cells[r,c].GetRVData);
end;
end;
Call:
AllUpperCase(MyRichView.RVData);
MyRichView.Format;
The same task, using different methods
// This procedure will be called for each RichView item
procedure TForm1.EnumItemsProc(RVData: TCustomRVData;
ItemNo: Integer; var UserData1: Integer;
const UserData2: TRVUnicodeString; var ContinueEnum: Boolean);
var s: String;
begin
if RVData.GetItemStyle(ItemNo)>=0 then begin
s := RVData.GetItemText(i);
s := AnsiUpperCase(s);
RVData.SetItemText(ItemNo,s);
end;
ContinueEnum := True;
end;
Call:
var v: Integer;
v := 0;
// RVData.EnumItems calls the specified procedure (EnumItems)
// for each items in RVData and its subdocuments (table cells)
// The second and the third parameters are user defined data,
// they will be passed in the procedure as UserData1 and UserData2
MyRichView.RVData.EnumItems(EnumItemsProc, v, '');
MyRichView.Format;
The advantage of using RVData.EnumItems is more clear and compact code.
The disadvantage: you cannot use it if you need to add or delete items.