Шаг 2.
ActiveX. Создание элементов управления ActiveX на основе VCL-компонентов

    На этом шаге мы рассмотрим создание элементов управления ActiveX на основе компонентов, имеющихся в библиотеке Delphi.

    Delphi позволяет создавать элементы управления ActiveX на основе VCL-компонентов. При этом могут использоваться не только компоненты, поставляемые с Delphi, но и созданные программистом или приобретенные у третьих лиц. Для этой цели используется технология DAX (Delphi ActiveX).

    Процесс создания элемента управления ActiveX весьма прост. Для этого следует выбрать из репозитария объектов страницу ActiveX, а потом элемент ActiveX Control (Компонент ActiveX):


Рис.1. Выбор ActiveX Control (Компонент ActiveX) из репозитария объектов

    Далее следует заполнить появившуюся диалоговую панель:


Рис.2. Выбор имени ActiveX, имен модулей и базового VCL-класса

    Следует выбрать VCL-компонент, на основе которого будет создан элемент ActiveX. В качестве примера выберем TCalendar.

    Отметим, что при выборе опции Make Control Licensed (Лицензирование) автоматически будет сгенерирован файл с расширением LIC, без которого данный ActiveX нельзя будет использовать ни в каких средствах разработки, но можно поставлять с готовыми приложениями. Использование такого файла бывает удобно в случае, когда ActiveX поставляется бесплатно его автором в составе готового продукта, но требует отдельного лицензирования при встраивании его другими пользователями в свои разработки.

    Опция Include Version Information (Информация о версии) нужна для того, чтобы информация о версии управляющего элемента ActiveX была доступна использующим его приложениям. Для Visual Basic эту опцию использовать желательно.

    В результате работы ActiveX Control Wizard (мастера ActiveX) будет создано несколько модулей, сгенерирован уникальный идентификатор (GUID) будущего ActiveX, а также соответствующая библиотека типов.

    Библиотека типов содержит сведения о свойствах, событиях и методах компонента ActiveX, унаследованных от исходного VCL-компонента. В коде, связанном с реализацией ActiveX, можно найти описание этих свойств и методов.

    Отметим, что для включения элемента управления ActiveX в приложение необходимо, чтобы это приложение импортировало его библиотеку типов (элементы управления ActiveX, в отличие от некоторых других СОМ-серверов, обязаны экспонировать свою библиотеку типов). После этого на форме, на которую помещается элемент ActiveX, создается контейнер, представляющий собой СОМ-объект.

    В библиотеке типов элемента ActiveX содержится как минимум пара интерфейсов - IDispatch и DispInterface (диспинтерфейс). В IDispatch содержатся свойства и методы, которые экспонируются элементом управления ActiveX. Ссылка на IDispatch передается контейнеру, и контейнер может изменять свойства и вызывать методы элемента управления ActiveX. Кроме того, контейнер считывает идентификатор IID (Interface Identifier) и список методов диспинтерфейса элемента ActiveX. Далее внутри контейнера создаётся интерфейс IDispatch с тем же самым IID и тем же самым списком методов. Ссылка на этот интерфейс передается элементу ActiveX. При этом внутри самого ActiveX никаких дополнительных диспинтерфейсов не создается.

    Полученная ссылка на интерфейс IDispatch элемента ActiveX используется инспектором объектов для вызова методов, устанавливающих значения свойств элемента ActiveX. Обработчики событий, доступные в инспекторе объектов (или в его аналоге в других средствах разработки), связываются с интерфейсом IDispatch контейнера.

    Если на этапе выполнения необходимо изменить свойства элемента ActiveX или выполнить его методы, контейнер обращается к интерфейсу IDispatch элемента ActiveX. И наоборот, при возникновении событий в ActiveX он обращается к интерфейсу IDispatch контейнера.

    Методы СОМ-объекта можно вызвать либо через виртуальную таблицу методов (раннее связывание), либо через IDispatch (позднее связывание). Для вызова методов ActiveX и изменения его свойств контейнером используется раннее связывание. Однако при возникновении событий ActiveX вызывает методы контейнера только через IDispatch. Понятна причина такого различия - ActiveX всегда разрабатывается раньше контейнера, в котором он используется, и при его разработке таблица виртуальных методов контейнера недоступна.

    Далее следует сохранить и скомпилировать проект и зарегистрировать элемент ActiveX в реестре. Это делается с помощью выбора пункта меню Run | Register ActiveX Server (Выполнить | Зарегистрировать Сервер ActiveX). Если регистрация прошла успешно, то выдаётся соответствующее диагностическое сообщение.

    Описанный процесс создания компонента ActiveX можно увидеть здесь (2,32 Мб), а взять этот клип здесь (677 Кб). Кстати, обратите внимание: перед созданием компонента в среде Delphi нужно закрыть все проекты, выполнив пункт меню File | Close All. Разрегистрировать компонент можно, выполнив пункт меню Run | Unregister ActiveX Server (Выполнить | Разрегистрировать Сервер ActiveX). Это делается в том случае, когда компонент меняет свое местоположение или удаляется.

    После этого можно протестировать созданный ActiveX-компонент. Для этого разместим наш компонент в документе Microsoft Word. С этой целью можно запустить Microsoft Word, создать новый документ и выполнить пункт меню Сервис | Макрос | Редактор Visual Basic. Далее следует выбрать в окне Project имя вновь созданного документа, щелкнуть по нему правой кнопкой мыши и из полученного контекстного меню выбрать опцию Insert | UserForm. На экране появится редактор форм Visual Basic и панель элементов. Далее нужно щелкнуть правой клавишей мыши по панели элементов и выбрать из контекстного меню опцию Дополнительные элементы (Additional Controls). Теперь следует из появившегося списка всех зарегистрированных элементов управления ActiveX выбрать нужный, и он автоматически окажется на панели элементов Visual Basic.

    После этого можно поместить наш ActiveX на форму и попытаться изменить какие-либо его свойства, используя для этой цели окно Свойства (Properties).


Рис.3. Тестирование элемента ActiveX в Microsoft Word

    Вернёмся в редактируемый документ, поместим на него кнопку, дважды щелкнём по ней и в окне редактора кода создадим процедуру, показывающую созданную форму, вписав в сгенерированный код строку UserForm1.Show:

Private Sub CommandButton1_Click()
   UserForm1.Show
End Sub

    Теперь можно нажать на панели инструментов Visual Basic кнопку Выход из режима конструктора. После этого нажатие на созданную в теле документа кнопку приведет к появлению диалоговой панели с созданным нами элементом управления.

    Описанный процесс тестирования компонента можно увидеть здесь (1,44 Мб), а взять этот клип здесь (264 Кб).

    На следующем шаге мы рассмотрим создание страниц свойств у компонента ActiveX.




Предыдущий шаг Содержание Следующий шаг