如何获取 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.

访问它