Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Access. Программирование на VBA. Часть 1.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
251 Кб
Скачать
☆

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.