zoukankan      html  css  js  c++  java
  • delphi使用RichView控件 表中选择

    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;
    
  • 相关阅读:
    《Effective Java》读书笔记
    《Effective Java》读书笔记
    《Effective Java》读书笔记
    使用 @Log4j2 log.error() 打印异常日志
    获取min-max之间的随机数
    跨域问题(CORS / Access-Control-Allow-Origin)
    SnowFlakeId 分布式雪花id算法
    订单入库后异步推送
    查看git HEAD
    Java Http POST/GET 情求
  • 原文地址:https://www.cnblogs.com/txgh/p/15517002.html
Copyright © 2011-2022 走看看