TRichView表中选择

介绍

选择类型

表在RichView中被选择类型:

  • 未选择
  • 完全选择(作为多项目选择的一部分)
  • 部分选择(多单元格选择)
  • 单元格内容的某些部分(在单元格中或在 就地编辑器)被选中。

RichView 不支持从其他项目开始并在表格中间完成的选择。 包含多个项目的选择只能完全包含表格(或不包含表格)。

任何处理选择的方法都必须仅在文档为格式化时调用。

多项目选择中的表格

要确定表格是否被完全选中,作为多项目选择的一部分,请使用 RichView.GetSelectionBounds(并将其结果与表格的 GetItemNo 进行比较)。

多单元选择

可以部分选择表格:选择可以从表格的一个单元格开始,到另一个单元格结束。

可以使用 TRVTableItemInfo.GetSelectionBoundsTRVTableItemInfo.GetNormalizedSelectionBounds 方法(后者更方便)确定是否部分选择了表。

可以使用 TRVTableItemInfo.Select 选择表格中的某些单元格,并使用 TRVTableItemInfo.Deselect 删除选择。

可以完全选择某些行或列:TRVTableItemInfo.SelectRowsTRVTableItemInfo.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] 开始。

参数

StartRowStartCol 开始选择单元格索引。

RowOffsColOffs 行偏移和列偏移。

Cells[StartRow, StartCol] 是开始选择的单元格。选择始终包括此单元格。

Cells[StartRow+RowOffs, StartCol+ColOffs]是结束选择的单元格。选择始终包括此单元格。

如果 RowOffs>0,则选择包括下面的 RowOffs 行。 如果 RowOffs<0,则选择包括上面的 abs(RowOffs) 行。ColOffs 也是如此。

无法使用此方法取消选择,因为 Select(StartRow, StartCol, 0,0) 选择了一个单元格,取消使用 TRVTableItemInfo.Deselect

格式化文档时必须调用此方法。

选择单元格后,无法在RichViewEdit编辑器中使用插入符号位置的方法(如InsertTextInsertPicture等),需要设置插入符号位置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;

参数

StartRowStartCol 开始选择单元格索引。

RowOffsColOffs 行偏移和列偏移。

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;

参数

RowCol 指定单元格的位置。

返回值 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,则该函数返回当前编辑单元格的位置(如果没有选择并且某些单元格当前处于编辑状态)。

TopRowTopCol 输出选择的左上角(因为合并,选择并不总是矩形)

ColSpanRowSpan 输出选择包括多少列和行。两个值都 >= 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;

参数

RowCol 接收正在编辑的单元格的位置。

格式化文档时必须调用此方法。

例子

选择单元格

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;