Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Е.А. Бессонов Access. Пользовательские объекты

.pdf
Скачиваний:
50
Добавлен:
19.08.2013
Размер:
288.8 Кб
Скачать

Министерство образования Российской Федерации Государственное учреждение

Кузбасский государственный технический университет Кафедра вычислительной техники и информационных технологий

ACCESS

Пользовательские объекты

Методические указания к лабораторной работе для студентов специальности “Экономика и управление на предприятиях ” по курсу “Автоматизация экономических расчетов ”

Составитель Е.А. Бессонов

Утверждены на заседании кафедры Протокол № 9 от 08.04.02

Рекомендованы к печати учебно-методической комиссией специальности 060800 Протокол № 5 от 18.04.02

Электронная копия хранится в библиотеке главного корпуса ГУ КузГТУ

Кемерово 2002

1

Введение

Полноценное применение Access предполагает широкое использование объектов (таблиц, форм, отчетов, элементов управления и т.п.). Пользователь может создавать в дополнение к существующим свои объекты, которые называются пользовательскими. Широкое использование объектов характерно для современного стиля программирования. Так программы Microsoft Office содержат в своем составе около 500 объектов. Разработчик приложения наряду со встроенными и библиотечными объектами может использовать пользовательские. Access содержит необходимые средства для создания пользовательских объектов.

Для полноценного усвоения последующего материала необходимо предварительно изучить методические указания по Access: "Пользовательские функции", "Объекты и события", "Объекты доступа к данным".

Формально объект можно представить как содержимое модуля класса. Модуль класса можно создать командой Insert|Class Module в редакторе VBA. Access откроет окно нового модуля, а после сохранения имя нового модуля класса появится в списке модулей окна базы данных. Модули класса можно редактировать так же, как стандартные модули VBA. В отличие от стандартных модули класса имеют события, Initialize (инициализация) и Terminate (завершение), связанные с созданием и уничтожением экземпляров класса.

Все модули класса имеют свойство Name, которое определяет его имя, используемое для ссылок на класс (объект). Чтобы задать имя, укажите его при сохранении модуля класса. Имя должно быть понятным и отражать сущность объекта.

В разделе описаний модуля класса задаются опции Option Compare Database и Option Explicit, а также описываются модульные переменные, доступные для всех процедур данного модуля. Переменная, описанная с помощью слова Public, является свойством объекта, для доступа к которому нужно использовать полное имя в фор-

ме ИмяОбъекта.ИмяСвойства.

Рассмотрим пример простейшего объекта с именем Тег и со свойствами Tag и Value.

Option Compare Database Option Explicit

Public Tag As String

2

Public Value As String

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

Dim t As Тег Set t = New Тег

С экземпляром объекта t можно производить обычные операции присваивания.

t.Tag = “ctl”

t.Value = “txtАдрес” ‘объекту присваиваются свойства

Set t = Nothing

Последняя операция освобождает объектную переменную. Теперь она не указывает на объект.

Обычно переменные, хранящие свойства объекта, описываются словом Private. В этом случае они доступны только из процедур этого модуля. Для чтения свойств используются процедуры Property Get, а для установки – Property Let. В модуле класса также могут размещаться процедуры типа Sub и Function, играющие роль методов объекта.

Объекты типа Тег можно разместить в другом объекте (семействе), чтобы облегчить к ним доступ. Для этой цели нужно предварительно создать объект типа Collection.

Семейства

ВVBA нередко оказывается, что экземпляр класса связан со многими экземплярами другого класса. Множество связанных объектов называется семейством объектов. Такое семейство содержится в объекте-владельце (контейнере). Так, например, Forms, содержит семейство открытых форм. В VBA имеется объект Collection, который позволяет создавать и использовать собственные семейства объектов.

Вприложениях Access широко применяются встроенные семейства Reports, TableDefs, RecordSet. Элемент семейства сам может быть семейством. Так, например, форма содержится в семействе Forms и в свою очередь содержит семейство элементов управления Controls. Некоторые элементы управления включают свои семейства. Пример такого элемента управления – набор вкладок. Обратиться к

объекту, входящему в семейство, можно в форме ИмяСемейст-

ва.ИмяОбъекта или ИмяСемейства.ИндексОбъекта.

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

3

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

Свойства и методы семейств

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

oМетод Add добавляет объекты в семейство. В качестве параметров задаются указатель на объект и его уникальный идентификатор (имя);

oМетод Remove удаляет объекты из семейства. Параметрами метода являются имя или индекс объекта.

oМетод Item обращается к конкретному объекту семейства и возвращает указатель на него. В качестве параметра задается имя или индекс объекта.

oСвойство Count возвращает количество объектов в семействе.

Создание семейств

VBA позволяет разработчикам создавать собственные семейства при помощи специального класса Collection. Экземпляр такого класса содержит указатели на объекты класса. Чтобы использовать объекты Collection, сначала нужно создать новый экземпляр объекта

Collection в VBA, например: Private mcolItems As Collection

Set mcolItems = New Collection

