我在 Delphi 中有一个 StringGrid 组件。我想捕捉用户单击固定单元格(标题)的时间。
当我将事件绑定FixedCellClick
到网格时,事件只能检测到使用鼠标左键单击。如果我用右键尝试,什么也不会发生。
procedure TForm1.StringGrid1FixedCellClick(Sender: TObject; ACol, ARow: Integer);
begin
ShowMessage('');
end;
解决办法是什么?
我在 Delphi 中有一个 StringGrid 组件。我想捕捉用户单击固定单元格(标题)的时间。
当我将事件绑定FixedCellClick
到网格时,事件只能检测到使用鼠标左键单击。如果我用右键尝试,什么也不会发生。
procedure TForm1.StringGrid1FixedCellClick(Sender: TObject; ACol, ARow: Integer);
begin
ShowMessage('');
end;
解决办法是什么?
TStringGrid
被硬编码为OnFixedCellClick
仅针对左键单击触发事件。右键单击没有事件。您必须修改TStringGrid
的源代码,或者从中派生自定义组件,TStringGrid
以便您可以覆盖虚拟MouseUp()
方法。
如您所见,这些Click
事件通常与鼠标左键操作相关联。为了更一般地处理鼠标按钮事件,这些Mouse
事件更有用。
在这种情况下,您可以使用OnMouseButtonDown事件。
注意: 这并不完全对应于“单击”,因为它是响应初始鼠标按下事件而发生的,而不是可靠地响应控件同一区域中的鼠标按下跟随鼠标向上.
但是,它通常已经足够好了。
OnMouseButtonDown事件包括一个参数,用于标识所涉及Button
的鼠标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;