Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Visual Basic - Трюки и Хитрости, советы и ответы на вопросы


Служба Рассылок Subscribe.Ru проекта Citycat.Ru
VB Хитрости - советы и ответы на вопросы

Здравствуйте, уважаемые читатели.
Поздравляю всех с наступившем Новым годом, столетием, тысячелетием.
Лучшие пожелания... :-)

Коротенький совет на сегодня - Вместо использования DoEvents создавайте и используйте свои эвенты

Бывает много ситуаций, когда DoEvents действительно удобно и необходимо. Как вы знаете, при вызове DoEvents операционная система получает время "осмотреться" и выполнить другие действия внутри вашего приложения, например перерисовать окна, или обработать случивщийся эвент приоритет которого был достаточно низок. Часто после инициализации вам нужна пауза , для получения информации от пользователя. К примеру рассмотрим проект из 2-х форм Основния форма производит вычисления и показывает результат . Вторая форма позволяет пользователю ввести 2 числа для вычислений. после клика на кнопке Submit на первой форме происходит перемножение данных чисел и показывается результат.
(Рассматривается ситуация существования двух форм одновременно и независимо друг от друга.)
Эта ситуация может быть реализована в виде цикла ожидания:

Private Sub Command1_Click()
Dim Myform as frmEntry
Set Myform = New frmEntry
With Myform
.Show
Do
DoEvents
Loop Until Myform.Ready
'производим необходимые вычисления
txtResults = .txtNum1 * .txtNum2
End With
Unload frm
Set frm = Nothing
End Sub

Здесь мы используем паблик переменную м именем Ready на форме ввода и она принимает значение TRUE когда пользователь заканчивает ввод чисел . Этот метод всем хорош, однако за Doevents приходится платить свою цену - цикл с использованием Doevents жрет много системных ресурсов.
Лучшая альтернатива этому методу создание custom event, который будет срабатывать после того, как пользователь ввел данные:

Public Event NumbersSubmitted()
Public NumOne As Long
Public NumTwo As Long

Private Sub cmdSubmit_Click()
NumOne = CLng(txtNum1)
NumTwo = CLng(txtNum2)
Unload Me
RaiseEvent NumbersSubmitted
End Sub

После этого вы можете добавить на первую форму код реагирующий на эвент:

Private Sub frmNumEntry_NumbersSubmitted()
With frmNumEntry
'производим необходимые вычисления
txtResults = .NumOne * .NumTwo
Set frmNumEntry = Nothing
End With
End Sub

Здесь frmNumEntry переменная уровня формы обьявленная Withevents
Dim WithEvents frmNumEntry As frmNumberEntry

 

Для тех, у кого есть любые вопросы, имеюшие отношение к тематике Visual Basic, хочу порекомендовать место, где на них можно получить ответ. Причем в течении совершенно разумного и небольшего промежутка времени - от нескольких часов до нескольких дней. Место это - конференция RU.Visual.Basic, расположенная на сайте Visual Basic на русском
Для сомневающихся в эффективности такого метода получения ответов, информирую, что за декабрь месяц среднее ежедневное количество сообщений составлило 65 - общее за месяц - 2031

Хочу поставить в известность всех подписчиков этого листа - лист создается в html , а потом автоматом на Ситикоте из него создается текстовый вариант. Так что, если вы, по ошибке, подписались на текстовую версию - рекомендую изменить этот параметр, так как за качество конвертации я не отвечаю, а создавать отдельную версию у меня не хватает времени. Сорри
Успехов в программировании!

Борис Рудой

Автор сайта - Visual Basic на русском



http://subscribe.ru/
E-mail: ask@subscribe.ru
Поиск

В избранное