Главная страница

программиррование. Access. Программирование на VBA. Часть 1. Access. Программирование на vba. Часть Создание объектов с помощью модуля классов


Скачать 245.5 Kb.
НазваниеAccess. Программирование на vba. Часть Создание объектов с помощью модуля классов
Анкорпрограммиррование
Дата19.01.2022
Размер245.5 Kb.
Формат файлаdoc
Имя файлаAccess. Программирование на VBA. Часть 1.doc
ТипДокументы
#336185

Access. Программирование на VBA. Часть 1.

Создание объектов с помощью модуля классов.

Создание объектов — один из самых эффективных спосо­бов программирования и управления приложениями. Перед рассмотрением преимуществ использования объектов необхо­димо разобраться с определениями.

Объекты представляют собой различные сущности. Люди, машины и здания — все это разные виды объектов. В програм­мировании слово объект используется для описания одного специфического элемента, например, формы или элемента управления. Вне всяких сомнений, у любого разработчика имеется определенный опыт работы с этими типами встроен­ных объектов.

Microsoft Access приобретает все более объектно-ориенти­рованный характер, позволяя создавать собственные объекты и добавлять к-ним свойства и методы. При­меры пользовательских объектов могут включать объект клиента, объект счета, объект пользователя, объект подключения данных и звуковой объект. Код данной статьи описывает многочисленные пользовательские объекты (см. базу данных "Creating Objects with Class Modules.mdb", показанную на рис. 1).

РИСУНОК 1. Примеры пользовательских объектов, программный код которых содержится на прилагаемом к книге CD-ROM
Объекты создаются с помощью модулей классов. Модуль класса — это мобильная, самодостаточная единица программного кода, разработанная для специальных целей. Класс указывает свойства и методы для каждого объекта в данном классе.

Разработчики часто путают термины "класс" и "объект". Класс представляет собой описание или шаб­лон свойств и методов объекта. Сам по себе он не может существовать. Если разработчику нужно исполь­зовать код в модуле класса, создается экземпляр класса. Этот экземпляр и представляет собой объект.

Таким образом, нельзя говорить о создании экземпляра объекта. Объект — это и есть экземпляр! От­дельный объект определяется как экземпляр класса. Из одного класса можно создать множество объектов, каждый с разными значениями свойств.

СОВЕТ

В данной статье описывается создание объектов с помощью модулей класса. Следует помнить, что модули формы представляют собой модули класса. Можно добавлять свойства и методы к формам таким же способом, что и к пользовательским объектам.

Преимущества использования объектов

Существует много преимуществ использования объектов, среди которых возможность создания слож­ного программного кода, использования IntelliSense, упрощенное создание и поддержка программного кода и т.д.

Сокрытие сложного программного кода

Возможность сокрытия сложного программного кода является одним из преимуществ использования объектов. Опытный разработчик может создавать сложные программы, такие как процедуры Windows API, процедуры доступа к данным, обработки строк и т.д. Менее опытные разработчики могут воспользовать­ся преимуществами объекта, используя вызов его свойств и методов. При этом нет необходимости раз­бираться в рабочем коде объекта.

Использование технологии Microsoft IntelliSense

Для использования объекта разработчику достаточно выбрать данный объект и его свойства или ме­тод с помощью технологии IntelliSense (рис. 2). Например, один из объектов, рассматриваемый в дан­ной статье, представляет собой объект обработчика ошибок, который можно использовать в приложениях Access. Поскольку весь код обработчика ошибок включен в состав объекта сЕггог, разработчику достаточно указать объект и выбрать необходимые свойства или метод. Например, если разработчику нужно, чтобы при возникновении ошибки в приложении было отправлено почтовое сообщение, достаточно вызвать метод "email":

cError.email


