为什么 Delphi StringGrid 有时会在OnClick
之后调用事件OnKeyDown
?
调试截图:
我的 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;
编辑:
It seems the 'OnClick' is not being fired when the last line is selected and pushing 'Down' or when the first line is selected and pushing 'Up'.
重现方式:
将 TStringGrid 添加到表单并填充几行。添加“OnClick”和“OnKeyDown”处理程序。这两个处理程序方法中不需要添加特定代码。在表单的字符串网格中选择一行,然后按键盘上的向上或向下箭头。
编辑2:
这不是解决方案,但为了防止在按下向上、向下、向上翻页或向下翻页后执行“OnClick”中的代码,我在“OnKeyDown”中设置了一个变量,并在“OnClick”中检查该变量。
编辑3:
更新了堆栈跟踪和重现方式。