Оператор WithEvents позволяет выполнять действия, сопряженные с событиями формы или ее инструментами (Controls)
Пример использования WithEvents Оператор WithEvents позволяет выполнять действия, сопряженные с событиями формы или ее инструментами (Controls), вне модуля формы, другими словами, делает возможным выделить логику реагирования на события в отдельный модуль класса. Вот то, что, на мой взгляд, может дать такая техника программирования: - Повторное использование программного кода; - Разработка универсальных форм, в которых реакция на действия пользователя не определена жестко, а может зависеть, как от приложения в целом, в котором эта форма используется, так и от контекста вызова такой формы; - Создание специальных модулей класса, симулирующих поведение ActiveX инструментов. Для иллюстрации использования WithEvents мною написан пример “Пользовательское окно поиска”. Ниже следуют некоторые пояснения к примеру. Пользовательское окно поиска FrmData – форма “Данные”, основанная на произвольных данных таблицы tblData ClassMyData – модуль класса, написанный для этой формы FrmSearch – форма для задания параметров поиска Логика реагирования на событие “Нажатие кнопки Поиск” выделена в модуль класса ClassMyData. Для привязки этого модуля используется следующий код ClassMyData: Private WithEvents cmdFind As CommandButton Public Property Set FindButton(ByVal NewValue As CommandButton) Set cmdFind = NewValue cmdFind.OnClick = "[Event Procedure]" End Property Форма “Данные”: Private clsMy As ClassMyData Private Sub Form_Load() Set clsMy = New ClassMyData Set clsMy.FindButton = Me.cmdFind End Sub
Private Sub Form_Unload(Cancel As Integer) Set clsMy = Nothing End Sub
|
Обратите внимание, что после того, как в модуле класса была объявлена объектная переменная типа CommandButton, все события этого объекта можно видеть в правом списке, при выборе cmdFind в левом списке окна редактора модуля. Открытие формы “Поиск” Для вызова окна “Поиск” использована другая техника. Сам модуль формы “Поиск” не содержит вообще никакого кода, привязывающего форму к определенному модулю класса. За вызов этой формы в модуле класса ClassMyData отвечают следующие строчки кода: Private WithEvents MySearch As Form Private WithEvents cmdSearch As CommandButton Private Sub cmdFind_Click() Set MySearch = CustomSearchWindow.Form_frmSearch.Form MySearch.OnUnload = "[Event Procedure]" MySearch.Visible = True Set cmdSearch = MySearch.Controls("cmdSearch") cmdSearch.OnClick = "[Event Procedure]" End Sub
Private Sub MySearch_Unload(Cancel As Integer) Set cmdSearch = Nothing End Sub
Private Sub cmdSearch_Click() MsgBox "Отсутствует модуль класса!" End Sub
|
Некоторые комментарии: После возникновения события Выгрузка формы “Поиск”, необходимо сбросить объектную переменную cmdSearch, иначе при повторном вызове формы “Поиск” будет выдаваться ошибка. Попробуйте закоментировать строчку Set cmdSearch = Nothing и вы наглядно в этом убедитесь. При нажатии кнопки “Найти далее” сначала выполняется код в модуле формы “Поиск”, а затем уже код, содержащийся в модуле класса. Код в модуле формы “Поиск”, отвечает за поведение формы и за определение свойств, передающих параметры поиска. Предполагается, что существует еще один модуль класса (отсутствующий в файле примера), отвечающий непосредственно за поиск данных в форме. Передача параметров поиска, осуществляется благодаря наличию специальных свойств формы “Поиск” (обратите внимание, что они доступны только для чтения). Вот описания этих свойств: Public Property Get SearchString() As String Public Property Get Direction() As Integer Public Property Get SearchArea() As Integer Public Property Get EntireWord() As Boolean Public Property Get UseFormat() As Boolean Public Property Get MatchCase() As Boolean |
Описываемый пример доступен здесь Дополнительная информация По этой ссылке можно прочитать статью Кен Гетца “WithEvents Revisited” и скачать пример, наглядно демонстрирующий технику создания специальных модулей класса, симулирующих поведение ActiveX инструментов. Просмотров: 9475
Ваш коментарий будет первым | | |