Компоненты, документы, элементы ТРВ-Редактора (TRichView)

<< Нажмите, чтобы показать Содержание >>

Компоненты, документы, элементы ТРВ-Редактора (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 её редактора).

Пример 1

Этот пример показывает, что ту же процедуру можно применить к ячейкам основного документа и таблицы.

В этом примере весь текст преобразуется в верхний регистр.

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;

 

Пример 2

Та же задача, другой способ

// Эта процедура будет вызвана для каждого элемента документа

procedure TForm1.EnumItemsProc(RVData: TCustomRVData;

  ItemNo: Integer;  var UserData1: Integer;

  const UserData2: TRVUnicodeStringvar 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 заключается в более понятном и компактном коде.

Недостаток: его нельзя использовать, если нужно добавлять или удалять элементы.