Как создать ActiveX Control за 21 минуту на Microsoft Visual Basic

Новая версия Visual Basic значительно расширила возможности разработчиков, пользовательский интерфейс системы претерпел значительные изменения и стал гораздо удобнее для ведения проектов.

Технология ActiveX - открытый стандарт, позволяющий быстро создавать мощные интегрированные приложения и компоненты для Internet/Intranet сетей. ActiveX компоненты представляют собой функционально-законченные модули исполняемого кода, оформленные в виде .exe, .dll или .ocx файлов. Спецификация ActiveX позволяет сократить время на создание приложений за счет многократного использования готовых модулей. ActiveX – бинарный стандарт, это позволяет разрабатывать и использовать объекты в самых различных программных системах.

Одной из главных среди новых возможностей Visual Basic 5.0 является способность создавать ActiveX компоненты. До сих пор Visual Basic исполнял роль “glue language”, т.е. был предназначен для создания приложений на основе готовых функциональных элементов. Сами элементы разрабатывались с помощью инструментов подобных Visual C++ и требовали от разработчика высокой квалификации. Теперь программисты на Visual Basic могут сами создавать необходимые им ActiveX компоненты. Разработанные объекты могут выступать в роли конечного продукта и использоваться другими программистами. При этом обучение и сам процесс разработки являются более простыми и требуют меньше времени. Visual Basic позволяет создавать компоненты следующих типов:
* ActiveX Controls. Управляющие элементы пользовательского интерфейса, предназначенные для работы с широким кругом контейнеров, включая Web-броузеры.
* ActiveX Documents. Эти объекты напоминают VB форму, могут содержать встроенные объекты, для их просмотра можно использовать Microsoft Internet Explorer. Реализуются в виде in-process или out-of-process компонент.
* Code Components. Представляют собой библиотеки программно-управляемых объектов (старое название OLE Automation Server). Реализуются в виде in-process или out-of-process компонент.
Данный доклад посвящён созданию ActiveX Control на Visual Basic 5.0 и рассчитан на специалистов знакомых со средой разработки Visual Basic и технологиями ActiveX и OLE. Доклад сопровождается демонстрацией процесса создания и отладки ActiveX Control.

Варианты создания ActiveX Controls.

Visual Basic предлагает три модели для создания ActiveX Control:
* Разработка компоненты “с нуля” дает наибольшую свободу для определения пользовательского (appearance) и программного интерфейса объекта. Поместив необходимый код в процедуру обработки события Paint, Вы можете придать практически любой внешний вид control’у.
* Расширение существующего ActiveX Control. Добавив новые и предоставив существующие методы, свойства и события Вы можете определить необходимый программный интерфейс объекта. Изменение внешнего вида в данном случае является непростой проблемой, т.к. используемый объект уже содержит процедуру отображения внутри себя. Но и это возможно при использовании оператора AddressOf.
* Компоновка нового объекта из нескольких существующих. Этот вариант по возможностям аналогичен предыдущему.
Объект UserControl.

ActiveX Control, созданный на Visual Basic, всегда содержит (агрегирует) объект UserControl. Размещение и настройка свойств составляющих (constituent) ActiveX Controls производится с помощью специального редактора. Этот процесс напоминает размещение управляющих элементов на форме.

UserControl имеет стандартный интерфейс. Вы можете написать свои обработчики для событий, генерируемых этим объектом, предоставить для использования или переопределить стандартные свойства. Таким же образом Ваш ActiveX Control может экспортировать методы, свойства и события составляющих компонент.

Ключевые события.

В процессе своего существования ActiveX Control получает извещение о ряде событий, генерируемых объектом UserControl. Наиболее важными являются:
* Initialize. Самое первое событие, всегда происходит при создании ActiveX Control. В этот момент объект еще не имеет связи со своим контейнером.
* InitProperties. Это событие извещает о размещении нового control’а на форме. В момент его прихода встроенный объект уже имеет связь со своим контейнером. Как правило, обработчик события выполняет начальную инициализацию свойств ActiveX Control.
* ReadProperties. При загрузке формы (как в DesignMode, так и в RunMode) встроенные в неё элементы создаются заново и их свойства инициализируются сохранёнными в .frm файле значениями. Событие ReadProperties извещает ActiveX Control о необходимости выполнить эту инициализацию. В этот момент объект имеет связь со своим контейнером.
* Resize. Обработчик этого события отвечает за реакцию control’а на изменении его размеров.
* Paint. Обработчик этого события отвечает за отображение внешнего вида ActiveX Control. При установке свойства UserControl.AutoRedraw=True процесс визуализации происходит автоматически.
* WriteProperties. Извещает ActiveX Control о необходимости сохранить текущие значения его свойств. Генерируется в DesignMode при сохранении формы-контейнера.
* Terminate. Извещает ActiveX Control об его уничтожении.
Последовательность событий четко определена и характеризует текущее состояние объекта. При размещении нового ActiveX Control на форме, загрузке формы, запуске проекта на исполнение (переходе из DesignMode в RunMode) все объекты создаются заново, свойства инициализируются сохранёнными значениями (или значениями по умолчанию).

