Страница: 1 |
Страница: 1 |
Вопрос: Проблема с Command_Click
Добавлено: 04.02.07 08:50
Автор вопроса: fm458
Вот такой вот код:
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.
Наверно тебе больше подойдет вот этот код:
Dim t As Double
Command1.Enabled = False
MsgBox "1"
t = Timer
Do While Timer < t + 3: DoEvents: Loop
Command1.Enabled = True
End Sub
Номер ответа: 2
Автор ответа:
Dushes
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
Автор ответа:
Dushes
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
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #4
Добавлено: 04.02.07 15:49
В то время когда
все мессаги к окну спящего процесса уходят в очередь
Когда сон закончился происходит
Заканчивается обработка события Command1_Click, изымается следующее сообщение из очереди, так как кнопка уже не засерена, это событие происходит.
Номер ответа: 5
Автор ответа:
Fever
Вопросов: 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 ему начхать на клик.