![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
KeyPreview [D7, WinXP]
MrBadge © (2011-04-13 12:45:00)Столкнулся со следующей проблемой:
Необходимо, чтобы после нажатия определенной кнопки на форме, форма переставала реагировать на нажатия до определенного момента, причем сразу после нажатия. Однако получается, что пользователь может, например, зажать эту кнопку и программа из процедуры обработки нажатия выходить вообще не будет. Пробовал несколькими способами отключать клавиатуру, ставить KeyPreview:=False, однако, это все не помогает. Знает ли кто-нибудь действенный в этой ситуации способ?
Германн (2011-04-13 16:25:00) [1]
> MrBadge (13.04.11 15:17) [7]
>
> И. Павел, именно так я и делаю, но на процедуру формкипресс
> это никак не влияет и баллы все равно прибавляются бесконечно
> долго, если кнопку не отпускать.
Пора наконец показать код, а то ничего не понятно никому ни здесь, ни на сырцах.
clickmaker (2011-04-13 15:47:00) [2]речь же шла о "нажатия определенной кнопки на форме". А теперь - кнопка на клаве, что-ли?
MrBadge (2011-04-13 15:17:00) [3]И. Павел, именно так я и делаю, но на процедуру формкипресс это никак не влияет и баллы все равно прибавляются бесконечно долго, если кнопку не отпускать.
clickmaker, есть ли способ отключить кнопку на короткий промежуток времени, не пользуясь key:=#0?
И. Павел (2011-04-13 15:09:00) [4]> [4] MrBadge (13.04.11 14:56)
В обработчике нажатия кнопки вызывайте обработчик таймера. А таймер перезапускайте. Т.е:
...KeyPress(...)
Begin
//Проверка правильности, начисление баллов
Timer1.OnTimer;
Timer1.Enabled:=false;
Timer1.Enabled:=true;
end
clickmaker (2011-04-13 15:08:00) [5]> Однако, если он не будет отпускать кнопку
если речь о недопущении повторного нажатия, то кнопку можно просто задизейблить после первого.
MrBadge (2011-04-13 14:56:00) [6]Application.ProcessMessages стоит как раз в той процедуре, которая должна прерывать FormKeyPress. Грубо говоря, ситуация такая: на форме есть таймер, меняющий задания. Если пользователь нажимает кнопку, то в зависимости от верности задания он получает или теряет очко. Однако, если он не будет отпускать кнопку, то задание по таймеру меняться не будет и его очки будут просто постоянно увеличиваться или уменьшаться.
Германн (2011-04-13 13:46:00) [7]
> Знает ли кто-нибудь действенный в этой ситуации способ?
>
Не понятно что это за ситуация.
И. Павел (2011-04-13 13:41:00) [8]> [0] MrBadge (13.04.11 12:45)
Может быть у вас в процедуре обработки нажатия стоит Application.ProcessMessages?
Сам обработчик нажатия выполняется в главном потоке (если других потоков вызывать не будет), и пока он не завершиться, новое сообщение обрабатываться не будет (если не дать для этого явную команду: Application.ProcessMessages).
clickmaker (2011-04-13 13:20:00) [9]> может, например, зажать эту кнопку и программа из процедуры
> обработки нажатия выходить вообще не будет
это как?