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 中的表执行这些操作,则需要一个特殊的步骤顺序:
- 检查
RichViewEdit.CanChange
(对于 TDBRichViewEdit 尤其重要) - 获取表格对象及其在编辑器中的位置(位置定义为该表插入的项目索引+编辑器(可以是根编辑器或单元格就地编辑器,下面简称rve)
- 为表调用
rve.BeginItemModify
- 执行操作
- 调用
rve.EndItemModify
- 调用
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 被修改的项目的索引。
ModifyData 在BeginItemModify
中获得的值
通常在修改表格时使用这个函数。
只有在格式化文档时才必须调用此方法。
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
时它仍然很有用。