ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

delphi使用RichView控件 表格保存和复制

2021-11-13 12:33:53  阅读:139  来源: 互联网

标签:控件 RichView Stream delphi TRVTableItemInfo 表格 table Table Row


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获取。

这是一个编辑操作,用户可以撤销和重做。

标签:控件,RichView,Stream,delphi,TRVTableItemInfo,表格,table,Table,Row
来源: https://www.cnblogs.com/txgh/p/15547759.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有