如何获取 TDBGrid.DblClick(Sender: TObject) 上被点击的列?
How to get the clicked column on TDBGrid.DblClick(Sender: TObject)?
使用 TDBGrid 的 OnDblClick 事件时,如何知道双击了哪一列?
使用 OnCellClick 很容易,因为它有一个 TColumn 参数,但在 OnDblClick 上则不然。
OnDblClick
事件不会为您提供有关点击的任何 信息,尤其是点击的位置,更不用说点击了哪个网格单元格。因此,您必须手动确定该信息。
试试这个:
- 通过将
Mouse.CursorPos
传递给 TDBGrid.ScreenToClient()
获取当前鼠标在网格中的位置
- 然后,使用
TDBGrid.MouseCoord()
确定鼠标下方单元格的row/column索引。
- 然后,检查单元格 row/column 是否对应于数据单元格,如果是则使用
TDBGrid.SelectedIndex
属性 索引到 TDBGrid.Columns
属性.
这与 TDBGrid
在触发 OnCellClick
事件时在内部所做的基本相同,只是它响应 MouseUp
事件,它提供鼠标坐标网格,从而跳过上面的第一步。
例如:
type
TDBGridAccess = class(TDBGrid)
end;
procedure TMyForm1.DBGrid1DblClick(Sender: TObject);
var
TitleOffset: Byte;
Pt: TPoint;
Cell: TGridCoord;
Column: TColumn;
begin
TitleOffset := Ord(dgTitles in DBGrid1.Options);
Pt := DBGrid1.ScreenToClient(Mouse.CursorPos);
Cell := DBGrid1.MouseCoord(Pt.X, Pt.Y);
if (Cell.X >= TDBGridAccess(DBGrid1).IndicatorOffset) and (Cell.Y >= TitleOffset) then
begin
Column := DBGrid1.Columns[DBGrid1.SelectedIndex];
// use Column as needed...
end;
end;
更新:根据@UweRaabe 的评论,您应该可以单独使用 TDBGrid.SelectedIndex
:
procedure TMyForm1.DBGrid1DblClick(Sender: TObject);
var
Index: Integer;
Column: TColumn;
begin
Index := DBGrid1.SelectedIndex;
if (Index <> -1) then
begin
Column := DBGrid1.Columns[Index];
// use Column as needed...
end;
end;
在TDBGrid.OnDblClick期间,数据集被定位到被点击的记录并且可以使用TDBGrid.SelectedIndex[=15检索列=] 属性。如果您对底层数据集字段感兴趣,可以直接使用 TDBGrid.SelectedField.
访问它
使用 TDBGrid 的 OnDblClick 事件时,如何知道双击了哪一列?
使用 OnCellClick 很容易,因为它有一个 TColumn 参数,但在 OnDblClick 上则不然。
OnDblClick
事件不会为您提供有关点击的任何 信息,尤其是点击的位置,更不用说点击了哪个网格单元格。因此,您必须手动确定该信息。
试试这个:
- 通过将
Mouse.CursorPos
传递给TDBGrid.ScreenToClient()
获取当前鼠标在网格中的位置
- 然后,使用
TDBGrid.MouseCoord()
确定鼠标下方单元格的row/column索引。 - 然后,检查单元格 row/column 是否对应于数据单元格,如果是则使用
TDBGrid.SelectedIndex
属性 索引到TDBGrid.Columns
属性.
这与 TDBGrid
在触发 OnCellClick
事件时在内部所做的基本相同,只是它响应 MouseUp
事件,它提供鼠标坐标网格,从而跳过上面的第一步。
例如:
type
TDBGridAccess = class(TDBGrid)
end;
procedure TMyForm1.DBGrid1DblClick(Sender: TObject);
var
TitleOffset: Byte;
Pt: TPoint;
Cell: TGridCoord;
Column: TColumn;
begin
TitleOffset := Ord(dgTitles in DBGrid1.Options);
Pt := DBGrid1.ScreenToClient(Mouse.CursorPos);
Cell := DBGrid1.MouseCoord(Pt.X, Pt.Y);
if (Cell.X >= TDBGridAccess(DBGrid1).IndicatorOffset) and (Cell.Y >= TitleOffset) then
begin
Column := DBGrid1.Columns[DBGrid1.SelectedIndex];
// use Column as needed...
end;
end;
更新:根据@UweRaabe 的评论,您应该可以单独使用 TDBGrid.SelectedIndex
:
procedure TMyForm1.DBGrid1DblClick(Sender: TObject);
var
Index: Integer;
Column: TColumn;
begin
Index := DBGrid1.SelectedIndex;
if (Index <> -1) then
begin
Column := DBGrid1.Columns[Index];
// use Column as needed...
end;
end;
在TDBGrid.OnDblClick期间,数据集被定位到被点击的记录并且可以使用TDBGrid.SelectedIndex[=15检索列=] 属性。如果您对底层数据集字段感兴趣,可以直接使用 TDBGrid.SelectedField.
访问它