РИСУНОК 2. При работе с объектами можно использовать технологию Microsoft IntelliSense.
Обратите внимание на то, как легко использовать объекты. С помощью технологии Microsoft IntelliSense достаточно просто ввести имя объекта (сЕггог) и добавить точку — при этом отображаются все свойства и методы данного объекта. Это сильно упрощает и ускоряет написание программного кода.

Организация кода

Создание классов помогает структурировать программный код, улучшая его восприятие и упрощая работу с ним. Весь программный код, выполняющий ту или иную задачу, содержится в классе. Упаковка кода в одну компактную группу со свойствами и методами, характеризующими объект, называется инкап­суляцией.

Просмотр объектов в браузере объектов

Упаковка кода в классы позволяет разработчикам использовать Object Browser (Браузер объектов) для просмотра свойств, методов и другой информации. Далее в данной статье будет представлен пользователь­ский объект, просматриваемый с помощью браузера объектов.

Создание экземпляров объекта

Рассмотрим повторно используемый в приложении программный код. Фактически его можно исполь­зовать одновременно в нескольких экземплярах объекта. Примером может служить код подключения к данным. Каждый раз, когда пользователь осуществляет поиск покупателя, открывает форму или получает доступ к полю со списком, с сервера должны быть получены данные. Вместо того чтобы дублировать код для каждой из данных процедур, лучше создать объект Data Connection, позволяющий получить данные с сервера.

Упрощение кода в целях последующей поддержки и обновления

С помощью классов единственный фрагмент кода можно использовать в приложении множество раз без повтора кода. Если, например, код доступа к данным один и тот же в нескольких процедурах, необхо­димо найти все места, где появляется данный блок кода, и проверить, не нужно ли внести изменения. Такой подход занимает очень много времени и совершенно неэффективен. С другой стороны, если исполь­зуется объект Data Connection, все обновления или изменения кода доступа к данным необходимо вне­сти лишь в одном месте — модуле класса.

Ограничение доступа к коду

Классы позволяют контролировать, кто получает доступ к программному коду и при каких обстоятель­ствах. С помощью классов можно защитить свойства и методы, управляя их отображением вне класса.
Переносимость кода

Поскольку модуль класса является автономной единицей кода, его с легкостью можно использовать в разных приложениях Access.

Объекты, свойства и методы

Перед рассмотрением процесса создания объектов необходимо вспомнить основы. Важно понимать суть терминов объект, свойства и методы, иначе оставшаяся часть статьи будет весьма трудной для воспри­ятия.

Объект — это элемент, которым можно управлять, манипулировать и который можно программиро­вать. В Access объектами являются формы, текстовые поля, командные кнопки и многое другое. В данной статье рассматриваются примеры создания пользовательских объектов.

Свойство — это характеристика объекта. Свойство можно рассматривать и как описание чего-либо, поскольку оно описывает или характеризует объект. В Access свойства текстового поля включают Name, Visible, Forecolor и др. Большинство свойств объекта можно как считывать, так и устанавливать. В дан­ной статье приведены примеры создания пользовательских свойств и описаны способы управления ими.

Метод представляет собой действие, которое можно выполнить над объектом. Метод можно рассмат­ривать как действие. Например, одним из методов формы Access является метод Close. В данной статье приведены примеры создания пользовательских методов.

Создание классов

Для создания классов используются модули класса. Класс определяет свойства, методы и события, обеспечивая четко определенный и полностью документирован­ный пользовательский интерфейс.

Вставка модуля класса

Создание класса не вызывает никаких сложностей. Добавление свойств и методов к объекту требует несколько больших усилий.

Для создания класса необходимо вставить модуль класса в приложение Access и присвоить ему имя. Имя модуля класса является именем объекта.

Чтобы вставить модуль класса, необходимо в меню выбрать пункты Insert | Class Module (Вставка | Модуль класса). После этого откроется окно редактора Visual Basic. В окне кода можно опре­делять любые свойства, методы и события для данного объекта. Перед тем как продвигаться дальше, необходимо присвоить имя модулю класса (рис. 3).

