1. 程式人生 > 其它 >delphi使用RichView控制元件 表格儲存和複製

delphi使用RichView控制元件 表格儲存和複製

TRichView表格儲存和複製

介紹

很少直接呼叫 TRVTableItemInfo.SaveToStream 。通常將表格儲存到 RVF 檔案或帶有主文件的流中,通過TCustomRichView.SaveRVFToStream方法。

很少直接呼叫 TRVTableItemInfo.LoadFromStream 。 通常表格是從 RVF 檔案或帶有主文件的流中載入的,通過TCustomRichView.LoadRVFFromStream方法。

使用TRVTableItemInfo.SaveToStream實現複製表,使用TRVTableItemInfo.SaveRowsToStream實現複製行。

方法

表儲存到Stream中TRVTableItemInfo.SaveToStream

procedure SaveToStream(Stream: TStream);

將表儲存到 Stream 中。

表的行儲存到Stream中TRVTableItemInfo.SaveRowsToStream

將表的指定行索引(從 IndexIndex+Count-1)儲存到 Stream 中。

procedure SaveRowsToStream(Stream: TStream; Index, Count: Integer);

輸出的StreamSaveToStream 相容。

即使由於單元格合併 RowSpan>1

,存在與IndexIndex+Count-1 這些行重疊的單元格,結果也將是正確的。

從Stream載入表TRVTableItemInfo.LoadFromStream

procedure LoadFromStream(Stream: TStream);

Stream 中載入表。

必須使用 SaveToStreamSaveRowsToStream 方法儲存表。 只有 TRVStyle 中的文字、段落和列表樣式集合與儲存時相同,才能正確載入表格。

例子

複製表格

uses RVTable, RVItem;

procedure TForm1.Button1Click(Sender: TObject);
var
  Table: TRVTableItemInfo;
  Row, Col: Integer;
begin
  //建立5行4列的表格
  Table := TRVTableItemInfo.CreateEx(5, 4, RichViewEdit1.RVData);

  //設定表格邊框和背景色
  Table.Color := clNone;
  Table.BorderStyle := rvtbColor;
  Table.CellBorderStyle := rvtbColor;
  Table.BorderWidth := 1;
  Table.CellBorderWidth := 1;

  //新增表格資料
  for Row := 0 to Table.RowCount - 1 do
    for Col := 0 to Table.ColCount - 1 do
    begin
      Table.Cells[Row, Col].BestWidth := 60;
      Table.Cells[Row, Col].BestHeight := 20;
      Table.Cells[Row, Col].Color := clCream;
      Table.Cells[Row, Col].Clear;
      Table.Cells[Row, Col].AddFmt('%d,%d', [Row, Col], 0, 0);
    end;

  //合併單元格(從第3行第2列開始,合併2行)
  Table.MergeCells(2, 1, 1, 2, True);

  //將表格新增到文件中
  RichViewEdit1.InsertItem('', Table);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Item: TCustomRVItemInfo;
  Table, NewTable: TRVTableItemInfo;
  Rve: TCustomRichViewEdit;
  Stream: TMemoryStream;
begin
  //獲取當前選擇的表格
  if not RichViewEdit1.CanChange or
    not RichViewEdit1.GetCurrentItemEx(TRVTableItemInfo, Rve, Item) then
    Exit;
  Table := TRVTableItemInfo(Item);

  Stream := TMemoryStream.Create;
  try
    //從第3行開始,複製3行表格(複製開始行中包含合併nil的單元格,會將nil主單元格的內容複製)
    Table.SaveRowsToStream(Stream, 2, 3);
    Stream.Position := 0;
    //建立新表格(載入資料會將原先表格中的內容都清除,建立表格時行和列不起作用)
    NewTable := TRVTableItemInfo.CreateEx(3, 3, Rve.RVData);
    //載入複製資料
    NewTable.LoadFromStream(Stream);
    //新增分頁符
    Rve.InsertPageBreak;
    //將表格新增到文件中
    Rve.InsertItem('', NewTable);
  finally
    Stream.Free;
  end;
end;

分表函式

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);
    // table.GetItem 與.GetItem(table) 相同,但速度更快
    rve.SetSelectionBounds(table.GetMyItemNo, 1, table.GetMyItemNo, 1);
    rve.InsertItem('', newtable);
  finally
    rve.SetUndoGroupMode(False);
  end;
  Result := True;
end;

將表分為兩個表。

引數

rve 包含table的編輯器。

table 要劃分的表。

RowCountInFirstTable 第一個表具有的行數。第一個表具有的行數 = RowCountInFirstTable, 第二個表具有的行數 = table.RowCount-RowCountInFirstTable.

PageBreak 如果為 True,將在表之間插入分頁符。

返回值 True 表被劃分。

rvetable可以通過RichViewEdit1.GetCurrentItemEx獲取。

這是一個編輯操作,使用者可以撤銷和重做。