1

我在 Delphi 中有一个 StringGrid 组件。我想捕捉用户单击固定单元格(标题)的时间。

当我将事件绑定FixedCellClick到网格时,事件只能检测到使用鼠标左键单击。如果我用右键尝试,什么也不会发生。

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

解决办法是什么?

4

2 回答 2

2

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

于 2016-04-13T00:13:28.193 回答
2

如您所见,这些Click事件通常与鼠标左键操作相关联。为了更一般地处理鼠标按钮事件,这些Mouse事件更有用。

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

注意: 这并不完全对应于“单击”,因为它是响应初始鼠标按下事件而发生的,而不是可靠地响应控件同一区域中的鼠标按下跟随鼠标向上.

但是,它通常已经足够好了。

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

您可以使用这些来检测在固定行/列中按下的鼠标右键:

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;
于 2016-04-13T00:13:49.640 回答