РИСУНОК 3. Присваиваниеимени модулю класса.
СОВЕТ

Присваивать имя модулю класса следует осторожно, поскольку данное имя будет именем объекта. С помощью это- го имени разработчики как раз и получают доступ к коду, пользуясь технологией IntelliSense. Кроме того, полезно перед именем объекта указать сокращенное название компании, чтобы всегда можно было увидеть, какие пользовательские объекты были созданы в данной компании.
Создание свойств

Существует два способа создания свойств класса: глобальные переменные либо процедуры свойств.

СОВЕТ

Программный код данной статьи включает многочисленные примеры объектов. На следующих нескольких страницах в иллюстративных целях используется простейший пример — объект cUser. Объект cUser содержит информацию о текущем зарегистрированном пользователе, включая его имя. Данный объект можно использовать в случаях, когда в приложении необходимо узнать имя пользователя, например, при обработке ошибок либо при записи имени авто­ра примечаний или документов. В приведенном примере объект cUser используется для отображения приветствия пользователю при регистрации.
Использование общедоступных переменных

Свойство можно создать с помощью объявления общедоступной переменной в разделе объявлений модуля класса. В приведенном ниже примере создается свойство UserType объекта cUser:

Public Name as String

Public UserType as String

После этого несложного объявления пользователи могут устанавливать и получать значения свойства. Для установки значения свойства применяется следующий программный код:

cUser.Name = "Steve"

cUser.UserType = "Management"

Для выборки значения свойства используется следующий программный код (рис. 4);

MagBox cUser.Name

Использование процедур свойств

Кроме того, свойства можно добавлять к объектам с помощью специальной процедуры VBA, назы­ваемой процедурой свойства. Существует три типа процедур свойств: Property Let для получения значения свойства. Property Get — для установки значения свойства и Property Set — для передачи объекта в ка­честве свойства.

Процедуры свойств позволяют ограничить доступ к значениям свойств. Ключом к пониманию действия процедур свойств является тот факт, что значение свойства хранится в приватной переменной на уровне модуля. Таким образом, первым шагом будет создание приватной переменной на уровне модуля, а затем — создание выражений Property Let и Property Get.

СОВЕТ

Процедуры свойств могут быть общедоступными или приватными, как и любые другие процедуры. Общедоступные процедуры свойств доступны всем другим процедурам во всех модулях; приватные процедуры свойств доступны только процедурам того модуля, в котором они были объявлены,

Создание приватной переменной модуля

При использовании процедур свойств значение свойства хранится в приватной переменной модуля. Создатель класса определяет, отображается ли данное свойство вне модуля.

Ниже приведен пример создания приватной переменной на уровне модуля для свойств Name и Type объекта cUser.

Option Explicit

' Создание приватной переменной в разделе объявлений.

Private mstrName as String

Private mUserType as String


РИСУНОК 4. Установка и получение значений свойств объекта с помощью IntelliSense.
Процедура Property Let

Процедура Property Let используется для установки значения свойства. Если не нужно, чтобы другие пользователи устанавливали значение свойства, не следует включать процедуру Property Let. Ниже приведен пример создания процедуры Property Let для свойства Name объекта cUser:

Public Property Let Name (UserName as String)

' Принимается значение, передаваемое в UserName, и сохраняется

' в приватной переменной (mstxName).

mstrName = UserName

End Property

Рассмотрим данную процедуру подробнее. Во-первых, поскольку существует процедура Property Let, можно устанавливать свойство Name, так как данное свойство отображается вне модуля. Разработчик мог бы присвоить этому свойству следующее значение:

cUser.Name = "James"

Значение James, передаваемое в процедуру свойства, сохраняется в переменной UserName. Процедура Property Let принимает значение переменной UserName (James) и записывает его в приватной перемен­ной модуля mstrName. Рассматриваемая процедура передает один параметр, хотя на самом деле процеду­ры свойств могут передавать много параметров. Значение свойства может быть получено только в том случае, когда существует процедура Property Get.

