gpt4 book ai didi

delphi - TStringGrid:为什么 OnClick 在 OnKeyDown 之后

转载 作者:行者123 更新时间:2023-12-01 22:08:34 24 4
gpt4 key购买 nike

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

调试截图:

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”处理程序。这两个处理方法中不需要添加具体的代码。在表单的字符串网格中选择一行,然后按键盘上的向上或向下箭头。

编辑2:

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

编辑3:

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

最佳答案

嗯,硬编码的按键代码并没有做到一点点透明,但是当您使用方向键(上、下、左等)时,您会看到这种效果。 .) 更改选择。

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

到底为什么将焦点改变到另一个单元格会产生点击我不知道,我想我们必须问开发人员。也许是为了通过单击而不是键盘来模拟将焦点更改到另一个单元格时的默认行为。

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

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

关于delphi - TStringGrid:为什么 OnClick 在 OnKeyDown 之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19052773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com