delphi使用RichView控件 表格编辑操作

TRichView表格编辑操作

介绍

选择操作

插入行和列:

  • TRVTableItemInfo.InsertColsLeft
  • TRVTableItemInfo.InsertColsRight
  • TRVTableItemInfo.InsertRowsAbove
  • TRVTableItemInfo.InsertRowsBelow

删除行和列:

  • TRVTableItemInfo.DeleteSelectedCols
  • TRVTableItemInfo.DeleteSelectedRows

单元格合并和取消合并:

  • TRVTableItemInfo.MergeSelectedCells (参考 TRVTableItemInfo.CanMergeSelectedCells
  • TRVTableItemInfo.UnmergeSelectedCells
  • TRVTableItemInfo.SplitSelectedCellsHorizontally
  • TRVTableItemInfo.SplitSelectedCellsVertically

其他操作

插入行和列:

  • TRVTableItemInfo.InsertCols
  • TRVTableItemInfo.InsertRows

删除行和列:

  • TRVTableItemInfo.DeleteCols
  • TRVTableItemInfo.DeleteRows

单元格合并和取消合并:

  • TRVTableItemInfo.MergeCells (参考 TRVTableItemInfo.CanMergeCells
  • TRVTableItemInfo.UnmergeCells
  • TRVTableItemInfo.DeleteEmptyRows, TRVTableItemInfo.DeleteEmptyCols (单元格合并后使用)

分配表属性(作为编辑操作)

分配表属性的方法:

TRVTableItemInfo.SetTableVisibleBorders

分配行属性的方法:

TRVTableItemInfo.SetRowVAlign, TRVTableItemInfo.SetRowKeepTogether, TRVTableItemInfo.SetRowPageBreakBefore

分配单元格属性的方法:

  • TRVTableItemInfo.SetCellColor, TRVTableItemInfo.SetCellBorderColor, TRVTableItemInfo.SetCellBorderLightColor
  • TRVTableItemInfo.SetCellVAlign
  • TRVTableItemInfo.SetCellRotation
  • TRVTableItemInfo.SetCellTag
  • TRVTableItemInfo.SetCellBestWidth, TRVTableItemInfo.SetCellBestHeight
  • TRVTableItemInfo.SetCellBackgroundImage, TRVTableItemInfo.SetCellBackgroundImageFileName, TRVTableItemInfo.SetCellBackgroundStyle
  • TRVTableItemInfo.SetCellHint
  • TRVTableItemInfo.SetCellVisibleBorders
  • TRVTableItemInfo.SetCellOpacity
  • TRVTableItemInfo.SetCellOptions

查看器和编辑器中的操作

如果在插入表之前执行了上述操作,则不需要添加任何操作。

如果对插入到TRichView中的表进行这些操作,则需要调用Format方法更新文档视图。

如果对插入到 TRichViewEdit 中的表执行这些操作,则需要一个特殊的步骤顺序:

  1. 检查 RichViewEdit.CanChange (对于 TDBRichViewEdit 尤其重要)
  2. 获取表格对象及其在编辑器中的位置(位置定义为该表插入的项目索引+编辑器(可以是根编辑器或单元格就地编辑器,下面简称rve)
  3. 为表调用 rve.BeginItemModify
  4. 执行操作
  5. 调用 rve.EndItemModify
  6. 调用 rve.Change

撤消/重做

您可以使用 SetUndoGroupMode 对多个操作进行分组,以便将它们作为一个整体撤消/重做

获取表对象

为了对表执行操作,您需要获取表对象。您可以使用TRichView.GetItem方法来完成

TCustomRVItemInfo是RichView所有items的祖先类,包括表格(TRVTableItemInfo)。 此方法可用于任何类型的项目,因此您需要检查它是否为表格(使用is运算符,或检查 RichView.GetItemStyle(ItemNo)=rvsTable

编辑器中的位置

通常情况下,当你需要对编辑器中插入符号位置的项目进行操作时,你不知道当前项目是在根编辑器中,还是在单元格内部,或单元格就地编辑器中,等等。

使用TRichViewEdit.GetCurrentItem方法可以获取插入符号位置的项目,但即使插入符号在表格内,可能当前项目也不是表格,而是单元格就地编辑器中的其他项目!

问题可以用TRichViewEdit.GetCurrentItemEx方法解决,如果在插入符号的位置有给定类别的项目(即插入符号在表格的左侧或右侧),或者如果插入符号在给定类别的项目内(即插入符号在表格单元格中),返回 True ,输出参数ItemRichViewEdit 返回表格所在的编辑器,编辑器可以是根编辑器 或单元格就地编辑器

示例

// MyRichViewEdit:TRichViewEdit 是一个编辑器,在设计时放置在表单上。
// 注意:大部分操作在 rve(由 GetCurrentItemEx 返回的编辑器),不在 MyRichViewEdit 中。
var item: TCustomRVItemInfo;
    table: TRVTableItemInfo;
    Data: Integer;
    rve: TCustomRichViewEdit;
    ItemNo: Integer;
begin
  if not MyRichViewEdit.CanChange or
     not RichViewEdit1.GetCurrentItemEx(TRVTableItemInfo, rve, item) then
    exit;
  table := TRVTableItemInfo(item);
  ItemNo := rve.GetItemNo(table);

  rve.BeginItemModify(ItemNo, Data);
  // 执行一些操作
  rve.EndItemModify(ItemNo, Data);
  rve.Change;
end;

方法

TCustomRichViewEdit.CanChange

能否修改编辑器中的文档。

function CanChange: Boolean;

此函数检查 ReadOnly 属性。

通常在对表格执行操作之前调用此函数,以防止修改处于只读状态的编辑器。

对于TDBRichViewEdit,该函数还将编辑器的数据集转为编辑模式(需要在对表进行操作之前)。

只有在格式化文档时才必须调用此方法。

TCustomRichView.GetItem

function GetItem(ItemNo: Integer): TCustomRVItemInfo;

通过索引 ItemNo 返回文档中一项的对象

参数

ItemNo 项目的索引(从 0 到 ItemCount-1)。

返回值 项目的对象。不要自己释放这个对象。

子文档的项目(表格单元格)不包含在主文档的项目范围内; 对于单元格中的项目,请使用 Cell.GetRVData.GetItem

通常此方法用于获取 表格标签序列脚注尾注对注释的引用 的项目对象。

此方法与 GetItemNo 相反。

TCustomRichView.GetItemNo

通过项目的对象回文档中项目的索引。

function GetItemNo(Item: TCustomRVItemInfo): Integer;

参数

Item 是表示项目的对象。

返回值 项目的索引(从零开始)。

通常此方法用于获取表项的索引。

此方法与 GetItem 相反。

TCustomRichView.GetItemStyle

通过索引 ItemNo 返回项的类型(样式)。

function GetItemStyle(ItemNo: Integer): Integer;

参数

ItemNo 项目的索引(从 0 到 ItemCount-1)。

返回值 如果项目是文本项目,则此函数返回零或正值(样式集合中该项目的文本样式索引Style.TextStyles)。如果该项不是文本项,则此函数返回负值(该项的类型,请参阅 rvs 常量)。

子文档的项目(表格单元格)不包含在主文档的项目范围内; 对于单元格中的项目,请使用 Cell.GetRVData.GetItemStyle

TCustomRichViewEdit.GetCurrentItem

获取表示插入符号位置项目的对象。

function GetCurrentItem: TCustomRVItemInfo;

返回值 插入符号位置项目的对象。

当调用空编辑器时(即 ItemCount=0),该方法返回 nil

如果插入符号位于表格的左侧或右侧,或者选择了多个表格单元格,则返回表格对象。 如果插入符号在表格单元格内,则此方法返回包含在此单元格中的项目。 要在这种情况下获取表,请使用 TCustomRichViewEdit.GetCurrentItemEx

这种方法通常用于处理表格标签序列脚注尾注注释的引用

只有在格式化文档时才必须调用此方法。

TCustomRichViewEdit.GetCurrentItemEx

获取给定类的项目的插入符号位置的对象。

function GetCurrentItemEx(RequiredClass: TCustomRVItemInfoClass;
  out ItemRichViewEdit: TCustomRichViewEdit;
  out Item: TCustomRVItemInfo): Boolean;

参数

RequiredClass 所需的项目类(例如TRVTableItemInfo)。

ItemRichViewEdit 包含此项的编辑器; 它可以是根编辑器,也可以是单元格就地编辑器(如果此项目在另一个表格的单元格中)。

Item 插入符号位置项目的对象。

返回值 获取到给定类的编辑器ItemRichViewEdit 和项目的对象Item,该方法将返回 True

如果是表格,则在以下情况下返回 True

  • 插入符号在表格的右侧或左侧

  • 该表有多个单元格被选择

  • 插入符号位于表格单元格内

在嵌套表的情况下,此方法返回顶级表(Z 顺序中最接近用户的表)。

这种方法通常在处理表格时使用。

只有在格式化文档时才必须调用此方法。

TCustomRichViewEdit.BeginItemModify

存储修改项目后快速重新格式化所需的一些信息。

procedure BeginItemModify(ItemNo: Integer; out ModifyData: Integer);

参数

ItemNo 将被修改的项目的索引。

ModifyData 接收一些格式化信息。 执行修改后,分配给此参数的值应传递给EndItemModify

通常在修改表格时使用这个函数。

只有在格式化文档时才必须调用此方法。

TCustomRichViewEdit.EndItemModify

修改项目后快速重新格式化编辑器。

procedure EndItemModify(ItemNo: Integer; ModifyData: Integer);

参数

ItemNo 被修改的项目的索引。

ModifyDataBeginItemModify中获得的值

通常在修改表格时使用这个函数。

只有在格式化文档时才必须调用此方法。

TRVTableItemInfo.Changed

通知表有关其内容的更新。

procedure Changed;

在对已插入文档的表执行操作后,您应该重新格式化该文档。

它通常由BeginItemModify/EndItemModify(如果表格被插入到TRichViewEdit)或Format(如果表格被插入到TRichView)来完成。

在某些情况下,即使格式化后表格也不会更新。 发生这种情况是因为表不“知道”其中的更改,因此它重用了以前的格式。

表上的大多数操作(包括 TRVTableItemInfo 的所有方法,以及单元格就地编辑器中的编辑操作)“通知”表其内容的变化,从而允许后续重新格式化。 但是对单元格执行的 查看器样式 操作不会“通知”表格,并且重新格式化后无法显示其结果。 可以通过此方法通知表格其内容的变化。

示例

table := TRVTableItemInfo(MyRichView.GetItem(ItemNo));
table.Cells[0,0].Clear;
table.Cells[0,0].AddNL('One more line',0,0);
table.Changed;
MyRichView.Format;

注意:version 1.7 开始,不需要在 Format 之前调用 table.Changed。 但是在使用 BeginItemModify/EndItemModify 时它仍然很有用。

原文地址:https://www.cnblogs.com/txgh/p/15641170.html