Процедура Property Get

Процедура Property Get позволяет получить значение свойства. Если не нужно, чтобы другие пользо­ватели могли получить значение свойства, не следует включать оператор Property Get. Оператор Property Get получает значение, хранящееся в приватной переменной, и возвращает его в качестве значения свойства. Приведенный ниже пример представляет собой оператор Property Get для свойства Name объекта cUser:

Public Property Get Name () as String

' Получение значения, записанного в приватной переменной (mstrName),

' и запись его в значение свойства.

Name = mstrName

End Property

Пользователь легко может получить значение свойства (если существует выражение Property Get), воспользовавшись следующим кодом:

MsgBox cUser.Name

СОВЕТ

Тип данных процедуры Property Let должен быть таким же, как и для процедуры Property Get. Например, Property Let для свойства Name принимает строковый аргумент. Таким образом, процедура Property Get также должна воз- вращать строковый тип данных.

Процедура Property Set

Процедура Property Set позволяет создать процедуру свойства, в ходе которой устанавливается ссылка на объект. При присваивании объекта в процедуре Property Set используется ключевое слово Set.

В данном примере используется объект cForm. Объект cForm содержит свойство Form, которое должно быть передано как объект Form. Код в модуле класса cForm приведен ниже:

Option Compare Database

' Объявление приватной переменной на уровне модуля.

Private mobjForm As Form

Public Property Get Form() As Variant

' Получение объекта, скрытого в приватной переменной (mobjForm) ,

' и запись его в значение свойства.

Set Form = mobjForm

End Property
Public Property Set Form(FormObject)

' Получение переданного объекта (FonnObject)

' и запись его в приватную переменную (mobjForm).

Set mobjForm = FormObject

End Property

При загрузке frmPropertySet форма передается в свойство Form. Поскольку это объект, используется ключевое слово Set. Затем можно получить имя объекта формы для окна сообщений. Ниже приведен код для формы frmPropertySet:

' В данном примере используется объект "cForm" . Об"ьект "cForm"

' содержит свойство "Form". При загрузке этой формы (frmPropertySet) она

' передается как объект в свойство "Form". При щелчке на кнопке

' "Property Set" считывается имя формы.

Private mobjForm As cForm Private Sub cmdClose_Click()

DoCmd.Close acForm, "frmPropertySet", acSaveNo

End Sub

Private Sub cmdPropertySet_Cliclt()

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.
Private Declare Function sndPlaySound Lib "winmm.dll" Alias _

"sndPlaySoundA" (ByVal IpszSoundName As String, ByVal uFlags As Long) As Long

Public Sub PIaySound(SoundFile As String)

' Воспроизведение звукового файла.

sndPlaySound SoundFile, 1

End Sub

Следующий код инициализирует и обрабатывает объект objSound (рис. 11):

Dim objSound As cSound

Set objSound = New Sound

' При использовании Windows NT необходимо указывать путь "C:\WINMT".

objSound.PIaySound "C:\Windows\chimes.wav"

Set objSound = Nothing

РИСУНОК 11. Пример объекта Sound.
Объект Letter
В код статьи включен модуль класса cLetter, использующийся для создания писем в Microsoft Word. Пись­мо составляется автоматически. Для этого используется шаблон Microsoft Word, а данные для письма по­лучает SQL-оператор. Метод ShowWord (Boolean) определяет, отображается ли Word для данного пользователя. Иногда требуется отправлять письма непосредственно на принтер без редактирования.

Код модуля класса cSound приведен ниже;

Option Explicit Private objWord As Word.Application

' Локальные переменные для хранения значений свойств. Private mvarTemplate As String ' локальная копия

Private mvarSQLStatement As String ' локальная копия

Public Property Let SQLStatement(ByVal vData As String)

mvarSQLStatement = vData

End Property

Public Property Get SQLStatement() As String

