Где и как следует создавать обработчики событий для экземпляров класса
Задача состоит в том, что нужно определить модуль, в котором можно объявлять объекты With Events. В окне кода этого модуля должен быть доступен список событий класса, должна быть возможность создания заготовок обработчиков событий для каждого из объектов, наполнение этих заготовок соответствующим содержанием.
Заметьте, создание этого модуля, создание обработчиков событий не имеет непосредственного отношения к созданию класса объектов с событиями. Это другая сторона проблемы, - это проблема того, кто использует класс объектов, кто создает экземпляры этих объектов и создает обработчики событий этих конкретных объектов. Вполне возможно, что вся эта работа будет выполняться в нескольких документах, других проектах, отличных от того проекта, где создан класс объектов с событиями.
Модуль, в котором можно объявлять объекты With Events может быть либо модулем класса, либо модулем формы, но, заметьте, это не может быть стандартный модуль. В большинстве случаев предпочтение отдается модулю класса. Позже мы остановимся подробнее на ситуации, когда объекты с событиями объявляются в модуле формы. Предположим, что для решения некоторой задачи, нам потребовалось работать с двумя конкретными объектами класса Личность, - нашим старым приятелем и знакомой молодой девушкой. Для решения задачи создадим класс, который назовем "Личности" и поместим туда объявление двух объектов MyFriendOne и MyFriendTwo. Объекты объявлены со спецификатором WithEvents, указывающим на то, что они должны реагировать на события. Как только эти объявления появятся в разделе объявлений класса, сами объекты появятся в окне кода в списке объектов. Теперь, выбрав объект из списка, можно открыть список возможных событий объекта и создать вначале заготовку обработчика событий, а потом наполнить ее содержанием.
увеличить изображение
Рис. 4.5. Создание обработчиков событий
Заметьте, эта технология работы нам уже хорошо знакома. Она использовалась при создании объектов Application With Events.
Однако, использование New для создания ActiveX- объектов не всегда возможно. Не все приложения допускают такой способ подключения, и не все объекты доступны, - например, недоступны внутренние ActiveX-объекты, которые совместно могут храниться в одном и том же файле. Более универсальный способ создания ActiveX-объектов - вызов специальных функций CreateObject и GetObject. Как правило, вызов этих функций помещается в правую часть оператора Set. В результате его выполнения объектное выражение возвращает ссылку на созданный объект, которая и становится значением переменной.
Синтаксис функции CreateObject таков:
CreateObject(<класс>)
Параметр класс - строка, задающая класс объекта, у которой две обязательные части: "имя_приложения.имя_класса"; ее вид совпадает с видом задания класса ActiveX-объектов в операторе объявления.
Функция GetObject имеет дополнительный параметр:
GetObject(<путь>, <класс>)
Параметр путь задает полный путь к файлу, содержащему ActiveX-объект. Этот объект и активизируется. Второй параметр при этом необязателен. Но если файл содержит группу ActiveX-объектов разных классов, задать его необходимо. Можно опустить и первый параметр, если ActiveX-объект этого класса уже создан, и тогда возвращается ссылка на активный объект заданного класса. Вот пример, в котором читается книга Excel, используя метод GetObject. Обратите внимание, книга создается без предварительного создания объекта Application:
Public Sub WorkWithGetObject() Const MY_PATH As String = "e:\O2000\CD2000\Ch4\" Dim myBook As Excel.Workbook Set myBook = GetObject(MY_PATH & "BookOne.xls") With myBook .Application.Visible = True 'Чтобы увидеть книгу, включите ее в окне UnHide из меню Window .Charts("Динамика Продаж").Activate 'Посмотрев на диаграмму, переключимся на рабочий лист MsgBox ("Вы можете перейти в Excel") .Worksheets(1).Activate .Worksheets(1).Range("A40") = 777 .Save .Application.Quit End With End Sub