Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 1....doc
Скачиваний:
59
Добавлен:
17.12.2018
Размер:
1.88 Mб
Скачать

Связывание объектов

Особенностью рассматриваемой технологии работы с объектами, реагирующими на события, является то, что существует пара объектов - двойников. Один из них, реальный объект, объявляется как объект без событий, другой, его двойник, объявляется в специальном классе с описателем With Events. Для двойника создаются обработчики событий, но, чтобы все это заработало нужным образом, эту пару объектов нужно связать законными узами брака. Так мы поступали при работе с объектами Excel.Application и Excel.Application WithEvents. Также мы поступили в процедуре Connect с двумя парами объектов - двойников: MyFriendOne - FriendOne и MyFriendTwo - FriendTwo.

Реальные объекты и инициирование событий

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

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

Option Explicit

'Модуль Примеры

Public FriendOne As New Личность

Public FriendTwo As New Личность

Public FOne As New Личности

Public Sub Знакомство()

'Вызывается конструктор с параметрами

'и происходит знакомство с объектами

FriendOne.InitPerson FN:="Станислав", LN:="Федотов", _

DOB:="21.05.39"

FriendTwo.InitPerson FN:="Катя", LN:="Павлова", _

DOB:="22.03.79"

FriendOne.PrintPerson

FriendTwo.PrintPerson

FriendOne.SayWhoIs

FriendTwo.SayWhoIs

'Связывание с двойниками.

'Теперь объекты могут реагировать на события!

FOne.Connect

End Sub

Public Sub CallEvents()

Dim DOB As Date

'Вызов методов приведет к возникновению событий!

'При замене фамилии возникнет событие ИзменениеФамилии

'Заметьте, не всегда фамилия будет изменена!

FriendOne.ВашаФамилия = "Фидотов"

FriendTwo.ВашаФамилия = "Волконская"

'При попытке узнать дату рождения

'может быть вызван обработчик события ДеньРождения.

DOB = FriendOne.ВашаДатаРождения

DOB = FriendTwo.ВашаДатаРождения

FriendOne.PrintPerson

FriendTwo.PrintPerson

End Sub

Пример 4.7. (html, txt)

В этом модуле объявлены два объекта класса Личность и один объект класса Личности. Две процедуры - Знакомство и CallEvents вызываются в ответ на щелчки командных кнопок в соответствующих обработчиках событий. Первой должна вызываться процедура Знакомство, где объекты FriendOne и FriendTwo получают "нормальные" значения и происходит Знакомство с ними. Важно, что здесь же происходит связывание этих объектов с их двойниками. Обратите внимание, нам понадобился объект FOne класса Личности, чтобы вызвать его метод Connect и связать эти пары объектов. В процессе работы этих модулей будет вестись диалог с пользователем. На следующих рисунках показаны сообщения, выдаваемые обработчиками событий ИзменениеФамилии и ДеньРождения.

Рис. 4.6.  Обработчик события ИзменениеФамилии объекта One

Рис. 4.7.  Обработчик события ИзменениеФамилии объекта Two

Рис. 4.8.  Обработчик события ДеньРождения объекта Two

Приведем еще результаты отладочной печати:

Станислав Федотов родился 21.05.39

Катя Павлова родилась 22.03.79

22.03.79 - 22.03.99 13:14:01

Станислав Федотов родился 21.05.39

Катя Волконская родилась 22.03.79

Итоги

В заключение, коротко опишем всю картину создания класса и работы с объектами, реагирующими на события. Прежде всего, нужно создать сам класс объектов, в котором предусмотрен набор событий, возможных для объектов класса. В методах класса следует предусмотреть возможность возбуждения событий. На следующем этапе следует создать класс, в котором объявлены объекты WithEvents. В этом классе создаются обработчики событий для каждого экземпляра класса. Кроме этих объектов - двойников создаются и "реальные" объекты, как правило, в стандартном модуле. После того, как происходит связывание двойников, объекты могут реагировать на события. Всякий раз, когда объект вызывает метод класса, в котором возбуждается событие, это приводит к тому, что вызывается обработчик события. Можно передавать и получать информацию от обработчика событий.

Одно из возможных применений этой технологии работы состоит в том, что классы с событиями могут выступать как упаковка для элементов управления. Цель такого класса состоит в расширении свойств элемента управления и, в частности, в добавлении новых событий, на которые мог бы реагировать этот элемент управления. Надеемся, что данное описание позволит Вам самостоятельно построить такое приложение. Заметим только, что в таких случаях используется модуль формы, для объявления объектов WithEvents и создания обработчиков событий этих объектов.

Программный код большинства примеров данной лекции можно найти в проектах, доступных для просмотра: DocOne5, DocTwo5.