- •Access. Программирование на vba. Часть 1. Создание объектов с помощью модуля классов.
- •MsgBox "The form object (in the 'Form' property) has a name of: " _ mobjForm.Form.Name, vblnfonnation, "Property Set Example"
- •Private Declare Function sndPlaySound Lib "winmm.Dll" Alias _
- •MsgBox "ms Word is not installed on your computer"
- •If mobjOutlook Is Nothing Then
- •Dim User as User For Each User in Users
- •Users.Remove "Steve"
MsgBox "The form object (in the 'Form' property) has a name of: " _ mobjForm.Form.Name, vblnfonnation, "Property Set Example"
End Sub
Private Sub Form_Load()
Set mobjForm = New cForm
Set mobjForm.Form = Forms!frmPropertySet End Sub
Private Sub Form_Unload(Cancel As Integer)
Set mobjForm = Nothing
End Sub
Общедоступная переменная и процедуры свойств
Простейший способ создания свойств класса заключается в использовании общедоступных переменных. Однако данный подход имеет некоторые недостатки. Общедоступные переменные всегда отображаются вне модуля. Таким образом, невозможно контролировать доступ к значениям свойств. Если кто-либо меняет значения свойств без ведома других пользователей, это может вызвать нежелательные проблемы.
Еще одно преимущество процедур свойств заключается в том, что можно создать свойства "только для чтения" или "только для записи". Например, если нужно создать свойство Password, можно разрешить пользователям устанавливать пароль, но не получать его (только для записи). Для создания свойства "только для записи" необходимо включить выражение Property Let, но не включать выражение Property Get.
Кроме того, с помощью процедур свойств можно выполнять действия в коде в зависимости от того, установлено свойство или получено.
Создание перечисляемых типов данных
Перечисляемый тип — это значение свойства, которое может быть передано разработчику при использовании объекта. Например, при установке свойства Visible для формы после ввода знака равенства можно заметить, что возможен выбор значений True и False в раскрывающемся списке (рис. 5).
РИСУНОК 5. Выбор True или False в раскрывающемся списке.
Точно так же можно передать эти значения, создав перечисляемые типы.
В разделе объявлений модуля класса для указания значений свойств необходимо воспользоваться ключевым словом Enum. Например, если для свойства Type объекта cUser необходимо создать раскрывающийся список со значениями Manager, Staff или Unknown, в разделе объявлений можно использовать следующий код:
Public Enum UserList
Manager
Staff
Unknown
End Enum
Следующий шаг — использование перечисляемого типа данных (UserList) в качестве типа данных свойства Type класса cUser. Приведенный ниже пример иллюстрирует, как это сделать. В данном случае свойство было создано как общедоступная переменная.
Пример 1. Свойство объявляется как строковая переменная.
Public UserType as String
Пример 2. Свойство объявляется как перечисляемый тип данных.
Public UserType as UserList
Значения свойств можно установить с помощью раскрывающегося списка, предусмотренного технологией IntelliSense (рис. 6).
РИСУНОК 6. Пример перечисляемого типа данных
Чтобы показать, что значение свойства было выбрано из перечисляемых типов данных, каждый тип данных пронумерован, начиная с нуля, по возрастанию.
СОВЕТ
Используемые значения свойств не ограничиваются перечисляемыми типами данных. В предыдущем примере перечисляемый тип данных включает три члена: Manager, Staff и Unknown. VBA не препятствует разработчику проигнорировать значения в списке и ввести другое значение (например, FullTime). Чтобы ограничить выбор пунктами в списке, необходимо воспользоваться числовыми значениями перечисляемых пунктов. Например, если в списке имеется три пункта (и нумерация начинается с нуля), можно запретить использование любых элементов, значения которых меньше нуля и больше двух.
Создание методов
Метод — это действие, которое может быть выполнено над объектом. Чтобы создать метод для класса, достаточно создать общедоступную подпрограмму или функцию. Предположим, что нужно отслеживать дату и время каждой регистрации пользователя. Приведенный ниже код создает метод Login, который вводит в таблицу дату и время регистрации пользователя.
Public Sub Login()
' Создание объектной переменной для набора записей.
Dim rst As ADODB.Recordset
' Создание строковой переменной.
Dim strSQL As String
' SQL-оператор для tbIUsers.
StrSQL = "SELECT * FROM tbIUsers"
' Создание набора записей ADO.
Set rst = New ADODB.Recordset
' Открытие набора записей.
rst.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
' Добавление новой записи.
rstAddNew
' Запись даты и времени регистрации пользователя.
With rst
!Name = Me.Name
!Date = Date
!Time = Time End With
' Сохранение новой записи.
rst.Update
' Закрытие набора записей.
rst.Close
' Уничтожение объектной переменной.
Set rst = Nothing
End Sub
Использование методов
Для использования данного метода при запуске приложения необходимо ввести код:
cUser.login
Обратите внимание, что пользователям, которым необходимо обновить значение в базе данных, не обязательно разбираться в коде ADO. Они просто используют доступные свойства и методы объекта, которые отображаются с помощью технологии IntelliSense.
Создание событий
Объекты Access включают события. Например, объект формы содержит событие Load, а командная кнопка — событие Click.
Можно создавать события для пользовательских объектов. Для этого в разделе объявлений необходимо воспользоваться ключевым словом Event и указать имя события. Например, можно добавить событие Welcome, которое выполняется при запуске приложения пользователем. Для создания данного события в разделе объявлений модуля класса необходимо ввести следующий код:
Event Welcome()
Чтобы воспользоваться событием, его необходимо сформировать с помощью инструкции Raise в методе объекта. Событие Welcome можно сформировать в методе Login объекта cUser.
Когда пользователь запускает приложение, вызывается метод Login. Благодаря этому вызывается событие Welcome, которое отображает всплывающий экран с персональным приветствием данному пользователю. Используется следующий программный код:
Public Sub Login()
RaiseEvent Welcome
End Sub
Это все, что нужно предпринять для создания события и формирования его в модуле класса. В следующем разделе описано использование события в форме.
Использование событий
Чтобы воспользоваться событием Welcome в модуле формы, необходимо объявить объектную переменную для cUser в разделе объявлений модуля и использовать ключевое слово WithEvents. Зарезервированное слово WithEvents применяется для отображения и использования событий объекта cUser. Соответствующий код приведен ниже:
' Данное выражение следует поместить в раздел объявлений модуля.
Private WithEvents objUser As cUser
СОВЕТ
Событие WithEvents можно использовать только в модулях класса (модули форм являются модулями класса). В стандартных модулях WithEvents использовать нельзя.
После объявления переменной на уровне модуля с помощью ключевого слова WithEvents необходимо в левом поле со списком в верхней части окна модуля выбрать объект cUser. В правом поле со списком будут отображены события объекта cUser. Выберите событие Welcome, и в окне кода появится процедура, в которой можно записать соответствующий код для ответа на событие.
На рис. 7 приведен код, отвечающий на событие Welcome.
РИСУНОК 7. Процедура, использующая событие Welcome объекта cUser.
В результате пользователь при каждом запуске приложения увидит всплывающий экран с приветствием (рис. 8).
РИСУНОК 8. Всплывающий экран с приветствием
Вызов событий Initialize и Terminate
Модули класса автоматически включают события инициализации и завершения. Для использования данных событий необходимо выбрать событие в поле со списком в верхней части окна кода.
Событие инициализации вызывается при создании объекта. Например, если нужно, чтобы выполнялся определенный код при создании объекта cUser, данный код можно поместить в событие Initialize.
Событие завершения происходит при разрушении объекта. Здесь удобно записывать код очистки, выполняющийся при закрытии подключений к базам данных, освобождении объектных переменных и т.д.
Использование объектов
На данном этапе существует объект cUser со своими свойствами и методами. Чтобы использовать его в модуле класса, достаточно ввести имя объекта и добавить в конце точку. IntelliSense отобразит список свойств и методов объекта.
Для использования объекта в классе, который создает объект, употребляется ключевое слово Me. Например, чтобы присвоить имя пользователя, необходимо ввести:
Me.User = "Steve"
Использование объекта вне модуля класса cUser (в формах либо стандартных модулях) разбивается на два этапа. Во-первых, необходимо определить объектную переменную для использования в качестве ссылки на объект. Во-вторых, используется ключевое слово Set для создания ссылки из объектной переменной
на объект.
Создание объектной переменной
Переменная — это участок памяти, отведенный для хранения или использующийся при считывании информации. Вне всяких сомнений, у разработчиков имеется громадный опыт работы с простыми переменными, такими как строковые и целочисленные переменные. Ниже приведены примеры объявления и использования двух простых переменных:
Dim sfcrNaor aa String
Dim I as integer
strNama = "James"
I = 10
В этих примерах переменные включают специфический тип данных, и информация может храниться и считываться по необходимости.
Переменная Object объявляется с помощью выражения Dim, как и простые переменные:
Dim objUser as cUser
Присваивание объектной переменной объекту
Для установки ссылки объектной переменной на объект используется ключевое слово Set. Например:
Set objUser = New cUser
ПРЕДОСТЕРЕЖЕНИЕ
Рекомендуется всегда объявлять операторы Dim и Set в отдельных строках. Не следует комбинировать данные операторы в одной строке, как, например, Dim objUser = New cUser. При этом код выполняется медленнее и момент и, образования объекта (записи в память) определить невозможно.
Использование объекта
После создания и установки объектной переменной доступ к свойствам и методам объекта можно получить с помощью технологии IntclliSense. Используя точечную нотацию, можно установить и считать значение свойства, а также выполнить метод.
Установка значения свойства: Object.Property = Value
Получение значения свойства: MsgBox Object.Property
СОВЕТ
Если при попытке использования объекта обнаружилось, что IntelliSense не отображает свойств и методов объекта, возможно, это свидетельствует о том, что не создана либо не установлена объектная переменная. Однако иногда IntelliSense не отображает элементы даже в том случае, когда код правилен. В данном случае следует предположить, что код правилен, и проверить его. Компания Microsoft не предусматривала работу IntelliSense со всеми элементами кода.
Освобождение объекта
Закончив работу с объектной переменной, ее необходимо освободить, установив значение объекта равным Nothing. Таким образом можно высвободить ценные ресурсы. Соответствующий синтаксис приведен ниже:
' Освобождение объектной переменной.
Set objUser = Nothing
СОВЕТ
При создании объектной переменной рекомендуется сразу перейти в конец процедуры и установить значение объектной переменной, равное Nothing. Это позволит не забыть освободить объектную переменную после создания большой процедуры.
Создание нескольких экземпляров объекта
Класс содержит определенный набор свойств и методов. Этим он напоминает шаблон или каркас. Для иллюстрации рассмотрим открытие нового документа в Microsoft Word. При создании нового документа
Word можно воспользоваться шаблоном, например. Contemporary Letter (Современное письмо). После выбора шаблона в документ можно внести изменения. Данные изменения вносятся в новый документ, а не в шаблон. Тот же самый принцип действует в случае с классами.
При инициализации (создании) класса экземпляр объекта содержит базовый набор свойств и методов (шаблон). С этого момента объект становится уникальным, обладая собственным набором значений свойств и методов.
Одно из преимуществ модулей класса заключается в том, что можно создать много экземпляров класса. Каждый экземпляр создастся с базовым набором свойств и методов, но после создания каждый из них может быть изменен различным образом. Например, предположим, создано пять объектов cUser. Вес пять объектов могут иметь разные значения свойств и разные методы. Например, значение свойства Name в одном объекте может быть James, а в другом — Steve.
Для создания нескольких экземпляров объекта достаточно создать дополнительные объектные переменные и присвоить каждую объектную переменную новому объекту. Соответствующий код приведен ниже.
Public Sub ManyUsersO
Dim objUser1 as cUser
Dim objUser2 as cUser
Set objUser1 = New cUser
Set objUser2 = New cUser
ObjUser1.Name = "James"
ObjUser2.Name = "Steve"
MsgBox "Current users are: " & objUser1.Name & " and " objUser2.Name
Set objUser1 = Nothing
Set objUser2 = Nothing
End Sub
Дополнительные примеры объектов
В данной статье приведены многочисленные примеры классов для последующего использования (см. базу данных "Creating Objects with Class Modules.mdb" в сопровождающих статью примерах). Ниже кратко описан каждый из этих объектов.
Объект TextFile
В статье приводится код объекта TextFile, который можно использовать для считывания и записи информации в текстовый файл (рис. 9). Модуль класса включает следующий код:
РИСУНОК 9. Пример объекта TextFile.
Private pintFreeFile As Integer
Private pvarlnfo As Variant
Public Function ReadLineText(strFileName Aa String) As String
pintFreeFile = FreeFile
Open StrFileName For Input As pintFreeFile
Line Input #pintFreeFile, pvarlnfo
ReadLineText = pvarlnfo
Close XpintFreeFile
End Function
Public Function ReadAllText(strFileName As String) As String
pintFreeFile = FreeFile
Open strFileName For Input Aa pintFreeFile
Do Until VBA.EOF(pintFreeFile)
Line Input #pintFreeFile, pvarlnfo
ReadAllText = ReadAllText & vbCrLf & pvarlnfo
Loop
Close #pintFreeFile
End Function
Public Sub WriteLineText(strFileName As String, strText Aa String)
pintFreeFile = FreeFile
Open strFileName For Append As pintFreeFile
Write #pintFreeFile, strText
Close #pintFreeFile
End Sub
Объект Timer
В статье приводится код модуля класса cTimer. Данный модуль класса используется, во-первых, как секундомер для учета времени, а во-вторых, для создания "состояния ожидания", чтобы приостановить выполнение кода на заданное число секунд. Код модуля класса cTimer приведен ниже:
Option Explicit
Private msngStart As Single
Public Sub Wait(lngSeconds As Long)
Do Until Timer > msngStart + IngSeconds
DoEvents Loop
End Sub
Public Sub StartTimerO
BsngStart = Timer
End Sub
Public Function ElapsedTime() As Long
Dim sngTimerStop As Single
sngTimerStop = Timer
ElapsedTime = sngTimerStop - asngStart
msngStart = 0 sngTimerStop = 0
End Function
Объект frmTimer в базе данных "Creating Objects with Class Modules, mdb" иллюстрирует использование таймера для определения промежутка времени и создания "состояния ожидания" (рис. 10).
РИСУНОК 10. Использование таймера для оценки прошедшего времени и создания состояния ожидания
Объект Sound
В статье содержится модуль класса cSound, предназначенный для воспроизведения звуков в приложении Access. Модуль класса cSound содержит только один метод (PIaySound), который передает звуковой файл на обработку вызову Windows API:
' Вызов Windows API.
