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

时间:2016-04-12 22:58:27

标签: delphi click stringgrid

我在Delphi中有一个StringGrid组件。当用户点击固定单元格(标题)时,我想抓住。

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

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

解决方案是什么?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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