SQLStatement = mvarSQLStatement

End Property

Public Property Let Template(ByVal vData As String)

mvarTemplate = vData

End Property

Public Property Get Template() As String

Template = mvarTemplate

End Property

Public Sub CreateLetter(DatabasePath As String, ShowWord As Boolean)

' Запись данных о покупателях во временный файл для использования

' почтового слияния. Это быстрее, чем получение данных непосредственно

' из Access.

DoCmd.OutputTo acOutputQuery, "qryCustomers", AcFormatRTF, "С:\Temp.rtf", False

objWord.Documents.Add (Me.Template)

' Запуск почтового слияния.

With objWord.ActiveDocument.MailMerge

.MainDocumentType = wdFormLetters

.OpenDataSource Name:="C:\ Temp.rtf"

.Destination = wdSendToNewDocument

.Execute End With

It ShowWord Then

Me.ShowWord

End If

End Sub
Friend Sub ShowWord()

' Отображение экрана приложения Word для пользователя.

objWord.Visible = True

End Sub

Private Sub Class_Initialize()

1 Переход к следующей строке после оиибки.

On Error Resume Next

' Попытка использовать приложение Word, окно которого уже открыто. Set objWord = Get0bject(, "Word.Application")

' Если истинно. Word не открыт.

If objWord Is Nothing Then

' Запуск новой копии приложения Word.

Set objWord = New Word.Application

' Если истинно, MS Word не установлен.

If objWord Is Nothing Then

MsgBox "MS Word is not installed on your computer"

End If

End If

End Sub

Private Sub Class Terminate()

Set objWord = Nothing

End Sub

Приведенный далее код инициализирует объект objLetter и использует его свойства и методы:

' Переменные Dimension.

Dim objLetter As cLetter

Dim strPath As String

strPath = CurrentProject.Path

' Присваивание объектных переменных объекту cLetter.

Set objLetter = New cLetter

' Шаблон Word для использования в данном документе.

objLetter.Template = strPath & "\Business Services Letter.dot"

' SQL-оператор, использующийся для получения данных для формы.

ObjLetter.SQLStatement = "SELECT * FROM tbICustomers"

' Вызов метода "CreateLetter" для создания письма.

objLetter.CreateLetter strPath С "\0bjects.mdb", True

' Разрушение объектной переменной.

Set objLetter = Nothing

Объект Outlook

В статье приводится код модуля класса cOutlook, используемый для отображения формы Outlook New Message (Новое сооб­щение) (рис. 12). Если необходимо пре­доставить пользователям возможность создавать сообщения Outlook из приложе­ния Access, можно воспользоваться методом NewEmailMessage.

РИСУНОК 12. Отображение формы OutlookNewMessage в приложениях Access
Ниже приводится код модуля класса cOutlook:

Option Explicit

Private mobjOutlook As Outlook.Application

Private mMyItem As Object

Public sub NewEmailMessage(EmailAddress As String)

' Создание нового почтового сообщения Outlook.

Set mMyItem = mobjOutlook.CreateItem(olMailItem)

mMyItem.To = EmailAddress

mMyItem.Display

End Sub

Private Sub Class_Initialize()

' Нет никаких причин для использования "GetObject", чтобы

' автоматизировать Outlook. Outlook всегда будет открывать одну копив

' приложения. Используется ключевое слово "New".

' Установка объектной переменной к приложению Outlook.

Set mobjOutlook = New Outlook.Application

' Если истинно, MS Outlook не установлен.

If mobjOutlook Is Nothing Then

MagBox "MS Outlook is not installed on your computer"

End If

End Sub

Private Sub Class_Terminate()

' Освобождение объектной переменной.

Set mobjOutlook = Nothing

End Sub

Приведенный ниже код инициализирует объект objOutlook и вызывает метод NewEMailMessage:

' Объектные переменные Dimension.

Dim objOutlook As cOutlook

' Присваивание объектных переменных объекту cOutlook.

