|
<< Нажмите, чтобы показать Содержание >> Компоненты, документы, элементы ТРВ-Редактора (TRichView) |
Имеются три основные группы классов.
1. Визуальные компоненты, унаследованные от TCustomRichView.
Главные визуальные компоненты: TRichView, TRichViewEdit.
В VCL и Lazarus также: TDBRichView, TDBRichViewEdit.
2. Документы (объекты, содержащие элементы), унаследованные от TCustomRVData.
Документы являются объектами, но не компонентами.
Каждый компонент TRichView и TRichViewEdit имеет такой документ, доступ к которому даёт свойство RVData.
Документы имеют большинство методов, имеющихся у компонентов TRichView. Например, вызов
MyRichView.AddNL('текст',0,0)
эквивалентен вызову
MyRichView.RVData.AddNL('текст',0,0)
Таблицы имеют ячейки. Ячейки также являются документами, содержащими элементы. Ячейки унаследованы отTCustomRVData.
3. Элементы документа, унаследованные от TCustomRVItemInfo.
Элементы являются объектами, но не компонентами.
Для работы с основными типами элементов (текстом, рисунками, горизонтальными линиями и др.) обычно не требуется доступ непосредственно к объекту элемента. Вместо этого используются методы получения элементов и изменения их свойств, имеющиеся у компонентов (TRichView и TRichViewEdit), или у документов.
Но для ряда элементов документа не предусмотрены специальные методы (за исключением методов для работы с дополнительными целочисленными и строковыми свойствами). Для работы с такими элементами потребуется получить их объект и вызвать его методы. Наиболее яркий пример такого элемента – таблицы (TRVTableItemInfo).
Документ содержит элементы. Некоторые элементы, в свою очередь, содержат документы. Например, таблицы (элементы) содержат ячейки (документы). Сноски, концевые сноски, сноски в рамке, текстовые поля (элементы) также содержат документ, но он не показывается TRichView (показывается при печати в TRVPrint или в СРВ-Редакторе (ScaleRichView)).
Важный случай: редактирование ячейки. При редактировании ячейки TRichViewEdit создает специальный редактор (также унаследованный от TCustomRichViewEdit) поверх ячейки. Во время редактирования все элементы в ячейке перемещаются в этот редактор. После завершения редактирования элементы возвращаются в ячейку.
В любой момент времени документ, содержащий элементы ячейки, доступен с помощью метода cell.GetRVData (если ячейка не редактируется, это сама ячейка; если редактируется, это RVData её редактора).
Этот пример показывает, что ту же процедуру можно применить к ячейкам основного документа и таблицы.
В этом примере весь текст преобразуется в верхний регистр.
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
// это текстовый элемент
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;
Вызов:
AllUpperCase(MyRichView.RVData);
MyRichView.Format;
Та же задача, другой способ
// Эта процедура будет вызвана для каждого элемента документа
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 вызывает переданную процедуру (EnumItems)
// для каждого элемента в RVData, включая поддокументы (ячейки таблиц)
// Второй и третий параметр - данные, заданные программистом,
// они будут переданы в процедуру как параметры UserData1 и UserData2
MyRichView.RVData.EnumItems(EnumItemsProc, v, '');
MyRichView.Format;
Преимущество использования RVData.EnumItems заключается в более понятном и компактном коде.
Недостаток: его нельзя использовать, если нужно добавлять или удалять элементы.