3

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:

スタック トレースと再現方法を更新しました。

4

1 に答える 1

5

ハードコードされたキーコードは、最小ビットを透明にするわけではありませんが、方向キー (上、下、左など...) を使用して選択を変更すると、この効果が見られます。

OnClickイベント ハンドラが呼び出される理由はTCustomGrid.OnKeyDownTCustomGrid.FocusCellを呼び出すためClickです。

フォーカスを別のセルに変更するとクリックが確立される正確な理由はわかりませんが、私が想像する開発者に尋ねる必要があります。おそらく、キーボードの代わりにクリックしてフォーカスを別のセルに変更するときのデフォルトの動作をシミュレートするためです。

方向キーの押下を自分で処理しているように見えるので、これ以上キーを無視することで、これがまったく起こらないようにすることを検討できます:

  if Key in [VK_PRIOR..VK_DOWN] then
    Key := 0;
于 2013-09-27T15:21:46.837 に答える