Контейнер и взаимодействие с ним.

Экземпляр ActiveX Control не может существовать сам по себе, он всегда “живёт” внутри своего контейнера и тесно взаимодействует с ним. Через свойства окружения (ambient properties) объект имеет доступ к информации о текущем состоянии своего “хозяина”. Контейнер поддерживает дополнительные методы, свойства и события которые для разработчика выглядят как часть интерфейса ActiveX Control.

Свойства окружения.

Информация о состоянии контейнера доступна ActiveX Control’у через объект AmbientProperties, ссылка на который может быть получена через свойство Ambient объекта UserControl.

Например, свойство UserControl.Ambient.BackColor отображает текущее значение цвета фона контейнера и обычно используется при отображении control’а. Важно отметить, что свойство BackColor принадлежит объекту AmbientProperties и по умолчанию не является внешним свойством разрабатываемого control’а и не доступно использующему его приложению.

Объект AmbientProperties, который предоставляет Visual Basic, содержит все свойства, определённые в спецификации ActiveX Controls. Действительные значения этих свойств предоставляются контейнером. В случае если конкретный контейнер не поддерживает какое-либо стандартное свойство, Visual Basic возвращает для него значение по умолчанию и благодаря этому не обязательно предусматривать обработку ошибок.

Некоторые контейнеры могут предоставлять дополнительные параметры окружения. Такие специфичные свойства не описаны в библиотеке типов Visual Basic и поэтому не видны в окне Object Browser. Дополнительную информацию можно найти в документации на контейнер. Доступ к таким свойствам осуществляется так же, как и к стандартным, но реализуется через механизм позднего связывания (late-bound). При обращении к нестандартным свойствам необходимо предусмотреть обработку ошибок.

Хорошо написанный ActiveX Control должен визуализировать себя в соответствии с текущим состоянием контейнера. Сообщение UserControl_AmbientChanged извещает control об изменении значения какого-либо свойства окружения контейнера.

Дополнительные свойства.

Дополнительные свойства (extender properties) предоставляются контейнером, но внешне выглядят как часть интерфейса control’а. Например, характеристики местоположения и размера объекта, его имя относятся к таким свойствам.

Разработчик ActiveX Control имеет доступ к дополнительным свойствам через свойство Extender объекта UserControl. Спецификация ActiveX Controls требует, чтобы все контейнеры поддерживали следующие дополнительные свойства: Name, Visible, Parent, Cancel, Default. На практике это требование не всегда выполняется, поэтому при обращении к extender properties необходимо предусмотреть обработку ошибок. Для доступа к дополнительным свойствам всегда используется механизм позднего связывания (late-bound), т.к. на момент компиляции неизвестно с каким контейнером ActiveX Control’у предстоит работать.

Когда пользователь обращается к свойству (методу) control’а, то первым управление получает объект Extender. Если он не поддерживает это свойство (метод), то вызывается обработчик ActiveX Control’а.

Создание программного интерфейса ActiveX Control.

Программный интерфейс ActiveX Control – это набор открытых (public) методов, свойств и событий, посредством которых происходит взаимодействие объекта с внешним миром.

По умолчанию интерфейс control’а ограничивается набором методов, свойств и событий, предоставляемых контейнером, при этом интерфейс составляющих объектов снаружи не доступен. Задача разработчика заключается в добавлении новых (custom) свойств и методов, генерации событий и выставлении наружу (expose) интерфейса составляющих объектов.

Свойства.

Открытые свойства control’а необходимо реализовывать с помощью процедур Property Get и Property Let. Это требование связано с необходимостью извещать Visual Basic посредством вызова метода UserControl.PropertyChanged при изменении значения свойства пользователем. Выполнение этого требования необходимо по следующим причинам:
* Если не вызвать метод PropertyChanged, то Visual Basic не передаст управление обработчику UserControl_WriteProperties для сохранения результатов редактирования в DesignMode и они будут утрачены.
* Значение свойства может быть одновременно доступно в нескольких местах, например, в окне Properties и в диалоге Property Pages. Вызов PropertyChanged синхронизирует отображаемую информацию.
Если для свойства созданы обе процедуры (Property Get и Property Let), то оно автоматически высвечивается в окне Property. Диалог Property Attributes меню Tools позволяет установить дополнительные атрибуты свойства.

