delphi使用RichView控制元件 表中選擇
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;