[Example] How to replicate table rows

Demos, code samples. Only questions related to the existing topics are allowed here.
Post Reply
Sergey Tkachenko
Site Admin
Posts: 17564
Joined: Sat Aug 27, 2005 10:28 am
Contact:

[Example] How to replicate table rows

Post by Sergey Tkachenko »

The function below replicates rows of the current table in rve, Count times. New rows are added to the end of the table.
Heading rows are not replicated.
The function replicates the table structure, cell and row attributes, default text and paragraph styles in cells. It does not replicate cells contents.

This operation is undoable.

Code: Select all

function ReplicateRowsInCurrentTable(rve: TCustomRichViewEdit; Count: Integer): Boolean;
var Table: TRVTableItemInfo;
    StartRow, i, r, c, RowCount, Data, SourceRow, DestRow: Integer;
    DestCell, SourceCell: TRVTableCellData;
begin
  Result := rve.GetCurrentItemEx(TRVTableItemInfo, rve, TCustomRVItemInfo(Table));
  if not Result then
    exit;
  if table.CanUseHeadingRowCount then
    StartRow := Table.HeadingRowCount
  else
    StartRow := 0;
  RowCount := Table.RowCount-StartRow;
  Result := RowCount>0;
  if not Result then
    exit;
  Result := rve.CanChange;
  if not Result then
    exit;
  rve.BeginUndoGroup(rvutModifyItem);
  rve.SetUndoGroupMode(True);
  rve.BeginItemModify(Table.GetMyItemNo, Data);
  try
    table.InsertRows(table.RowCount, RowCount*Count, -1, False);
    for i := 0 to Count-1 do
      for r := 0 to RowCount-1 do begin
        SourceRow := StartRow+r;
        DestRow := StartRow+(i+1)*RowCount+r;
        for c := 0 to Table.ColCount-1 do begin
          SourceCell := Table.Cells[SourceRow,c];
          if (SourceCell<>nil) then begin
            if (SourceCell.ColSpan>1) or (SourceCell.RowSpan>1) then
              Table.MergeCells(DestRow,c, SourceCell.ColSpan, SourceCell.RowSpan, False);
            DestCell := Table.Cells[DestRow,c];
            DestCell.AssignAttributesFrom(SourceCell, True, 1, 1);
            DestCell.Clear;
            DestCell.AddNL('', SourceCell.GetFirstTextStyleNo(True), SourceCell.GetFirstParaStyleNo);
          end;
        end;
        table.Rows[DestRow].PageBreakBefore := table.Rows[SourceRow].PageBreakBefore;
        table.Rows[DestRow].KeepTogether := table.Rows[SourceRow].KeepTogether;
        table.Rows[DestRow].VAlign := table.Rows[SourceRow].VAlign;
      end;
     table.DeleteEmptyRows;
     table.DeleteEmptyCols;
  finally
    rve.SetUndoGroupMode(False);
    rve.EndItemModify(Table.GetMyItemNo, Data);
    rve.Change;
  end;
end;
The function returns True on successful replication.
Possible reasons for a failure:
- the current item is not a table
- no non-heading rows in the table
- text protection or read-only mode

Example
Before:
Image
After calling ReplicateRowsInCurrentTable(RichViewEdit1, 10):
Image
Post Reply