TStringGrid:为什么在OnKeyDown之后OnClick

时间:2013-09-27 14:03:36

标签: delphi onclick onkeydown tstringgrid

为什么Delphi StringGrid有时会在OnClick之后调用OnKeyDown事件?

调试屏幕截图:

enter image description here

我的OnKeyDown事件处理程序:

var
  Top: Integer;
  Bottom: Integer;
  CurrentRow: Integer;
begin
  Top := Grid.TopRow;
  Bottom := Grid.TopRow + Grid.VisibleRowCount - 1;
  if (Key = 38) then CurrentRow := Grid.Row - 1
  else if (Key = 40) then CurrentRow := Grid.Row + 1;

  // Disable OnClick because sometimes a 'TStringGrid.Click' is called anyway...
  // (when clicking on form top window bar and navigating)
  Grid.OnClick := nil; 

  if (CurrentRow < Top - 1) or (CurrentRow > Bottom + 1) then begin
     if (Key = 38) then Grid.Row := Bottom
     else if (Key = 40) then Grid.Row := Top;
  end;
  Grid.OnClick := GridClick;
end;

修改

当选择最后一行并按下“向下”或选择第一行并按“向上”时,似乎没有触发'OnClick'。

重现方式:

将TStringGrid添加到表单并填充几行。添加'OnClick'和'OnKeyDown'处理程序。在这两个处理程序方法中不需要添加特定代码。在表单上的stringgrid中选择一行,然后按键盘上的向上或向下箭头。

编辑2:

这不是解决方案,但是为了防止在按下向上,向下,向上翻页或向下翻页后执行'OnClick'中的代码,我在'OnKeyDown'中设置了一个变量,按下了什么键,并检查'​​中的变量'的OnClick”。

编辑3:

更新了堆栈跟踪和重现方式。

1 个答案:

答案 0 :(得分:4)

嗯,那些硬编码的密钥代码不是透明度最低的情况,但是当您使用方向键(向上,向下,向左等)时,您会看到此效果 ...)改变选择。

为什么调用OnClick事件处理程序,是因为TCustomGrid.OnKeyDown调用TCustomGrid.FocusCell,调用Click

正是为什么将焦点转移到另一个单元格会建立点击我不知道,我们不得不问我想象的开发人员。也许通过单击而不是键盘来模拟将焦点更改为另一个单元格时的默认行为。

由于您似乎自己处理方向键按下,也许您可​​以考虑通过忽略密钥来防止这种情况发生:

  if Key in [VK_PRIOR..VK_DOWN] then
    Key := 0;