Сохранение и восстановление состояния объекта.

Каждый раз, когда форма загружается для редактирования или исполнения все встроенные объекты создаются заново. Для сохранения свойств ActiveX Control между сеансами редактирования и для инициализации при запуске в RunMode служит механизм Property Persistence. Его реализация связана с тремя событиями: InitProperties, ReadProperties и WriteProperties, которые генерируются при размещении нового control’а на форме, считывании и сохранении состояния объекта соответственно.

Обработчики UserControl_WriteProperties и UserControl_ReadProperties получают в качестве параметра объект PropertyBag. Он имеет два метода:
* ReadProperty(Name As String, [DefaultValue]).
* WriteProperty(Name As String, Value, [DefaultValue]).
Используя эти методы разработчик ActiveX Control’а должен реализовать механизм сохранения и восстановления состояния объекта. В методе WriteProperty аргумент DefaultValue используется для экономии места при записи. WriteProperty проверяет текущее значение сохраняемого свойства с DefaultValue и при равенстве запись не производит. Рекомендуется для каждого свойства определять константу, равную значению по умолчанию и использовать ее при обработке событий InitProperties, WriteProperties и ReadProperties. В UserControl_ReadProperties необходимо предусмотреть проверку на корректность считываемых значений свойств.

Методы.

Для реализации новых методов программного интерфейса ActiveX Control’а достаточно просто добавить открытые (public) процедуры (sub) и/или функции (function).

Для видимых в RunMode объектов необходимо, как минимум, реализовать метод Refresh. Обычно он просто вызывает Refresh объекта UserControl, при этом user-drawn control получает сообщение Paint и производит свою отрисовку.

События.

Генерация событий – новая черта Visual Basic 5.0. События позволяют ActiveX Control’у активно взаимодействовать со своим контейнером.

Механизм работы с событиями достаточно прост. Необходимо выполнить два шага:
* Объявить событие с помощью выражения типа: Public Event EventName [(arglist)].
* Сгенерировать событие при помощи оператора RaiseEvent.
Рекомендуется, чтобы ActiveX Control генерировал следующие стандартные события: Click, DblClick, KeyDown, KeyPress, KeyUp, MouseDown, MouseMove и MouseUp.

Использование ActiveX Control Interface Wizard.

ActiveX Control Interface Wizard автоматизирует процесс создания кода для реализации программного интерфейса, позволяет выполнять следующие операции:
* Добавление стандартных методов, свойств и событий.
* Добавление дополнительных (custom) методов, свойств и событий.
* Задание атрибутов для открытых методов, свойств и событий.
Разработка Property Pages.

Диалоги Property Pages предлагают альтернативный способ настройки свойств ActiveX Control. Группы логически связанных свойств могут быть размещены на отдельных страницах диалога. Visual Basic 5.0 позволяет разрабатывать и использовать стандартные страницы.

Разработка пользовательского интерфейса Property Page аналогична разработке формы, но процесс написание кода отличается. Объект PropertyPage является базовым при разработке страниц диалога. В программном интерфейсе этого объекта наибольший интерес представляют:
* Событие SelectionChanged. Генерируется при изменении списка control’ов редактируемых с помощью диалога Property Pages. Поскольку диалог является немодальным, необходимо отслеживать это событие. Список текущих выделенных для редактирования ActiveX Control’ов хранится в коллекции PropertyPage.SelectedControls.
* Свойство Changed. При изменение пользователем значений свойств ActiveX Control’а необходимо устанавливать PropertyPage.Changed=True, иначе Visual Basic не будет оповещён об изменениях и кнопка «Применить» (Apply) останется недоступной (disable).
* Событие ApplyChanges. Обработчик вызывается при нажатии кнопок Ok, Apply, а также, если пользователь переходит на другую страницу диалога (tab). Необходимо установить значения свойств в соответствии с введенными величинами.
Visual Basic предоставляет для использования три стандартных страницы:
* StandartFont.
* StandartColor.
* StandartPicture.
При редактировании свойства типа Font, OLE_COLOR или Picture в окне свойств (properties window) автоматически вызывается соответствующая страница Property Page.

