TRichView表中选择
介绍
选择类型
表在RichView中被选择类型:
- 未选择
- 完全选择(作为多项目选择的一部分)
- 部分选择(多单元格选择)
- 单元格内容的某些部分(在单元格中或在 就地编辑器)被选中。
RichView 不支持从其他项目开始并在表格中间完成的选择。 包含多个项目的选择只能完全包含表格(或不包含表格)。
任何处理选择的方法都必须仅在文档为格式化时调用。
多项目选择中的表格
要确定表格是否被完全选中,作为多项目选择的一部分,请使用 RichView.GetSelectionBounds
(并将其结果与表格的 GetItemNo
进行比较)。
多单元选择
可以部分选择表格:选择可以从表格的一个单元格开始,到另一个单元格结束。
可以使用 TRVTableItemInfo.GetSelectionBounds
或 TRVTableItemInfo.GetNormalizedSelectionBounds
方法(后者更方便)确定是否部分选择了表。
可以使用 TRVTableItemInfo.Select
选择表格中的某些单元格,并使用 TRVTableItemInfo.Deselect
删除选择。
可以完全选择某些行或列:TRVTableItemInfo.SelectRows
和 TRVTableItemInfo.SelectCols
。
可以使用 TRVTableItemInfo.IsCellSelected
方法确定给定单元格是否被选中。
单元格内的选择
可以获得 就地编辑器 和当前编辑单元格的位置:TRVTableItemInfo.GetEditedCell
。
在单元格内进行选择之前,需要为其激活就地编辑器(TRichView 没有就地编辑器,但必须在 TRichView 中调用相同的代码,而不仅仅是在 TRichViewEdit 中)。
单元格table.Cells[0,0]内选择的例子
table.EditCell(0,0); table.Cells[0,0].GetRVData.SelectAll;
方法
选择单元格TRVTableItemInfo.Select
procedure Select(StartRow, StartCol, RowOffs, ColOffs: Integer);
此方法选择表格中的单元格范围(矩形,如果没有单元格合并),从单元格Cells[StartRow, StartCol]
开始。
参数
StartRow、StartCol 开始选择单元格索引。
RowOffs、ColOffs 行偏移和列偏移。
Cells[StartRow, StartCol]
是开始选择的单元格。选择始终包括此单元格。
Cells[StartRow+RowOffs, StartCol+ColOffs]
是结束选择的单元格。选择始终包括此单元格。
如果 RowOffs>0,则选择包括下面的 RowOffs 行。 如果 RowOffs<0,则选择包括上面的 abs(RowOffs) 行。ColOffs 也是如此。
无法使用此方法取消选择,因为 Select(StartRow, StartCol, 0,0)
选择了一个单元格,取消使用 TRVTableItemInfo.Deselect
。
格式化文档时必须调用此方法。
选择单元格后,无法在RichViewEdit编辑器中使用插入符号位置的方法(如
InsertText
、InsertPicture
等),需要设置插入符号位置TCustomRichView.SetSelectionBounds
选择行TRVTableItemInfo.SelectRows
选择从 StartRow 开始的 Count 行(向下)
procedure SelectRows(StartRow, Count: Integer);
参数
StartRow 要选择的第一行的索引,范围为 0..RowCount
-1。
Count 要选择的行数。
格式化文档时必须调用此方法。
选择列TRVTableItemInfo.SelectCols
选择从 StartCol 开始的 Count 列(向右)
procedure SelectCols(StartCol, Count: Integer);
参数
StartCol 要选择的第一列的索引,范围为 0..ColCount
-1。
Count 要选择的列数。
格式化文档时必须调用此方法。
取消选择TRVTableItemInfo.Deselect
取消表中选择的单元格。
procedure Deselect;
所有选定的单元格都变为未选中状态。
格式化文档时必须调用此方法。
TRVTableItemInfo.GetSelectionBounds
返回表中的选择。
function GetSelectionBounds(out StartRow, StartCol, RowOffs, ColOffs: Integer): Boolean;
参数
StartRow、StartCol 开始选择单元格索引。
RowOffs、ColOffs 行偏移和列偏移。
Cells[StartRow, StartCol]
是开始选择的单元格。选择始终包括此单元格。
Cells[StartRow+RowOffs, StartCol+ColOffs]
是结束选择的单元格。选择始终包括此单元格。
如果 RowOffs>0,则选择包括下面的 RowOffs 行。 如果 RowOffs<0,则选择包括上面的 abs(RowOffs) 行。ColOffs 也是如此。
返回值 True 选择存在, False 选择不存在。
格式化文档时必须调用此方法。
因为合并,选择可能不具有矩形形状。 某些操作仅适用于矩形选择(例如,单元格合并)。 可以使用 CanMergeSelectedCells
进行检查。
此方法返回选择的内部存储信息。 对于实际使用,GetNormalizedSelectionBounds
更方便。
例如,返回值 (3,3,0,0) 表示只选择了一个单元格:
Cells[3,3]
。由于单元格合并,选择的这些单元格可能是 nil。
单元格是否选中TRVTableItemInfo.IsCellSelected
返回指定的单元格是否被选中。
function IsCellSelected(Row, Col: Integer): Boolean;
参数
Row、Col 指定单元格的位置。
返回值 True 单元格被选中,False 单元格未选中。
格式化文档时必须调用此方法。
遍历所有选定单元格的例子
for r := 0 to table.RowCount-1 do for c := 0 to table.ColCount-1 do if (table.Cells[r,c]<>nil) and table.IsCellSelected(r,c) then ...
得到标准化选择范围TRVTableItemInfo.GetNormalizedSelectionBounds
function GetNormalizedSelectionBounds(IncludeEditedCell: Boolean;
out TopRow, LeftCol, ColSpan, RowSpan: Integer): Boolean;
以方便的形式返回表中的选择范围。
参数
IncludeEditedCell 如果为True,则该函数返回当前编辑单元格的位置(如果没有选择并且某些单元格当前处于编辑状态)。
TopRow、TopCol 输出选择的左上角(因为合并,选择并不总是矩形)
ColSpan、RowSpan 输出选择包括多少列和行。两个值都 >= 1。
返回值 True 选择存在,False 选择不存在。
某些操作仅适用于矩形选择(例如,单元格合并)。 可以使用 CanMergeSelectedCells
进行检查。
格式化文档时必须调用此方法。
遍历所有选定单元格的错误例子
for r := TopRow to TopRow + RowSpan - 1 do for c := LeftCol to TopCol + ColSpan - 1 do if table.Cells[r,c]<>nil then ...
此循环可能会遗漏某些选定的单元格,因为 LeftCol 的左侧和 TopRow 的顶部可能有一些单元格,这些单元格也因合并跨越而处于选中状态。
返回当前编辑单元格TRVTableItemInfo.GetEditedCell
返回当前编辑的单元格的 就地编辑器,如果没有这样的单元格,则返回 nil。
function GetEditedCell(out Row,Col: Integer): TCustomRichViewEdit;
参数
Row 、 Col 接收正在编辑的单元格的位置。
格式化文档时必须调用此方法。
例子
选择单元格
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;
//合并单元格,将[2,2]与[2,3]合并
Table.MergeCells(2, 2, 1, 2, True);
//将表格添加到文档中
RichViewEdit1.InsertItem('', Table);
//选择[2,1]到[1,2]形成的矩形
//因为[2,2]与[2,3]合并,导致选择并不是矩形
Table.Select(2, 1, -1, 1);
end;
设置选中单元格颜色
uses RVTable, RVItem;
procedure TForm1.Button2Click(Sender: TObject);
var
Item: TCustomRVItemInfo;
Table: TRVTableItemInfo;
Data: Integer;
Rve: TCustomRichViewEdit;
ItemNo: Integer;
Row, Col: Integer;
begin
//获取当前选择的表格
if not RichViewEdit1.CanChange or
not RichViewEdit1.GetCurrentItemEx(TRVTableItemInfo, Rve, Item) then
Exit;
Table := TRVTableItemInfo(Item);
ItemNo := Rve.GetItemNo(Table);
Rve.BeginItemModify(ItemNo, Data);
//遍历选择单元格
for Row := 0 to Table.RowCount - 1 do
for Col := 0 to Table.ColCount - 1 do
if (Table.Cells[Row, Col] <> nil) and
Table.IsCellSelected(Row, Col) then
begin
Table.SetCellColor(clRed, Row, Col);
end;
Rve.EndItemModify(ItemNo, Data);
Rve.Change;
end;
获取选择信息
uses RVTable, RVItem;
procedure TForm1.Button3Click(Sender: TObject);
var
Item: TCustomRVItemInfo;
Table: TRVTableItemInfo;
Rve: TCustomRichViewEdit;
ItemNo: Integer;
StartRow1, StartCol1, RowOffs1, ColOffs1: Integer;
StartRow2, StartCol2, RowOffs2, ColOffs2: Integer;
begin
//获取当前选择的表格
if not RichViewEdit1.CanChange or
not RichViewEdit1.GetCurrentItemEx(TRVTableItemInfo, Rve, Item) then
Exit;
Table := TRVTableItemInfo(Item);
ItemNo := Rve.GetItemNo(Table);
//获取选择信息
Table.GetSelectionBounds(StartRow1, StartCol1, RowOffs1, ColOffs1);
//获取选择范围
Table.GetNormalizedSelectionBounds(False, StartRow2, StartCol2, RowOffs2, ColOffs2);
//取消表格选择
Table.Deselect;
//将插入点移动到表格后
RichViewEdit1.SetSelectionBounds(ItemNo, 1, ItemNo, 1);
//输出选择信息和选择范围
RichViewEdit1.InsertText('选择信息 StartRow=' + IntToStr(StartRow1) +
' StartCol=' + IntToStr(StartCol1) + ' RowOffs=' + IntToStr(RowOffs1) + ' ColOffs=' + IntToStr(ColOffs1));
RichViewEdit1.InsertText(#13#10);
RichViewEdit1.InsertText('选择范围 StartRow=' + IntToStr(StartRow2) +
' StartCol=' + IntToStr(StartCol2) + ' RowOffs=' + IntToStr(RowOffs2) + ' ColOffs=' + IntToStr(ColOffs2));
end;