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;
編集:
最後の行が選択されて「下」が押されたとき、または最初の行が選択されて「上」が押されたときに、「OnClick」が起動されないようです。
再現方法:
TStringGrid をフォームに追加し、数行を入力します。「OnClick」および「OnKeyDown」ハンドラーを追加します。これら 2 つのハンドラ メソッドに特定のコードを追加する必要はありません。フォームの stringgrid で行を選択し、キーボードの上矢印または下矢印を押します。
編集2:
これは解決策ではありませんが、up、down、pageup、または pagedown を押した後に「OnClick」のコードが実行されるのを防ぐために、「OnKeyDown」に変数を設定し、どのキーが押されたかを「OnClick」で確認します。
編集3:
スタック トレースと再現方法を更新しました。