2006 г.
Биллиг Владимир Арнольдович
Интернет-Университет Информационных Технологий, INTUIT.ru
Назад Оглавление
События, их обработка. Автомакросы
Жизнь в мире объектов была бы скучна, если бы не происходили события во внешнем мире, связанном с пользователем и операционной средой. Получая сообщения о событиях, объекты выполняют специальные методы - обработчики событий. Программируя эти методы, разработчик определяет реакцию объекта на события. Стандартные объекты VBA могут реагировать только на заранее фиксированные события. При создании собственных классов в Office 2000 появилась возможность определить для них собственный набор событий, на которые будут реагировать объекты этого класса. Познакомимся с событиями, на которые могут реагировать объекты Document
и Application
.
События объектов Document и Template
Объекты Document
и Template
могут реагировать на три события:
Таблица 1.3. События объектов Document и TemplateСобытие | Возникает, когда |
---|
Open | В коллекцию Documents добавляется существующий документ, и открывается файл, хранящий этот документ. |
New | Создается новый документ, который добавляется в коллекцию Documents . |
Close | Закрывается документ, и он удаляется из коллекции Documents . |
Обработчики событий Open
и Close
находятся в модуле, связанном с документом (This Document). Помещать в проект конкретного документа обработчик события New
не стоит (мы же говорим о создании нового документа!), так что место ему в шаблоне, на основе которого создается новый документ.
В лекции 4 я подробно рассмотрел, как программным путем можно создать обработчики событий, в том числе событий Open
и New
. Что же касается более простых ситуаций, то примеров создания обработчиков событий для разных объектов было предостаточно. Создание игры "Волк, Коза и Капуста", рассмотренной в лекции 6, полностью построено на обработке событий, возникающих в процессе игры.
События объекта Application
Многие из объектов Word обладают встроенным набором событий. Но среди них есть странная группа объектов, которые обладают событиями, но появляются по умолчанию как объекты без событий. Эти объекты существуют в двух ипостасях, как объекты без событий и объекты с событиями (With Events). Чтобы включить события для таких объектов, необходимо предпринять ряд мер, в частности создать класс объектов With Events и экземпляр этого класса связать с объектом без событий. Такая технология использется и при работе с объектами собственных классов. Эти объекты создаются по умолчанию без событий, но разработчик вправе определить для них собственный набор событий.
Из стандартных объектов Word наиболее известными объектами этой группы являются объекты Application
. Когда открывается Word и создается объект Application
, по умолчанию он не имеет событий, которые мог бы обрабатывать. Но можно связать с приложением другой объект (Application With Events), реагирующий на события. В Office 97 у этих объектов было всего два события Quit и DocumentChange
, возникающие, при попытках пользователя закрыть приложение или переключится с одного документа на другой. В Office 2000 набор событий существенно расширился и теперь их более десяти. Для того чтобы создать обработчик событий объекта Application
необходимо:
- Создать класс, в который вложен объект
Application
WithEvents; - Создать в классе обработчики событий этого объекта, следуя обычной технологии.
- Создать экземпляр этого класса и связать объект
Application
WithEvents с объектом Application
.
Начнем решение этой задачи с создания нового класса объектов. Этот класс очень прост и содержит лишь одно свойство, задающее объект с событиями. Вот определение этого класса:
Option Explicit
'Класс EventsOfApp
Public WithEvents AppEv As Word.Application
Листинг 1: html, txt
Как только это свойство определено, в окне списка объектов этого модуля появляется объект AppEv, обладающий событиями, тут же можно выбрать соответствующее событие, создать заготовку и затем наполнить ее содержанием. Я написал несколько простых обработчиков следующих событий объекта AppEv в этом классе. Вот их тексты:
Private Sub AppEv_DocumentOpen(ByVal Doc As Document)
MsgBox ("Hi " & Doc.Name)
End Sub
Private Sub AppEv_DocumentChange()
Const Msg1 = "Вы переключились на работу с новым документом!"
Call MsgBox(Msg1 & vbCrLf & ActiveDocument.Name, vbInformation, "Окно информации!")
End Sub
Private Sub AppEv_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
MsgBox ("Вы закрываете документ " & Doc.Name)
DocQuit
End Sub
Листинг 1: html, txt
Первый из этих обработчиков выдает приветствие при открытии документов Word, второй - сообщает о переключении на работу с новым документом, а третий - выдает предупреждающую информацию непосредственно перед закрытием документа.
Чтобы все это заработало, необходимо создать сам объект Application
WithEvents и связать его с существующим объектом Application
. В стандартном модуле того же документа DocOne, в котором я создал класс EventsOfAp
, я определил экземпляр этого класса и написал процедуру OnEvents, осуществляющую связывание. Взгляните на соответствующий текст:
Листинг 1: html, txt
Как только процедура OnEvents
будет выполнена, произойдет связывание и с этого момента объект Word.Application
будет обладать событиями и реагировать на переключение между документами, открытие и закрытие документов. Конечно, все это будет происходить с момента запуска процедуры OnEvents
документа DocOne и до момента его закрытия. Естественно, что при закрытии DocOne прекратит свое существование класс с обработчиками событий и сам объект Application With Events
. Следовательно, прекратится реагирование на события и объект Application
, продолжающий существовать, вернется в состояние, заданное по умолчанию.
Автомакросы
Автомакросы (Auto Macros) - это макросы со специально фиксированными именами. Они вызываются при возникновении ряда событий и являются альтернативным способом их обработки. Можно задействовать как обработчики событий, так и макросы, или оба механизма вместе. Вот макросы, автоматически запускаемые при возникновении соответствующего события в Word:
- AutoExec - при запуске приложения Word;
- AutoNew - при создании нового документа;
- AutoOpen - при открытии существующего документа
- AutoClose - при закрытии документа;
- AutoExit - при выходе из приложения
Как и обработчики, макросы можно поместить непосредственно в документ или шаблон, на основе которого документ создается. Макрос будет выполняться, если он находится в активном документе, или в шаблоне Normal или в шаблоне, на основе которого открыт активный документ.
Давайте напишем макрос AutoOpen
и поместим его в наш документ. Макрос будет выполнять действия процедуры OnEvents
, связывая объект App1 класса EventsOfApp
с текущим приложением, что позволит реагировать на события объекту Application
. Текст его прост:
Sub AutoOpen()
'Связывание объекта Application с событиями
Set App1.AppEv = Application
End Sub
Листинг 1: html, txt
Важно, что это все действительно работает, в чем мы убедились, экспериментируя с нашим тестовым документом.
Заключение
Как видите, лекция, посвященная объектной модели документов Word, оказалась непомерно большой. Я, например, вздохнул с облегчением, когда закончил ее. Понимаю, что и читается она с трудом. Но надеюсь, Вы ощутили огромность этого здания, стали лучше понимать, что Word это не просто текстовый редактор, что многие его возможности зачастую остаются не востребованными. Полагаю, немногие пользователи ведут вычисления в Word, занимаются рисованием, строят сложные таблицы. Мало кто из программистов использует эти возможности, создавая документы программно. Конечно, большинство программистов и пользователей предпочитают работать с таблицами и вести вычисления в Excel, а рисовать в графических редакторах, но я хотел обратить Ваше внимание на широкий спектр возможностей, которые предоставляет сам Word. Естественно, даже в этом большом тексте о многом сказать не удалось, а иногда не все сказанное мною сказано внятно. Вместе с тем надеюсь, что, прочитав эту лекцию, возможно не вникая в некоторые детали, при необходимости Вы вернетесь к более внимательному изучению того или иного раздела с пользой для себя.
Назад Оглавление