|
Example: dividing table |
Top Previous Next |
|
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.RowCount-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); // table.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; Parameters: rve – editor directly containing table; table – the table to divide. These two parameters are usually a result of RichViewEdit1.GetCurrentItemEx. The table will be divided into two tables. The first resulting table will have row count = RowCountInFirstTable, the second table will have row count = table.RowCount-RowCountInFirstTable. If PageBreak parameter is True, a page break will be inserted between tables. Return value: True if the table was divided. This is an editing operation, it can be undone and redone by the user. |