- •Основы офисного программирования и язык vba
- •Офисное программирование
- •Состав Office 2000
- •Инсталляция Office 2000
- •Содержимое диска "Resource Kit"
- •Документ Issues
- •Документ ork9
- •Папка Tools
- •Содержимое диска "Language Pack"
- •Об этой книге и ...
- •Моя благодарность
- •Vba и объекты. Обзор
- •Библиотека объектов Office 2000 - каркас приложений
- •Встраивание вместо наследования
- •Построение каркаса документа
- •Библиотека объектов Office 2000 и Object Browser
- •Объекты Application
- •Свойства-участники
- •Вторая группа терминальных свойств
- •Методы объектов Application
- •События объектов Application
- •Совместная работа приложений. Создание объектов Application. Раннее и позднее связывание
- •Коллекции в Office 2000
- •Коллекции объектов Office 2000
- •Коллекции Excel: Workbooks, Sheets
- •Коллекция Workbooks
- •Коллекция Sheets
- •Коллекции Word: Documents, Paragraphs и другие
- •Коллекция Documents
- •Коллекция Paragraphs
- •Коллекция Sections
- •Коллекции Characters, Words, Sentences
- •Коллекции и конструкция For Each … Next
- •Объекты Range
- •Что определяет объект Range?
- •Метод Range
- •Объекты Selection
- •Метод Select и свойство Selection
- •Активные объекты и метод Activate
- •Проектирование документов
- •Документ и его программный проект
- •Модули - обработчики событий
- •Стандартные модули
- •Модули классов
- •Модуль макросов
- •Структура модуля. Окно проекта и Окно кода
- •Окно проекта
- •Свойства проекта
- •Имя проекта
- •Защита проекта
- •Окно кода
- •Еще раз о "переиспользовании" модулей
- •Проект и область видимости
- •Система документов и ее проект
- •Организация системы документов
- •Как организуются ссылки между проектами
- •Обмен информацией между документами
- •Система документов One - Two - Three
- •Типы данных
- •Простые типы данных.
- •Объявление переменных и констант простых типов
- •Синтаксис объявления простых переменных
- •Объявления по умолчанию
- •Константы
- •Массивы
- •Динамические массивы
- •Записи и тип, определенный программистом
- •Что можно делать с записями?
- •Раздел объявлений
- •Раздел опций
- •Разделы констант, типов и переменных
- •Раздел Declare
- •Правила именования
- •Типы и классы Еще раз о понятии "класс"
- •Что нового в классах "Office 2000"
- •Создание класса "Личность"
- •Объекты и переменные
- •Объекты, класс которых определен пользователем.
- •Объекты "родного" приложения
- •ActiveX-объекты
- •Модуль класса Свойства
- •Сокрытие свойств
- •Конструкторы и деструкторы. Стандартные события
- •Стандартные события Initialize и Terminate
- •Два конструктора класса Rational
- •Процедуры - свойства
- •Как создаются процедуры- свойства
- •Синтаксис Let, Get и Set
- •Классы, как упаковка
- •Семейство классов и процедуры - свойства
- •Friend методы
- •События
- •Классы, объекты With Events и обработчики событий
- •Модуль класса с объектом WithEvents
- •Объект WithEvents
- •События собственных классов
- •Как создать класс с событиями
- •Как зажигаются события
- •Где и как следует создавать обработчики событий для экземпляров класса
- •Связывание объектов
- •Реальные объекты и инициирование событий
- •Семейство классов и реализация интерфейсов
- •Наследование
- •Виртуальные методы и полиморфизм
- •Абстрактные классы
- •Наследование и полиморфизм в Office 2000
- •Наследование интерфейсов
- •Полиморфизм семейства классов
- •Проект "Люди и Машины"
Где и как следует создавать обработчики событий для экземпляров класса
Задача состоит в том, что нужно определить модуль, в котором можно объявлять объекты With Events. В окне кода этого модуля должен быть доступен список событий класса, должна быть возможность создания заготовок обработчиков событий для каждого из объектов, наполнение этих заготовок соответствующим содержанием.
Заметьте, создание этого модуля, создание обработчиков событий не имеет непосредственного отношения к созданию класса объектов с событиями. Это другая сторона проблемы, - это проблема того, кто использует класс объектов, кто создает экземпляры этих объектов и создает обработчики событий этих конкретных объектов. Вполне возможно, что вся эта работа будет выполняться в нескольких документах, других проектах, отличных от того проекта, где создан класс объектов с событиями.
Модуль, в котором можно объявлять объекты With Events может быть либо модулем класса, либо модулем формы, но, заметьте, это не может быть стандартный модуль. В большинстве случаев предпочтение отдается модулю класса. Позже мы остановимся подробнее на ситуации, когда объекты с событиями объявляются в модуле формы. Предположим, что для решения некоторой задачи, нам потребовалось работать с двумя конкретными объектами класса Личность, - нашим старым приятелем и знакомой молодой девушкой. Для решения задачи создадим класс, который назовем "Личности" и поместим туда объявление двух объектов MyFriendOne и MyFriendTwo. Объекты объявлены со спецификатором WithEvents, указывающим на то, что они должны реагировать на события. Как только эти объявления появятся в разделе объявлений класса, сами объекты появятся в окне кода в списке объектов. Теперь, выбрав объект из списка, можно открыть список возможных событий объекта и создать вначале заготовку обработчика событий, а потом наполнить ее содержанием.
увеличить изображение Рис. 4.5. Создание обработчиков событий
Заметьте, эта технология работы нам уже хорошо знакома. Она использовалась при создании объектов Application With Events. Теперь становится понятным, что тогда шла речь о частном случае. Помните, при создании класса ExcelWithEvents, говоря о его структуре, мы обращали внимание на то, что в классе объявлен всего лишь один объект с событиями. Теперь становится понятным, это отражало специфику частного случая, - приложение, обычно, существует в единственном экземпляре. Личностей же, реагирующих на события, может быть много, - для каждой из них нужно задать свой экземпляр объекта в классе, чтобы была возможность написать индивидуальный обработчик события. Взгляните на реализацию класса Личности:
Option Explicit
Private WithEvents myFriendOne As Личность
Private WithEvents myFriendTwo As Личность
Private Sub myFriendOne_ДеньРождения(Dat As Date)
BirthDay (Dat)
End Sub
Private Sub myFriendOne_ИзменениеФамилии(Fam As String, _
NewFam As String, Permission As Boolean)
MsgBox ("Изменение фамилии " & Fam & " на " & NewFam & Chr(13) _
& "не разрешается.")
Permission = False
End Sub
Private Sub myFriendTwo_ДеньРождения(Dat As Date)
BirthDay (Dat)
End Sub
Private Sub myFriendTwo_ИзменениеФамилии(Fam As String, _
NewFam As String, Permission As Boolean)
MsgBox ("Поздравляю с замужеством, дорогая " & _
Fam & "-" & NewFam & "!")
Permission = True
End Sub
Public Sub BirthDay(Dat As Date)
Debug.Print Dat, "-", Now
Select Case Day(Dat)
Case Day(Now)
MsgBox ("Сегодня День Рождения!")
Case Is < Day(Now)
MsgBox ("Вчера был День Рождения!")
Case Else
MsgBox ("Завтра День Рождения!")
End Select
End Sub
Public Sub Connect()
Set myFriendOne = FriendOne
Set myFriendTwo = FriendTwo
End Sub
Пример 4.6. (html, txt)
Как видите, в этом классе два Private объекта, реагирующих на события, и для каждого из них написаны по два обработчика событий класса. Сейчас не суть важно, что делают эти обработчики. В одном случае обработчик события ИзменениеФамилии разрешает это изменение, в другом - нет, и выдает по этому поводу, естественно, разные сообщения. Обработчики события ДеньРождения выполняют одну и ту же задачу, поэтому они вызывают общую процедуру работы. Это, хотя и интересные, но все-таки детали. Более важную для понимания играет роль процедура, названная Connect.