Инструмент Property Page Wizard помогает построить property pages для ActiveX Control’а. Для связывания отдельных страниц с ActiveX Control’ом служит диалог Connect Property Pages, который позволяет выбрать из списка доступных страниц необходимые и определить их взаимный порядок следования в диалоге редактирования свойств.

Использование ActiveX Control в Internet-приложениях.

ActiveX компоненты, разработанные на Visual Basic, могут быть использованы для построения Internet-решений.

Можно включать ActiveX Control’ы в HTML-странички и с помощью языка VBScript настраивать их свойства, вызывать методы, обрабатывать события. Такая возможность позволяет делать Internet-приложения интерактивными, придавать им удобный пользовательский интерфейс.

Приложения типа MS ActiveX Control Pad позволяют автоматизировать процесс встраивания и настройки ActiveX Control при создании HTML-страниц.

Распространение компонент.

Разработка компонент на Visual Basic может быть проведена двумя способами:
* ActiveX Control проект может содержать несколько модулей ActiveX Control (.ctl-файлов). При этом control’ы имеющие свойство UserControl.Public=True доступны вне проекта для всех приложений.
* Закрытые (private) ActiveX Control могут быть включены в проект любого типа, они доступны только внутри своего приложения.
Распространяя написанные Вами ActiveX Control’ы, Вы предоставляете возможность другим разработчикам использовать их при создании приложений. ActiveX компоненты, созданные на Visual Basic, требуют при исполнении наличия динамических библиотек (VB run-time DLL), кроме того, если ActiveX Control использует другие компоненты, то необходимо также поставлять все необходимые им файлы. Приложение Setup Wizard помогает определить все необходимые составляющие компоненты и создаёт стандартную программу установки.

Процесс распространения ActiveX компонент имеет два аспекта: лицензирование и совместимость версий.

Лицензирование.

Visual Basic поддерживает механизм защиты разработанных Вами компонент от нелегального использования. Для включения этого механизма необходимо отметить пункт Require License Key в диалоге установки свойств проекта. В этом случае при компиляции проекта будет создан .vbl-файл, содержащий регистрационный ключ (registry key). При создании инсталляционной программы Setup Wizard автоматически добавит процедуру регистрации устанавливаемых компонент.

При попытке использования ActiveX компоненты для разработки другого приложения будет проверено наличие лицензии на машине разработчика. При распространении разработчиком продукта, использующего Вашу компоненту на компьютере пользователя лицензия устанавливаться не должна, это позволит использовать ActiveX Control только в режиме исполнения (RunMode).

При использовании ActiveX Control’а на WWW страницах броузер клиента запрашивает у сервера лицензионный ключ и использует его для создания объекта, при этом полученная лицензия в регистрационную базу (Registry) компьютера клиента не добавляется.

Совместимость версий.

При разработке новой версии ActiveX Control’а необходимо предусмотреть обратную совместимость по следующим моментам:
* Программный интерфейс объекта, т.е. набор его свойств, методов и событий.
* Влияние установленных свойств объекта UserControl на поведение control’а.
* Сохранение и восстановление состояния объекта.
* Атрибуты процедур.
Новая версия может иметь новые открытые методы, свойства и события, но удаление или изменение аргументов существующих приведет к несовместимости. Visual Basic может выполнять автоматическую проверку на совместимость программного интерфейса. Для этого необходимо отметить Binary Compatibility в диалоге свойств проекта.

Изменение настроек свойств объекта UserControl также может быть причиной несовместимости версий. Например, если ранняя версия была скомпилирована с UserControl.ControlContainer=True, а в следующей это свойство было изменено на False, то ActiveX Control потеряет возможность выступать в роли контейнера для других объектов. При этом приложения, оттестированные со старой версией control’а, с новой могут не работать.

Если в новой версии какое-то свойство оставлено только для совместимости, то необходимо восстанавливать его значение при загрузке (сообщение ReadProperties). Сохранять (сообщение WriteProperties) его не обязательно.

Изменение свойства, обращение к которому происходит “по умолчанию” (default property) также может быть причиной несовместимости.

Заключение.

Процесс разработки ActiveX Controls на Visual Basic также прост, как и … всё на Visual Basic. Большое количество средств автоматизации разработки (Wizards), удобный пользовательский интерфейс, средства отладки и хорошая справочная система позволяют быстро разрабатывать компоненты, обладающие широкими возможностями и готовые для построения Internet-решений.

С появлением возможности разработки ActiveX Controls количество сторонников такого популярного средства разработки как Microsoft Visual Basic, несомненно, возрастёт.


Сайт создан в системе uCoz