Delphi: Как мне остановить автоматическое повторение клавиш быстрого вызова TAction? - PullRequest
3 голосов
/ 02 февраля 2009

Я использую Delphi TActionList с сочетаниями клавиш для некоторых действий.

Я хочу, чтобы определенные действия не запускались несколько раз с помощью автоповтора клавиатуры, но я не хочу влиять на работу автоповтора глобально. Какой лучший способ сделать это?

Разъяснение : мне все еще нужно обрабатывать несколько быстрых нажатий клавиш - это только * нажатий клавиш, генерируемых автоматическим повторением, которые я хочу игнорировать.

Ответы [ 3 ]

12 голосов
/ 02 февраля 2009

Перехватите сообщения WM_KEYDOWN и посмотрите на бит 30, чтобы убедиться, что он повторяется автоматически. Если это так, просто не передавайте сообщение как обычно, и оно не будет видно.

Вам может потребоваться включить предварительный просмотр ключа формы, чтобы сделать эту работу.

2 голосов
/ 02 февраля 2009

Вы можете удалить 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 .

0 голосов
/ 03 февраля 2009

Вы можете сохранить время последнего использования действия и игнорировать его, если время между ними слишком мало. Для одного действия вы можете сделать так:

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.

...