Set objOutlook = New cOutlook

' Вызов метода "NewEMailMessage".

objOutlook.NewEmailMessage nancy@northwind.com

' Разрушение объектной переменной.

Set objOutlook = Nothing



Применение объекта обработчика ошибок

Рассмотрим пример кода из статьи «Профессиональная обработка ошибок.». Модуль класса обеспечивает обширную обработку ошибок, включая:

• Регистрацию ошибок в таблице Access

• Регистрация ошибок в текстовом файле

• Обработку ошибок электронной почты

• Обработку ошибок записей в календаре Outlook

Рассмотрим объект сЕггог в браузере объектов, как показано на рис. 13.

РИСУНОК 13. Объект сЕггог и браузере объектов
Использование объектов с коллекциями VBA
Коллекции VBA позволяют работать с пользовательски­ми объектами как с группой. Например, если существует пять объектов cUser и необходимо выполнить действие над каждым из них, проще и намного эффективнее обрабаты­вать пять объектов как группу, а не как отдельные объек­ты.

Вероятно, разработчик уже знаком со встроенными коллекциями, такими как коллекции форм и элементов управления. Кроме того, VBA содержит объект коллекции. Коллекция — это способ обращения с группой объектов как с одним элементом. В повседневной жизни люди постоянно имеют дело с кол­лекциями. Дирижер оркестра может сказать: "Все исполнители, играющие на духовых инструментах, встань­те". Это гораздо удобнее и эффективное, чем перечислять: "Мэри, Джим, Джон, Джо, Салли, встаньте". Точно так же можно работать с объектами, составляющими один элемент или коллекцию.

Основная концепция этого подхода заключается в том, что коллекция представляет собой объект со своими собственными свойствами и методами. Коллекция обладает следующими характеристиками:

• Имеет свойства и методы.

• Может быть расширена за счет добавления различных типов объектов.

• Величина коллекции является переменной, а это значит, что коллекция может расширяться и со­кращаться при добавлении и удалении элементов.

• . Элементы в выделенной области не могут быть отсортированы.

• Элементы множества являются индексированными (отсчет начинается с цифры "1").

Создание коллекции VBA

Поскольку коллекции представляют собой объекты, коллекции создаются тем же способом, что и объекты. Во-первых, необходимо объявить объектную переменную для использования в качестве ссылки на коллекцию. Во-вторых, нужно воспользоваться ключевым словом Set для создания ссылки из объек­тной переменной на коллекцию. Следующий код создает коллекцию пользователей:

Dim Users as Collection

Set Users = New Collection

СОВЕТ

Полезно присваивать коллекции имя, представляющее собой множественное число от имен объектов, содержащих­ся в данной коллекции. В данном примере в коллекцию добавляется объект User. Таким образом, коллекции следу-вд. ет присвоить имя Users.

Свойства и методы коллекции VBA

Объект коллекции имеет очень простую структуру и содержит только одно свойство и три метода, как показано в табл. 1.

Таблица 1. Свойства и методы объекта множества.

Имя

Тип

Описание

Count

Свойство

Указывает, сколько элементов содержится в коллекции.

Add

Метод

Используется для добавления элементов в коллекцию.

Remove

Метод

Используется для удаления элементов из коллекции.

Item

Метод

Используется для ссылки на элементы в коллекции. Данный метод действует по умолчанию.


Добавление элементов в коллекцию

Чтобы добавить элементы в коллекцию, необходимо воспользоваться методом Add объекта коллекции.

Collection.Add Item [, Key][, Before];, After]

Затем нужно передать объектную переменную для каждого объекта, добавленного к множеству. Напри­мер, чтобы добавить в коллекцию двух пользователей, следует воспользоваться объектной переменной для каждого пользователя: objUser1 и objUserZ. Следующий параметр — значение Key (удобочитаемое имя), ис­пользующееся для ссылки на объект. Если ключевое значение не указано, ссылка на каждый пункт в коллекции осуществляется по номеру индекса.

