Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Проблема с Command_Click Добавлено: 04.02.07 08:50  

Автор вопроса:  fm458
Вот такой вот код:

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-сайт: houselab.narod.ru
 Профиль | | #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
Автор ответа:
 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
В то время когда
Sleep 3000

все мессаги к окну спящего процесса уходят в очередь
Когда сон закончился происходит
Command1.Enabled = True

Заканчивается обработка события 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 ему начхать на клик.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам