Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2011, 20:43   #1
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию Delphi. Как временно блокировать кнопку?

Вот в чем проблема:

После нажания на _кнопку_ пробегает цикл
Код:
x:=1000000;
for i := 1 to x do progressbar1.Position:=Round(100*i/x);
во время которого предполагается "просто подождать", а далее идет основной код процедуры.

НО, если несколько раз кликнуть на _кнопку_, пока идет цикл, процедура выполняется много раз. Это очень плохо и этого быть не должно.
Выключать _кнопку_ до цикла, и включать после - не помогло.
Обнулять событие onClick у _кнопки_, и возвращать исходное - не помогло.

Подскажите, может есть еще какие-то способы, либо другие варианты реализации этого самого "просто подождать"?
Риндера вне форума Ответить с цитированием
Старый 24.03.2011, 20:57   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

А если так? )
Код:
button.enabled:=false;
x:=1000000;
for i := 1 to x do progressbar1.Position:=Round(100*i/x);
Application.ProcessMessages; {!}
button.enabled:=true;
Son Of Pain вне форума Ответить с цитированием
Старый 24.03.2011, 21:02   #3
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
А если так? )
Благодарствую, так работает.
Пойду гуглить эту строку =)
Риндера вне форума Ответить с цитированием
Старый 24.03.2011, 21:11   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

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

Если просто отключить кнопку до цикла и включить после, пропущенные нажатия сработают после завершения кода обработчика, в этот момент кнопка уже включена. А application.processmessages говорит, что нужно обработать все пропущенные события прямо сейчас (в момент, когда кнопка заблокирована).
Son Of Pain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как блокировать клаву но мышь должна работать? Stasensh Помощь студентам 2 18.06.2010 20:48
Как временно отключить формулы? parsn Microsoft Office Excel 2 12.01.2010 18:32
Как блокировать рекламу плагами FFox'a AgressiveBehavior Свободное общение 1 23.09.2009 14:14