Извините, похоже, у меня снова проблема новичка, но я не нашел ее решения в Интернете или в разделе помощи:
Я хочу использовать событие 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 Я попробую это, может быть, это сработает, но, к сожалению, это будет огромное количество кода, нет ли другого способа обойти эту проблему? В любом случае спасибо
Х.: Это будет очень мало кода.
Обратите внимание, что код в вашем вопросе содержит ошибку. Локальная переменная без подсчета ссылок, такая как i, будет неинициализирована. Он не запустится 0 (если только это не совпадение, которое может меняться время от времени, когда вы запускаете функцию).
@Andreas Rejbrand Спасибо, это был просто пример того, что я имею в виду, на самом деле я не использую этот код, но вы правы, я думаю, это вызовет ошибку, спасибо
На самом деле это настройка операционной системы. Это функция, которую пользователи просили вернуть обратно. Это называется повторной задержкой. Изменение поведения ОС в вашем приложении может вызвать раздражение у ваших пользователей, если, конечно, нажатие этой клавиши не используется для редактирования текста, а для чего-то другого, например, для управления чем-то с помощью WASD.
@ sherlock70 Да, я думаю, это была бы действительно отличная функция, так как это может быть проблемой для всех, кто не хочет кодировать только стандартные вещи.





Я сам не использую Firemonkey, но следующая демонстрация VCL должна быть тривиальной для преобразования в Firemonkey, если вы захотите.
Ставьте TLabel на форму.
Ставьте TTimer на форму. Установите его Interval на 30 и Enabled на False. В событии OnTimer напишите что-то вроде
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Tag := Label1.Tag + 1;
Label1.Caption := Label1.Tag.ToString;
end;
В обработчике OnKeyDown формы напишите
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_SPACE then
Timer1.Enabled := true;
end;
В обработчике OnKeyUp формы напишите
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_SPACE then
Timer1.Enabled := false;
end;
Увеличивайте метку с помощью таймера. Включить/выключить таймер в соответствии с событиями нажатия и нажатия клавиши.