1. Компьютерные новости
- Microsoft официально представляет Office XP
2. VB: Советы разработчику
- В циклах лучше используйте GetInputState
3. Новости Relib.com
- VB: Темы обсуждения
- ASP: Темы обсуждения
- Java: Темы обсуждения
- БД: Темы обсуждения
С 1 по 30 июня Relib.com и Издательство "Питер" проводят конкурс-викторину для программистов Visual Basic с розыгрышем книг о программировании. Подробнее...
31.05.01 Microsoft официально выпустит очередную версию своего набора офисных программ - Office XP. Презентацию нового продукта своей компании проведёт сам основатель компании Билл Гейтс. Помимо Нью-Йорка, где выступит Гейтс, Microsoft представит Office XP в более чем сотне городов по всему миру.
Новый Office появится в продаже в 15 странах, однако сказать, каковы будут объёмы поставок, пока сложно. Microsoft воздерживается от упоминаний конкретных цифр, не сообщая ни сколько копий продукта выпущено, ни каковы окажутся затраты на рекламную кампанию. Впрочем, можно быть уверенным, что они будут немалыми - ставки довольно высоки.
Некоторые разработчики предлагают использовать в циклах функцию DoEvents, чтобы приложение могло реагировать на какие-либо события. Однако это не всегда целесообразно. Так, если цикл короткий, функция DoEvents и не нужна, а если длинный, то использование этой функции может нанести ущерб быстродействию приложения. А что же делать, если необходимо, чтобы пользователь имел возможность щелкнуть мышью на кнопке Cancel (Отмена) или выполнить какое-либо другое действие в процессе выполнения цикла?
Решение этой проблемы возможно путем использования функции Windows API GetInputState, которая возвращает 1, если пользователь щелкает на кнопке мышью или нажимает клавишу на клавиатуре. Применение этой функции требует намного меньше ресурсов, чем при работе с DoEvents, поэтому цикл выполняется быстрее.
Однако если щелчок мыши или нажатие клавиши инициирует выполнение некоторого события, то следует вызывать функцию DoEvents. Другими словами, вызывайте DoEvents только в том случае, если вам действительно необходимо обработать это событие. При этом вы можете уменьшить использование ресурсов, осуществляя проверку каждые x итераций (конкретное число зависит от того, сколько времени занимает выполнение цикла):
Option Explicit
Private Declare Function GetInputState Lib "user32" () As Long
Private m_UserCancel As Boolean
Private Sub cmdCancel_Click()
m_UserCancel = True
End Sub
Private Sub cmdGo_Click()
Dim lCounter As Long
m_UserCancel = False
Me.MousePointer = vbHourglass
For lCounter = 0 To 10000000
' любой длинный цикл,
' который необходимо прервать
If lCounter Mod 100 Then
If GetInputState <> 0 Then
' событие, инициируемое щелчком мыши
' или нажатием клавиши, находится в
'очереди сообщений, поэтому вызываем
' функцию DoEvents,чтобы начать обработку
' этого события
DoEvents
If m_UserCancel Then Exit For
End If
End If
Next lCounter
Me.MousePointer = vbDefault
End Sub