В данном посте мы научимся вставлять таблицы, используя TRichViewActions, редактировать их, добавлять колонки, ряды и удалять их. Будет представлен подход, совмещающий дизайнтайм и рантайм.
Я уже писал про добавление таблиц в TRichViewEditor, там был пример вставки таблицы программно, с заданием различных атрибутов, как то ширина границы и так далее. Немного поработав с таблицами в TRichView, я сделал вывод, что лучше всего совмещать программный способ и дизайнтайм.
Добавление таблицы
Добавим кнопку Table
в наш пример и напишем следующий код…
В секции private добавим…
1 2 3 4 5 |
... FTablePrefix:string; FTableNumber:integer; FTableList:TStringList; ... |
Будем вести учет таблиц, это нужно для того, чтобы при изменении свойств границ таблиц, и при последующей вставке таблиц – обновление свойств границ (“нормализация”) изменялось бы только для вновь добавленных.
В FormCreate
1 2 3 4 5 |
... FTableList:=TStringList.Create; FTablePrefix:='table'; FTableNumber:=0; ... |
В FormDestroy
1 2 3 4 |
procedure TMainForm.FormDestroy(Sender: TObject); begin FreeAndNil(FTableList); end; |
Код обработки кнопки Table. Если таблица не выделена – вызывается диалог создания таблицы, если выделена – вызывается диалог настройки таблицы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
procedure TMainForm.btnTableClick(Sender: TObject); var i:integer; begin // Если таблица... if richviewEdit1.GetCurrentItem.StyleNo=-60 then begin //Если таблица - идем в ее свойства rvActionsResource.rvActionTableProperties1.ExecuteTarget(RichViewEdit1); end else begin //Если не таблица - вызываем диалог создания таблицы rvActionsResource.rvActionInsertTable1.ExecuteTarget(RichViewEdit1); inc(FTableNumber); FTableList.Add(FTablePrefix+FTableNumber.ToString); // Делаем границы таблицы "нормальными", как в Ворде, только для вновь вставляемых таблиц!!! //Сверяемся со списком FTableList, если вставляемой таблицы там нет, тогда нормализуем границы for i := 0 to RichViewEdit1.ItemCount-1 do begin if ((RichViewEdit1.GetItem(i).StyleNo=-60)) and (FTableList.IndexOf(RichViewEdit1.GetItemTag(i))=-1) then NormalizeTableBorders(i); end; end; // end; |
Вспомогательная процедура “нормализации границ таблицы”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
procedure TMainForm.NormalizeTableBorders(i: Integer); var table: TRVTableItemInfo; begin table := RichViewEdit1.GetItem(i) as TRVTableItemInfo; RichViewEdit1.SetItemTag(i, FTableList[FTableList.Count - 1]); //Настройка таблицы table.BorderWidth := 0; //table.BorderColor:=clBlack; table.BorderStyle := rvtbColor; // Настройка ячеек таблицы table.CellBorderWidth := 1; // table.CellBorderColor:=clBlack; table.CellBorderStyle := rvtbColor; table.CellVSpacing := -1; table.CellHSpacing := -1; RichViewEdit1.ReformatAll; end; |
Как это работает?
Если никакая таблица не выделена при нажатии появляется диалог создания таблицы…
И таблица вставляется
Если таблица выделена , то появляется диалог настройки таблицы
Можно ли сделать проще?
Можно, подключив к кнопкам TableInsert и TableSettings, через свойство Actions команды
rvActionsResource.rvActionInsertTable1
rvActionsResource.rvActionTableProperties1
мы получаем короткое решение вопроса “Как добавить таблицу в TRichView и настроить её?”.
Но тогда, во первых, нужно 2 кнопки вместо одной, а во вторых таблица будет рисоваться вот так… С двойными рамками.
Обратите внимание на рамки. Таблицы в TRichView построены по модели HTML, то есть есть рамки у ячеек и у самой таблицы и они как-то взаимодействуют. Чтобы привести их в адекватный “вордовский”, привычный вид, я и написал этот код, который привел в начале поста.