Как я могу изменить задержку перед запуском события OnKeyDown после того, как оно было запущено один раз в Delphi/FMX?

Извините, похоже, у меня снова проблема новичка, но я не нашел ее решения в Интернете или в разделе помощи:

Я хочу использовать событие OnKeyDown, чтобы что-то сделать (разные вещи, поэтому мне нужно общее решение), например, чтобы увеличить число в метке. Мой код для этого будет выглядеть следующим образом:

Var i : Integer = 0;
... 
procedure TExampleForm.FormKeyDown(Sender: TObject; var Key: Word;
var KeyChar: Char; Shift: TShiftState);


begin
  Inc(i);
  ExampleLabel.Text:=IntToStr(i);
end;

Если я нажму и удержу клавишу в реальной программе, она немедленно вызовет событие только один раз, а затем оно будет запускать событие после короткой задержки много раз, как и должно быть: проблема в том, что я не хочу эту задержку после первого срабатывания события и тех, которые вызваны удержанием кнопки. Есть ли способ остановить Delphi (или, возможно, клавиатуру) от такого поведения? Я был бы очень признателен за решение, спасибо за ваше время и усилия!

Увеличивайте метку с помощью таймера. Включить/выключить таймер в соответствии с событиями нажатия и нажатия клавиши.

Andreas Rejbrand 03.03.2019 23:32

@Andreas Rejbrand Я попробую это, может быть, это сработает, но, к сожалению, это будет огромное количество кода, нет ли другого способа обойти эту проблему? В любом случае спасибо

Max H. 03.03.2019 23:35

Х.: Это будет очень мало кода.

Andreas Rejbrand 03.03.2019 23:37

Обратите внимание, что код в вашем вопросе содержит ошибку. Локальная переменная без подсчета ссылок, такая как i, будет неинициализирована. Он не запустится 0 (если только это не совпадение, которое может меняться время от времени, когда вы запускаете функцию).

Andreas Rejbrand 03.03.2019 23:41

@Andreas Rejbrand Спасибо, это был просто пример того, что я имею в виду, на самом деле я не использую этот код, но вы правы, я думаю, это вызовет ошибку, спасибо

Max H. 03.03.2019 23:43

На самом деле это настройка операционной системы. Это функция, которую пользователи просили вернуть обратно. Это называется повторной задержкой. Изменение поведения ОС в вашем приложении может вызвать раздражение у ваших пользователей, если, конечно, нажатие этой клавиши не используется для редактирования текста, а для чего-то другого, например, для управления чем-то с помощью WASD.

Sherlock70 05.03.2019 09:07

@ sherlock70 Да, я думаю, это была бы действительно отличная функция, так как это может быть проблемой для всех, кто не хочет кодировать только стандартные вещи.

Max H. 06.03.2019 15:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
395
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я сам не использую Firemonkey, но следующая демонстрация VCL должна быть тривиальной для преобразования в Firemonkey, если вы захотите.

  1. Ставьте TLabel на форму.

  2. Ставьте TTimer на форму. Установите его Interval на 30 и Enabled на False. В событии OnTimer напишите что-то вроде

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Label1.Tag := Label1.Tag + 1;
      Label1.Caption := Label1.Tag.ToString;
    end;
    
  3. В обработчике OnKeyDown формы напишите

    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if Key = VK_SPACE then
        Timer1.Enabled := true;
    end;
    
  4. В обработчике OnKeyUp формы напишите

    procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      if Key = VK_SPACE then
        Timer1.Enabled := false;
    end;
    

Другие вопросы по теме