1. 程式人生 > 其它 >delphi使用RichView控制元件 表中選擇

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;