Страница: 1 |
Вопрос: Проблема с Command_Click | Добавлено: 04.02.07 08:50 |
Автор вопроса: ![]() |
Вот такой вот код:
Private Sub Command1_Click()
Command1.Enabled = False MsgBox "1" Sleep 3000 Command1.Enabled = True End Sub Если в момент пока длится sleep 3000, а соответственно Command1.Enabled = False, нажать кнопку, то по завершению событие click срабатывает еще раз. Как же сделать так, чтобы кнопка не реагировала на нажатия пока она Enabled = False? Собственно нужно, чтобы во время выполнения кода внутри Command1_Click() нельзя было нажать кнопку еще раз. |
Ответы | Всего ответов: 5 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 262809473 Вопросов: 17 Ответов: 561 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 04.02.07 10:31 |
На сколько я понял, всё дело как раз в sleep.
Наверно тебе больше подойдет вот этот код: Private Sub Command1_Click()
Dim t As Double Command1.Enabled = False MsgBox "1" t = Timer Do While Timer < t + 3: DoEvents: Loop Command1.Enabled = True End Sub |
Номер ответа: 2 Автор ответа: ![]() ![]() ICQ: 249195431 Вопросов: 8 Ответов: 110 |
Профиль | Цитата | #2 | Добавлено: 04.02.07 10:48 |
Из-за Sleep процесс присотанавливается, в результате чего сообщения на твою форму не обрабатываются, а копятся в очереди. Когда процесс снова продолжает работу - он принимает по очереди все сообщения и исполняет их. В принципе ответ Сереги корректен, но я предпочел бы вариант "через задницу" - через API:
Public Sub ClearMessageLoop() Dim M As MSG On Error Resume Next While PeekMessage(M, hwnd, 0, 0, PM_REMOVE) Wend End Sub |
Номер ответа: 3 Автор ответа: ![]() ![]() ICQ: 249195431 Вопросов: 8 Ответов: 110 |
Профиль | Цитата | #3 | Добавлено: 04.02.07 10:49 |
Забыл код клика...
Private Sub Command1_Click() On Error Resume Next Command1.Enabled = False MsgBox "1" Sleep 3000 ClearMessageLoop Command1.Enabled = True End Sub |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 60 Ответов: 808 |
Профиль | Цитата | #4 | Добавлено: 04.02.07 15:49 |
В то время когда
Sleep 3000
все мессаги к окну спящего процесса уходят в очередь Когда сон закончился происходит Command1.Enabled = True
Заканчивается обработка события Command1_Click, изымается следующее сообщение из очереди, так как кнопка уже не засерена, это событие происходит. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 60 Ответов: 808 |
Профиль | Цитата | #5 | Добавлено: 04.02.07 15:53 |
Звиняюсь, невнимательно прочел, там было КАК. Ну, можно юзать вышеописанный способ для очистки очереди событий для кнопки, а можно всунуть таймер, и по окончанию периода юзать Command1.Enabled = True
Или еще проще: Private Sub Command1_Click() On Error Resume Next Command1.Enabled = False MsgBox "1" Sleep 3000 DoEvents Command1.Enabled = True End Sub DoEvents оттягивает все события из очереди и обрабатывает. Так как Command1.Enabled = False ему начхать на клик. |
Страница: 1 |
|