Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi XE3 stringgrid固定单元格单击事件不';t火_Delphi_Click_Stringgrid - Fatal编程技术网

Delphi XE3 stringgrid固定单元格单击事件不';t火

Delphi XE3 stringgrid固定单元格单击事件不';t火,delphi,click,stringgrid,Delphi,Click,Stringgrid,我在Delphi中有一个StringGrid组件。我想捕捉用户单击固定单元格(标题)的时间 当我将FixedCellClickevent绑定到网格时,event只能使用鼠标左键检测单击。如果我用正确的按钮尝试,什么都不会发生 procedure TForm1.StringGrid1FixedCellClick(Sender: TObject; ACol, ARow: Integer); begin ShowMessage(''); end; 解决方案是什么?TStringGrid被硬编码为

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

当我将
FixedCellClick
event绑定到网格时,event只能使用鼠标左键检测单击。如果我用正确的按钮尝试,什么都不会发生

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

解决方案是什么?

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

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

正如您所发现的,
单击事件通常与鼠标左键操作相关联。要更普遍地处理鼠标按钮事件,
鼠标
事件更有用

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

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

然而,这通常已经足够好了

OnMouseButtonDown事件包括一个参数,用于标识所涉及的
按钮
,以及鼠标的
X
Y
位置。它还包括一个
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;
过程TfrmMain.StringGrid1MouseDown(发送方:TObject;
按钮:tmouse按钮;
换档:t换档状态;
十、 Y:整数);
变量
网格:TStringGrid;
列,行:整数;
fixedCol,fixedRow:布尔值;
开始
grid:=作为TStringGrid的发送方;
如果按钮=mbRight,则
开始
网格鼠标单元(X,Y,col,row);
fixedCol:=col
正如您所发现的,
单击事件通常与鼠标左键操作相关联。要更普遍地处理鼠标按钮事件,
鼠标
事件更有用

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

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

然而,这通常已经足够好了

OnMouseButtonDown事件包括一个参数,用于标识所涉及的
按钮
,以及鼠标的
X
Y
位置。它还包括一个
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;
过程TfrmMain.StringGrid1MouseDown(发送方:TObject;
按钮:tmouse按钮;
换档:t换档状态;
十、 Y:整数);
变量
网格:TStringGrid;
列,行:整数;
fixedCol,fixedRow:布尔值;
开始
grid:=作为TStringGrid的发送方;
如果按钮=mbRight,则
开始
网格鼠标单元(X,Y,col,row);
fixedCol:=col