программиррование. Access. Программирование на VBA. Часть 1. Access. Программирование на vba. Часть Создание объектов с помощью модуля классов
Скачать 245.5 Kb.
|
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. Свойства и методы объекта множества.
Добавление элементов в коллекцию Чтобы добавить элементы в коллекцию, необходимо воспользоваться методом 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 UserFor Each User in UsersMsgBox 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, а также делает код переносимым. Кроме того, можно скрыть сложную "начинку" от разработчиков, использующих объект. Разработчики могут создавать многочисленные экземпляры данного объекта. |