Теперь во вновь созданное семейство mcolItems можно добавлять объекты, используя метод Add. Для этого необходимо методу передать ссылку на объектную переменную и строковый уникальный идентификатор. Если существует объект t и Tag – уникальное имя, то добавить объект t в коллекцию mcolItems можно с помощью инструкции

mcolItems.Add t,Tag

Если не задать уникальный идентификатор Tag, то получить доступ к элементу семейства можно только по его порядковому номеру

4

(индексу) в семействе. Семейства, созданные с помощью объекта VBA Collection, используют в качестве начального индекса единицу. Первому добавляемому объекту присваивается номер 1, второму – 2 и т.д. При удалении объектов из середины семейства большие номера корректируются таким образом, чтобы сохранилась непрерывная последовательность номеров. Параметры before и after метода Add, позволяют добавлять объекты в определенное место внутри семейства.

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

Как всякая другая, объектная переменная подчиняется правилам VBA, касающимся области видимости и времени жизни. Если переменная объекта Collection описана в теле процедуры, она исчезнет по завершении выполнения этой процедуры и уничтожит все содержащиеся в ней объекты. Обычно семейства описываются как переменные уровня модуля или как глобальные переменные.

Класс семейств представляет собой класс VBA, который определяет объект Collection с атрибутом Private и включает методы для добавления, удаления, поиска и подсчета числа объектов в семействе. Поскольку объект Collection является личным (Private), вам не нужно беспокоиться о том, что внешние процедуры загромоздят его неправильными указателями на объекты. Кроме того, использование класса дает возможность создавать собственные альтернативы стандартным методам Add, Remove и Item.

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

Старые версии Acess (например, Access2) не имеют модулей класса и объектов типа Collection. Однако можно имитировать объект в стандартном модуле. Он будет выполнять ту же функцию, что и объект, но с иной формой обращения к нему. Что касается семейств, то Access Basic позволяет пользователю распоряжаться семейством Properties, которое имеют некоторые объекты Access. Рассмотрим для примера объект TableDef. У объекта TableDef семейство Properties состоит из свойств таблицы. Каждое из свойств является

5

объектом типа Property. К этим свойствам можно добавлять пользовательские свойства и использовать их наравне со встроенными.

Объект Property имеет 4 встроенных свойства.

Name. Текстовая строка (String), содержащая имя свойства. По этому имени можно обращаться к свойству в программе.

Type. Целое число (Integer), определяющее тип данных свойства. Value. Значение типа Variant.

Inherited. Логический флажок. Указывает, было ли данное свойство унаследовано от другого объекта. Например, объект из семейства Fields объекта RecordSet может наследовать свойства поля базовой таблицы.

Для добавления определенного пользователем свойства следует воспользоваться методом CreateProperty и создать объект Property с уникальным значением свойства Name. После этого следует задать значения свойств Type и Value нового объекта и добавить объект в семейство.

Из семейства Properties можно удалять определенные пользователем свойства. Встроенные свойства удалять нельзя.

Пусть раздел описаний включает строки: Dim БД As Database

Global Таб As TableDef

Dim mЧисВстрСв ‘Число встроенных свойств

При инициализации объекта нужно создать экземпляр объекта Таб, через который можно получить доступ к семейству Properties. Set БД = DBEngine.WorkSpaces(0).Databases(0)

Set Таб = БД.TableDefs(“Поля”)

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

mЧисВстрСв = Таб.Properties.Count

Для удаления пользовательских свойств можно использовать следующую процедуру (метод):

Sub УдСвТаб() Dim i As Integer Dim n As Integer

On Error Resume Next n = Таб.Properties.Count

6

For i = n – 1 To 0 Step -1 Таб.Properties.Delete Таб.Properties(i).Name

Next i

End Sub

Инструкция On настраивает метод на обработку ошибок. При возникновении ошибки программа не останавливается, а просто происходит переход к следующей инструкции. Ошибки возникают при попытке удаления встроенного свойства. В цикле For перебираются все свойства объекта Таб. К каждому свойству применяется метод Delete (удалить). По окончании цикла в семействе Таб.Properties останутся только встроенные свойства. Таким образом, объект Таб.Properties вполне может заменить объект типа Collection.

Рассмотрим еще процедуру (а по существу метод), которой передаются уникальный идентификатор Tag и значение Value. Процедура формирует из этих данных объект и добавляет его в семейство.

Sub Добавить(ByVal Tag As String, ByVal Value As String)

УдалитьTag

Dim prp As Property

Set prp = Таб.CreateProperty() prp.Name = Tag

prp.Type = DB_TEXT prp.Value = Value Таб.Properties.Append prp End Function

Процедуре передаются по значению (ByVal) два параметра - Tag (уникальное имя тега) и Value (значение). Сам объект будем называть тегом. Если в семействе есть тег с таким именем, он будет удален процедурой Удалить для поддержания уникальности имен в семействе. Затем выполняется метод CreateProperty объекта TableDef. Создается объект типа Property, и указатель на него (адрес) присваивается переменной prp, то есть создается экземпляр объекта.

Последующие инструкции присваивают значения свойствам этого экземпляра. Метод Append семейства Properties добавляет сформированный тег в семейство. Для работы с тегами теперь можно использовать методы и свойства объекта Properties. Так, например, для доступа к значению тега с именем Tag нужно использовать выраже-

ние Таб.Properties(Tag).Value.

7

Теги

Построим объект с именем Теги, содержащий объекты типа Тег. Access поддерживает свойство Tag (дополнительные сведения), которое имеется в любом элементе управления (ЭУ) и позволяет задать и хранить до 2048 символов. Access не использует и не обрабатывает эту информацию, поэтому свойство Tag является удобным местом хранения информации об ЭУ.

Информация, определяемая пользователем, обычно хранится в виде строки, разбитой на части (теги): Имя=Значение;Имя2=Значение2;…;имяN=ЗначениеN;

Используя для доступа к этой информации функции, устанавливающие и извлекающие нужные значения по их именам, вы получите эффективный и безопасный метод хранения и извлечения значений. Классы Тег и Теги можно использовать не только для работы со свойством Tag, но и в любых случаях, когда просто требуется поместить в строку несколько значений.

Для того, чтобы со свойством Tag можно было работать с помощью классов Тег и Теги, мы будем соблюдать ряд правил.

o Имя тега отделяется от его значения символом “=”. Внутри имени и значения этот символ использовать запрещено.

oТеги разделяются символом “;”. Вместо этого символа можно использовать другой, изменив соответствующим образом свой-

ство Separator.

Раздел описаний

Option Compare Database Option Explicit

Private mstrSeparator As String Private mcolItems As Collection

В именах переменных использованы префиксы, указывающие на тип переменной (str – String, col - Collection) и область видимости (m – модульная переменная). Обе переменные доступны только для процедур модуля Теги.

Обработчики событий

Private Sub Class_Initialize() mstrSeparator = “;”

Set mcolItems = New Collection End Sub

8

Процедура Class_Initialize запускается всякий раз, когда создается экземпляр объекта Теги. В ней устанавливается разделитель тегов. Инструкция Set создает новый (New) экземпляр объекта Collection.

Private Sub Class_Terminate() Set mcolItems = Nothing

End Sub

Процедура Class_Terninate запускается при уничтожении экземпляра объекта Теги. Уничтожается экземпляр типа Collection и освобождается занимаемая им память.

Свойства

Значения свойств обычно хранятся в личных (Private) модульных переменных. Доступ к ним возможен только из процедур данного модуля. Процедуры из других модулей получают доступ к свойствам через процедуры Property.

Public Property Get Count() As Long Count = mcolItems.Count

End Property

Процедуры Property работают со свойствами и позволяют определить момент, когда свойство изменяется (событие). Процедуры

Property имеют 3 разновидности - Property Get, Property Let и Property Set. Процедура Property Get предназначена для получения значения свойства (то есть для чтения свойства). Процедуры Property Let и Property Set используются для присваивания (установки, записи) значений свойств. Различие между двумя последними процедурами заключается в том, что Property Let применяется для скалярных типов данных (Integer, String и т.п.), а Property Set – для объектов.

Процедура Property Get состоит из заголовка, содержащего имя свойства и его тип, и тела процедуры. Программист обязан позаботиться о том, чтобы процедура возвращала значение. Для этого значение присваивается имени процедуры. Имя процедуры (Count в нашнм случае) является и именем свойства, а тип возвращаемого значения (Long) – типом этого свойства В теле процедуры Property можно производить вычисления, как и в других процедурах..

Свойство Count представляет собой количество тегов, сохраненных в модульной переменной mcolItems типа Collection. В инструкции присваивания Count справа - свойство объекта типа Collection, а слева – свойство объекта Теги. Процедуры Property Let для этого свойства нет, поэтому свойство Count объекта Теги доступно только

9

для чтения.

Public Property Get Separator() As String Separator = mstrSeparator

End Property

Public Property Let Separator(Value As String) mstrSeparator = Value

End Property

Свойство Separator (разделитель) доступно для чтения и записи. Процедура Property Let передает значение своего аргумента (Value) модульной переменной mstrSeparator для хранения. Это значение возвращает процедура Property Get.

Public Property Get Exists(Tag As String) As Boolean On Error Resume Next

Dim strValue As String

strValue = mcolItems.Item(Tag).Value Exists = (Err.Number = 0)

Err.Clear End Property

Свойство Exists (существует) доступно только для чтения. Метод Item объекта Collection по уникальному идентификатору Tag (параметр процедуры) находит в семействе соответствующий объект типа Тег. Затем определяется свойство Value найденного тега. Теги в семействе mcolItems должны иметь различные левые части (свойство Tag). Это должно быть обеспечено при добавлении тега в семейство. Тега в семействе может не оказаться. В этом случае возникает ошиб-

ка с номером Err.Number > 0. Если ошибки нет, Err.Number = 0, имя функции Exists получает значение True, если тег обнаружен и False в противном случае.

Public Property Let Text(Value As String) Dim varItems As Variant

Dim varText As Variant Dim i As Integer

Dim strTag As String Dim strValue As String

varItems = Split(Value, mstrSeparator)

For i = Lbound(varItems) To Ubound(varItems) varText = Split(varItems(i), “=”)