Владислав Васильев, MCSD
Новая версия 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 Control на Visual Basic 5.0 и рассчитан на специалистов знакомых со средой разработки Visual Basic и технологиями ActiveX и OLE. Доклад сопровождается демонстрацией процесса создания и отладки ActiveX Control.
Visual Basic предлагает три модели для создания ActiveX Control:
ActiveX Control, созданный на Visual Basic, всегда содержит (агрегирует) объект UserControl. Размещение и настройка свойств составляющих (constituent) ActiveX Controls производится с помощью специального редактора. Этот процесс напоминает размещение управляющих элементов на форме.
UserControl имеет стандартный интерфейс. Вы можете написать свои обработчики для событий, генерируемых этим объектом, предоставить для использования или переопределить стандартные свойства. Таким же образом Ваш ActiveX Control может экспортировать методы, свойства и события составляющих компонент.
В процессе своего существования ActiveX Control получает извещение о ряде событий, генерируемых объектом UserControl. Наиболее важными являются:
Последовательность событий четко определена и характеризует текущее состояние объекта. При размещении нового 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 – это набор открытых (public) методов, свойств и событий, посредством которых происходит взаимодействие объекта с внешним миром.
По умолчанию интерфейс control’а ограничивается набором методов, свойств и событий, предоставляемых контейнером, при этом интерфейс составляющих объектов снаружи не доступен. Задача разработчика заключается в добавлении новых (custom) свойств и методов, генерации событий и выставлении наружу (expose) интерфейса составляющих объектов.
Открытые свойства control’а необходимо реализовывать с помощью процедур Property Get и Property Let. Это требование связано с необходимостью извещать Visual Basic посредством вызова метода UserControl.PropertyChanged при изменении значения свойства пользователем. Выполнение этого требования необходимо по следующим причинам:
Если для свойства созданы обе процедуры (Property Get и Property Let), то оно автоматически высвечивается в окне Property. Диалог Property Attributes меню Tools позволяет установить дополнительные атрибуты свойства.
Каждый раз, когда форма загружается для редактирования или исполнения все встроенные объекты создаются заново. Для сохранения свойств ActiveX Control между сеансами редактирования и для инициализации при запуске в RunMode служит механизм Property Persistence. Его реализация связана с тремя событиями: InitProperties, ReadProperties и WriteProperties, которые генерируются при размещении нового control’а на форме, считывании и сохранении состояния объекта соответственно.
Обработчики UserControl_WriteProperties и UserControl_ReadProperties получают в качестве параметра объект PropertyBag. Он имеет два метода:
Используя эти методы разработчик 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’у активно взаимодействовать со своим контейнером.
Механизм работы с событиями достаточно прост. Необходимо выполнить два шага:
Рекомендуется, чтобы ActiveX Control генерировал следующие стандартные события: Click, DblClick, KeyDown, KeyPress, KeyUp, MouseDown, MouseMove и MouseUp.
ActiveX Control Interface Wizard автоматизирует процесс создания кода для реализации программного интерфейса, позволяет выполнять следующие операции:
Диалоги Property Pages предлагают альтернативный способ настройки свойств ActiveX Control. Группы логически связанных свойств могут быть размещены на отдельных страницах диалога. Visual Basic 5.0 позволяет разрабатывать и использовать стандартные страницы.
Разработка пользовательского интерфейса Property Page аналогична разработке формы, но процесс написание кода отличается. Объект PropertyPage является базовым при разработке страниц диалога. В программном интерфейсе этого объекта наибольший интерес представляют:
Visual Basic предоставляет для использования три стандартных страницы:
При редактировании свойства типа Font, OLE_COLOR или Picture в окне свойств (properties window) автоматически вызывается соответствующая страница Property Page.
Инструмент Property Page Wizard помогает построить property pages для ActiveX Control’а. Для связывания отдельных страниц с ActiveX Control’ом служит диалог Connect Property Pages, который позволяет выбрать из списка доступных страниц необходимые и определить их взаимный порядок следования в диалоге редактирования свойств.
ActiveX компоненты, разработанные на Visual Basic, могут быть использованы для построения Internet-решений.
Можно включать ActiveX Control’ы в HTML-странички и с помощью языка VBScript настраивать их свойства, вызывать методы, обрабатывать события. Такая возможность позволяет делать Internet-приложения интерактивными, придавать им удобный пользовательский интерфейс.
Приложения типа MS ActiveX Control Pad позволяют автоматизировать процесс встраивания и настройки ActiveX Control при создании HTML-страниц.
Разработка компонент на Visual Basic может быть проведена двумя способами:
Распространяя написанные Вами 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’а необходимо предусмотреть обратную совместимость по следующим моментам:
Новая версия может иметь новые открытые методы, свойства и события, но удаление или изменение аргументов существующих приведет к несовместимости. 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, несомненно, возрастёт.