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


Public Property Get prsDateO As Date
prsDate = birthday End Property
Public Property Let prsDate(bthday As Date)
If bthday > #1/1/19001 And bthday < #1/1/20001 Then
birthday = bthday Else
MsgBox ("Incorrect date") End’If End Property
Но вернемся к методу bkPrint класса Book. Сейчас он не работает, поскольку обращение author.name стало бессмысленным. Для правильной работы метода необходимо заменить строку с неправильным оператором на следующую:
str = "Book title is " & title & Chr(13) & _ "Written by " & author.prsName
Таким образом, дойдя до данной строки кода, программа выполнит процедуру-свойство объекта author, т. е. prsName, которая возвращает текущее значения свойства name.
После описания процедур-свойств перейдем к заключительному аккорду в рассмотрении процедур класса: к процедурам реакции на событие. Выше мы уже упоминали о них. Напомним, что тогда мы приводили пример процедуры реакции на событие Document_ciose (реакция на событие "Закрыть документ"). Как мы упоминали, существует множество событий и множество процедур реакции на них. Но помимо встроенных процедур, пользователь вправе создавать собственные обработчики событий.
Чтобы пояснить сказанное, рассмотрим типовой сценарий жизни объекта от объявления до удаления:
1. Вход в процедуру для работы с объектом.
2. Создание ссылки на объект.
3. Создание нового объекта.
4. Работа с объектом.
5. Выход из процедуры.
Прокомментируем этот сценарий. Для человеческого глаза нет ничего особенного в этой быстротечной жизни, а для системного "всевидящего ока" произошло два очень важных события: создание объекта и его удаление (при выходе из процедуры). Более того, мы не заметили, как были выполнены две процедуры реакции на эти события: initialize и Terminate, которые, соответственно, проинициализировали и уничтожили объект. Рассмотрим их подробнее.
Когда создается объект, вызывается процедура initialize, которая всем свойствам объекта присваивает значения, определенные для них по умолчанию. Данная процедура называется конструктором. Пользователь вправе изменить эту процедуру, указав, как инициализировать свойства объекта при его непосредственном объявлении.
Когда же объект выходит из области своего действия, например из процедуры, в которой он был локально объя-влен, автоматически вызывается процедура Terminate, которая освобождает память, занимаемую объектом и ссылкой на него. Эту процедуру называют деструктором. Пользователь вправе и здесь изменить процедуру, но на практике этой возможностью пользуютсяо-чень редко.
Покажем использование процедур реакции на событие на примере класса Person. Мы ввели конструктор, инициализирующий свойства name, birthday И male.
Объявление процедур реакций на событие
Private Sub Class_Initialize()
name = "Novikov"
birthday = #10/10/19511
male = True End Sub
Конечно, это только первичная инициализация, для последующих инициализаций необходимо написать собственный конструктор. В нашем классе Person роль такого конструктора играет метод persinit.
Поздравляем: класс полностью готов к работе! Теперь вы можете использовать его возможности на полную мощность и ощутить всю прелесть ООП.
Попытайтесь самостоятельно встроить в наш класс Person еще несколько свойств и методов, а потом реализовать их.
На этом мы заканчиваем описание классов в VBA. Надеемся, что все описанные выше конструкции и примеры достаточно просты и понятны. Единственное, чему еще хотелось бы уделить особое внимание, — это семейство (collection), структура (класс) VBA, стоящая несколько в стороне от канонического описания, но тем не менее очень важная при реализации ряда задач, а также очень часто используемая в объектной модели Microsoft Office XP.
Давайте рассмотрим следующую задачу: допустим, мы полностью определили класс Book (в качестве домашнего задания исправьте это "допустим" на "с легкостью") и перед нами стоит проблема упорядочения все нарастающих сведений о книгах, да так, чтобы в этой системе можно было легко выполнить поиск, чтение и запись. Конечно, располагая имеющимися на данный момент обучения средствами, мы могли бы создать массив объектов класса Book. Но подобная конструкция не отвечает нашим возросшим требована ям, например добавление и удаление книг, их поиск потребуют специальных средств (создание специальных функций, проверка и т. д.).
Для решения подобной проблемы в VBA присутствует особый класс collection, который позволяет очень быстро и удобно решить проблему построения динамических структур данных.
Семейством (Collection) называется упорядоченный набор объектов. В принципе объекты могут быть разных классов, но, как правило, встречаются семейства однородных объектов. Грубо говоря, семейство представляет собой сплав динамического массива и записи, что позволяет, с одной стороны, перенумеровать все элементы семейства, а с другой, иметь прямой доступ к объектам — элементам семейства — по значению определенного поля, называемого ключом. Ключ — это строковое выражение, которое может быть использовано вместо индекса для доступа к элементу семейства.
Как же устроен этот чудо-класс? Класс collection имеет одно свойство
Count и три метода — Add, Item и Remove.
Свойство count очень простое, оно возвращает количество элементов семейства (то есть количество объектов, включенных в семейство в данный момент).
Метод Add (элемент (, ключ] [, до] [, после}) добавляет объект в семей-ство. Его обязательным аргументом является элемент. Он, как вы можете догадаться, добавляет в семейство элемент. Параметр ключ задает ключ, по которому можно будет произвести поиск этого элемента. Параметры до и после указывают на то, перед каким или после какого элемента добавляется новый. По умолчанию элемент добавляется в конец семейства.
Метод Remove (ключ) удаляет элемент из семейства. Параметр ключ — это ключ или индекс, указывающий на удаляемый элемент. Заметьте, что при удалении элемента из семейства не остается дыр : индексы перенумеровываются, значение свойства count уменьшается на единицу.
Метод item (ключ) возвращает значение элемента семейства с ключом ключ. Как в случае с методом Remove, параметр ключ может быть как ключом, так и индексом.
Давайте запрограммируем решение вышерассмотренной задачи, используя знания о семействе. В этом примере мы объявляем семейство Books и инициализируем его, добавляя три объекта. После того как семейство инициализировано, мы удаляем один элемент и выводим оставшиеся элементы.

Объявление семейства
Sub BooksCollection()
Dim Books As New Collection
Dim Novikov As New Person
Dim Vba As New Book
Novikov.perslnit "Novikov", #10/10/1951#, True
Vba.booklnit "VBA и разработка приложений в Office 2000", Novikov
Books.Add Vba, "VBprog"
Dim Office As New Book
Office.booklnit "Microsoft Office 2001 в целом", Novikov
Books.Add Office, "off"
Dim Stroustrup As New Person
Dim С As New Book
Stroustrup.perslnit "Stroustrup", #11/25/1947#
C.booklnit "C++ Programming", Stroustrup
Books.Add C, "Cprog", 2
Books.Remove "Cprog" For i = 1 To Books.Count
Books.Item(i).bookPrint Next i End Sub
На этом мы заканчиваем описание языка VBA, считая, что вы готовы к его полноценному использованию, и переходим к описанию редактора Visual Basic Editor.