В процессе разработки мультиплатформенного приложения на Delphi XE7 возникает необходимость использования горячих клавиш (shortcuts) для ускорения работы с программой. Компоненты TActionList, TMainMenu и TMenuBar предоставляют возможность назначения таких клавиш. Однако, стандартное поведение системы заключается в том, что при удержании комбинации клавиш событие горячей клавиши может срабатывать многократно, что не всегда желательно.
Примером может служить создание новой вкладки в TTabControl с использованием комбинации Ctrl+T. При удержании этих клавиш, программа будет создавать новые вкладки непрерывно, что не является желаемым поведением.
Решение проблемы
Для решения данной проблемы можно использовать различные подходы. Один из них — использование таймера для предотвращения многократного выполнения действий. Ниже представлен пример кода на Object Pascal, который демонстрирует, как можно реализовать такую функциональность:
const
// Интервал, после которого действие может быть выполнено снова
ActionCooldownValue = 100; // Значение должно быть больше задержки автоповтора клавиш системы
procedure TForm2.MyActionExecute(Sender: TObject);
begin
// Код действия, которое должно быть выполнено
// ...
// Установка тега действия в значение задержки (мс до следующего возможного использования)
TAction(Sender).Tag := ActionCooldownValue;
end;
procedure TForm2.ActionList1Execute(Action: TBasicAction; var Handled: Boolean);
begin
// Проверка, можно ли выполнить действие
if Action.Tag = 0 then
begin
// Установка Handled в False для запуска события OnExecute конкретного действия
Handled := False;
end
else
begin
// Сброс задержки. Пользователь должен подождать указанное количество миллисекунд после отпускания комбинации клавиш
Action.Tag := ActionCooldownValue;
// Установка Handled в True для предотвращения выполнения события OnExecute
Handled := True;
end;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
var
Action: TContainedAction;
begin
// Перебор всех действий в списке действий
for Action in ActionList1 do
begin
// Проверка, не истекла ли задержка
if Action.Tag > 0 then
// Уменьшение задержки на 1
Action.Tag := Action.Tag - 1;
end;
end;
NOTE: Установите интервал таймера в 1 мс. И не забудьте установить ActionCooldownValue больше, чем задержка автоповтора клавиш системы.
Альтернативный подход
В качестве альтернативы, можно использовать флаг для отключения многократного срабатывания. Выполнение действия происходит только если флаг включен. Флаг следует установить в состояние "выключено" после обработки действия и сбросить при событии отпускания клавиши.
Заключение
Использование таймера — это один из способов решения проблемы многократного выполнения действий при удержании комбинации клавиш. Важно правильно настроить интервал таймера и значение задержки, чтобы пользователь мог быстро выполнять последовательные действия, не испытывая дискомфорта от задержки реакции программы.
Этот пример кода можно адаптировать под свои нужды, изменяя интервал задержки и настраивая поведение таймера.
В процессе разработки на Delphi XE7 возникает необходимость предотвращения многократного выполнения действий при удержании горячих клавиш.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS