3

一部のアクションにショートカットキーを使用して、DelphiTActionListを使用しています。

キーボードの自動リピートによって特定のアクションが複数回トリガーされないようにしたいのですが、自動リピートの動作にグローバルに影響を与えたくありません。これを行うための最良の方法は何ですか?

明確化:私はまだ複数の高速キー押下を処理する必要があります-無視したいのは自動リピートによって生成されたキー押下だけです。

4

3 に答える 3

12

WM_KEYDOWNメッセージを傍受し、ビット 30 を調べて、自動繰り返しかどうかを確認します。そうである場合は、通常どおりメッセージを渡さないでください。メッセージは表示されません。

これを機能させるには、フォーム キー プレビューを有効にする必要がある場合があります。

于 2009-02-02T16:27:21.180 に答える
1

TTimer を削除し、TTimer.Interval を必要な値 (1000 = 1 秒) に設定してから、TActionList で次のようにします。

procedure TfrmMain.ActionList1Execute(Action: TBasicAction; var Handled: Boolean);
begin
  if Timer1.Enabled then 
  begin
    Handled := True;
    Exit;
  end;

  Handled := false; 
  Timer1.Enabled := true;     
end;

また、 Timer.OnTimerでタイマーを無効にすることを忘れないでください。

于 2009-02-02T15:36:18.677 に答える
0

アクションが最後に使用された時間を保存し、その間の時間が短すぎる場合は無視できます。単一のアクションの場合、次のように実行できます。

procedure TForm.FormCreate(const Sender: TObject);
begin
  // ...

  FLastActionTime := Now; // 
end;

proceudure TForm.Action1Execute(const Sender: TObject);
const
  cThreshold = 1/(24*60*60*10); // 0.1 sec
begin
  if Now-FLastActionTime<cThreshold then
    Exit; // Ignore two actions within 0.1 sec
  FLastActionTime := Now;
end;

これをdmajkicのソリューションと組み合わせて、より一般的なアプローチを得ることができます。そして、あなたが本当に野心的であるならば、あなたはTAction/TActionlistの新しいバージョンを作成することができます。

于 2009-02-03T08:48:56.503 に答える