СОВЕТ

Настоятельно рекомендуется указывать ключевое значение. Ключевые значения упрощают написание кода и более ,j надежны, чем номера индекса. Номера индекса могут измениться при удалении элементов из коллекции или при '3 вставке в указанные места коллекции с помощью параметров метода Add.

В приведенном ниже примере в коллекцию Users будут добавлены два пользователя:

Dim User1 as cUser

Dim User2 as cUser

Dim Users as Collection

Set User1 = New cUser

Set User2 = New cUser

Set Users = New Collection

User1.Name = "James"

User2.Name = "Steve"

Users.Add User1, User1.Name

Users.Add User2, User2.Name

Set User1 = Nothing

Set User2 = Nothing

Set Users = Nothing

Данный код добавляет в коллекцию объект User1. С помощью свойства Name объекта указано ключе­вое значение. Точно так же добавляется объект User2.

Обратите внимание, что метод Add коллекции содержит аргументы "до" и "после" для определения порядка объектов в коллекции.

Ссылка на специфический объект

К объектам в коллекции можно обращаться либо по номеру, либо по ключевому значению. При ссылке на элементы в коллекции по номеру необходимо помнить, что все элементы индексированы, а это оз­начает, что отсчет начинается с 1. Проще обращаться к объекту в коллекции по ключевому значению. Приведенный ниже код иллюстрирует ссылку на специфический объект User2 с помощью обоих мето­дов. Хотя указывать метод Item не обязательно (он действует по умолчанию), явное обращение способ­ствует повышению восприимчивости кода.
' Обращение к объекту в коллекции по номеру индекса.

MsgBox Users.Item(2).Type

' Обращение к объекту в коллекции по ключевому значении.

MsgBox Users.Item("Steve").Type

Организация циклов по элементам коллекции

Простейший и наиболее эффективный способ организации цикла по объектам в коллекции — исполь­зование цикла For Each. Кроме того, можно воспользоваться циклом For Next, но он выполняется мед­леннее.

Чтобы применить цикл For Each, необходимо указать объект для рассмотрения в коллекции. Ниже приведен соответствующий код:
' Необходимо объявить объектную переменную.

Dim User as User

For Each User in Users


MsgBox User.Type

Next User

СОВЕТ

В приведенном примере проверяется каждый пользователь в коллекции. Обратите внимание, что отдельным пользо­вателям соответствуют отдельные объектные переменные Useri и User2. Чтобы воспользоваться циклом For Each, необходимо указать общую объектную переменную под именем User. Данную объектную переменную не обязатель­но присваивать с помощью ключевого слова Set. Ее единственное назначение — использование в цикле For Each.
Удаление отдельных объектов

Чтобы удалить отдельные объекты из множества, необходимо воспользоваться номером индекса объекта либо ключевым значением.

' Удаление объекта по номеру индекса.

Users.Remove 2

' Удаление объекта по ключевому значению.

Users.Remove "Steve"


Удаление всех объектов

Чтобы удалить все объекты из коллекции, не обязательно создавать цикл по всем элементам множе­ства и вызывать метод удаления. Гораздо проще переназначить объект коллекции в новую коллекцию.

' Удаление всех объектов из коллекции.

Set Users = New Collection

Освобождение объектной переменной

Поскольку коллекции — это объекты, не следует забывать об освобождении объектной переменной, устанавливая ее значение равным Nothing.

' Освобождение объектной переменной.

Set Users = Nothing

Резюме

Создание объектов представляет собой эффективный способ написания и работы с приложениями. Это значительно улучшает организацию кода, упрощает его написание и использование, в том числе с по­мощью технологии IntelliSense, а также делает код переносимым. Кроме того, можно скрыть сложную "начинку" от разработчиков, использующих объект. Разработчики могут создавать многочисленные экзем­пляры данного объекта.


написать администратору сайта