|
<< Нажмите, чтобы показать Содержание >> Пример: разделение таблицы |
function SplitTable(rve: TCustomRichViewEdit;
table: TRVTableItemInfo; RowCountInFirstTable: Integer;
PageBreak: Boolean): Boolean;
var r, c, mr, mc: Integer;
newtable: TRVTableItemInfo;
Stream: TMemoryStream;
begin
Result := False;
if RowCountInFirstTable>=table.RowCount then
exit;
for c := 0 to table.ColCount-1 do
if table.Cells[RowCountInFirstTable, c] = nil then
begin
table.Rows.GetMainCell(RowCountInFirstTable, c, mr, mc);
if mr<RowCountInFirstTable then
exit;
end;
Stream := TMemoryStream.Create;
table.SaveRowsToStream(Stream, RowCountInFirstTable,
table.RowCount-RowCountInFirstTable);
Stream.Position := 0;
newtable := TRVTableItemInfo.CreateEx(0, 0, rve.RVData);
newtable.LoadFromStream(Stream);
if PageBreak then
newtable.PageBreakBefore := True;
Stream.Free;
rve.BeginUndoGroup(rvutModifyItem);
rve.SetUndoGroupMode(True);
try
table.DeleteRows(RowCountInFirstTable,
table.RowCount-RowCountInFirstTable, True);
// GetMyItemNo is the same as rve.GetItemNo(table), but faster
rve.SetSelectionBounds(table.GetMyItemNo, 1, table.GetMyItemNo, 1);
rve.InsertItem('', newtable);
finally
rve.SetUndoGroupMode(False);
end;
Result := True;
end;
Параметры:
rve – редактор, непосредственно содержащий таблицу table;
table – таблица, которую нужно разделить на две.
Значения для передачи в эти два параметра можно получить методом RichViewEdit1.GetCurrentItemEx.
Первая получившаяся таблица будет иметь число строк = RowCountInFirstTable, вторая будет иметь число строк = table.RowCount-RowCountInFirstTable.
Если параметр PageBreak = True, между таблицами будет добавлен разрыв страницы.
Возвращаемое значение: True если таблица была разделена.
Это операция редактирования, она может быть отменена пользователем.
Примечание: подобная операция реализована в Инструментах интерфейса ТРВ (RichViewActions), в команде интерфейса TrvActionTableSplit.