Дельфы:Как мне остановить автоматическое повторение сочетаний клавиш TAction?
-
20-08-2019 - |
Вопрос
Я использую тактический список Delphi с сочетаниями клавиш для некоторых действий.
Я хочу предотвратить многократное выполнение определенных действий с помощью автоматического повтора с клавиатуры, но я делаю не хотите повлиять на операцию автоматического повтора глобально.Каков наилучший способ сделать это?
Разъяснение:Мне все еще нужно обрабатывать несколько быстрых нажатий клавиш - это Только нажатия клавиш, сгенерированные с помощью автоповтора, которые я хочу проигнорировать.
Решение
Перехватить WM_KEYDOWN сообщения, и посмотрите на бит 30, чтобы увидеть, автоматически ли он повторяется.Если это так, просто не передавайте сообщение, как обычно, и оно не будет замечено.
Возможно, вам потребуется включить предварительный просмотр ключа формы, чтобы это сработало.
Другие советы
Вы можете удалить TTimer, установить TTimer.Интервал равен нужному вам значению (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;
Также не забудьте отключить таймер в Таймер.Таймер включения.
Вы можете сохранить время последнего использования действия и проигнорировать его, если промежуток времени между ними слишком мал.Для одного действия вы можете выполнить следующее:
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.