Delphi XE3 stringgrid 固定单元格点击事件不触发

Delphi XE3 stringgrid fixed cell click event doesn't fire

我在 Delphi 中有一个 StringGrid 组件。我想在用户点击固定单元格(header)时捕捉到。

当我将FixedCellClick事件绑定到网格时,事件只能检测到鼠标左键的点击。如果我尝试使用右键,没有任何反应。

procedure TForm1.StringGrid1FixedCellClick(Sender: TObject; ACol, ARow: Integer);
begin
  ShowMessage('');
end;

解决方法是什么?

TStringGrid 被硬编码为仅在单击左键时触发 OnFixedCellClick 事件。右键单击没有事件。您将不得不修改 TStringGrid 的源代码,或者从 TStringGrid 派生自定义组件,以便您可以覆盖虚拟 MouseUp() 方法。

如您所见,Click 事件通常与鼠标左键操作相关联。要更普遍地处理鼠标按钮事件,Mouse 事件更有用。

在这种情况下,您可以使用 OnMouseButtonDown 事件。

注意:这并不完全对应于"click",因为它是响应初始鼠标按下事件而发生的,而不是可靠地响应控件同一区域中的鼠标按下和鼠标弹起。

然而,它通常已经足够好了。

OnMouseButtonDown 事件包含一个参数,用于标识所涉及的 Button 以及鼠标 XY 位置。它还包括一个 ShiftState 来检测事件期间的 Ctrl and/or Shift 键状态(如果相关)。

您可以使用这些来检测在固定 rows/columns:

中按下的鼠标右键
procedure TfrmMain.StringGrid1MouseDown(Sender: TObject;
                                        Button: TMouseButton;
                                        Shift: TShiftState;
                                        X, Y: Integer);
var
  grid: TStringGrid;
  col, row: Integer;
  fixedCol, fixedRow: Boolean;
begin
  grid := Sender as TStringGrid;

  if Button = mbRight then
  begin
    grid.MouseToCell(X, Y, col, row);

    fixedCol := col < grid.FixedCols;
    fixedRow := row < grid.FixedRows;

    if   (fixedCol and fixedRow) then
      // Right-click in "header hub"

    else if fixedRow then
      // Right-click in a "column header"

    else if fixedCol then
      // Right-click in a "row header"

    else
      // Right-click in a non-fixed cell
  end;
end;