    Глава 9. Создание элементов управления ActiveX	221 

    Глава 9.   Создание элементов управления ActiveX 

    Элемент управления ActiveX — объект, который помещается в форму для 
расширения возможностей взаимодействия пользователя с приложением. С 
элементами управления ActiveX связаны события, и они могут быть включены в 
другие элементы управления. Эти элементы управления имеют расширение имени 
файла .осх. Любые элементы управления ActiveX, созданные в Visual Basic, могут 
использоваться в приложении-клиенте ActiveX, например в другом приложении 
Visual Basic, в Microsoft Office и Internet Explorer. 

    9.1. Введение в элементы управления ActiveX 

    9.1.1. Классы элементов управления 

    Элементы управления — объекты многократного использования, которые 
включают визуальные элементы и программный код. В процессе разработки 
приложения элементы управления должны быть помещены в некоторый тип контейнера 
— форму или непосредственно приложение. 
    Элемент управления, который создается в Visual Basic, известен как класс 
элемента управления, который действует как шаблон для этого элемента 
управления. При размещении элемента управления в форме создается объект — 
экземпляр класса этого элемента управления (чтобы распределить и 
инициализировать структуры данных объекта в памяти), как показано на следующей иллюстрации: 

    Класс элемента управления	Экземпляр 
    элемента управления 
    Контейнер - объект UserControl (Ctrl) 
    Ctrl.ctl 
    CtrM 

    Рис. 9.1. Создание экземпляра класса элемента управления. 


    9.1.2. Элементы управления — компоненты 

    Элементы управления могут компилироваться в элементы управления — 
компоненты, также известные как файлы .осх. Элемент управления — компонент 
может обеспечивать больше чем один вид элемента управления. 
    Проект элемента управления ActiveX в Visual Basic содержит один или больше 
файлов .ей, каждый из которых определяет отдельный класс элемента управления. 
При компиляции проекта элемента управления создается файл .осх для элемента 
управления — компонента. 
    Единственный файл .осх может содержать несколько элементов управления, как 
показано на рис. 9.2. 

    9.1.3. Элементы управления ActiveX и программные компоненты 

    Элементы управления отличаются от программных компонентов. 
    Программный компонент — приложение, которое предоставляет некоторые 
функциональные возможности, которые могут многократно использоваться другим 
приложением через 


    222 Введение в элементы управления ActiveX 


    Компонент .осх 
    Составляющие элементы управления 

    Рис. 9.2. Компонент .осх и составляющие элементы управления. 

    Программный компонент 
    Решает некоторые реальные задачи, предоставляя клиенту свои свойства, 
методы и события 
    Приложение-клиент 
    Использует свойства, методы и события компонента 
    Компонент .осх Формирует пользовательский интерфейс	——— 
»		Пользовательский шемент управления 
    п° 
    
    События генерируются действиями пользователя 

    Рис. 9.3. Элементы управления и программные компоненты. 

    Автоматику. Элементы управления — компоненты содержат визуальные элементы, 
кот рые могут генерировать события, основанные на действиях пользователя (рис. 9.3). 

    9.1.4. Объект User-Control 

    Объект UserControl — основа для формирования элементов управления. Каждый 
элемент управления ActiveX, который создается с помощью Visual Basic, содержит 
объект UserControl 
    Объекты UserControl содержат модули программного кода и визуальные 
дизайнеры. Пои открытии UserControl в режиме разработки объект выводится в 
окне визуального дизайнеса. Визуальный дизайнер можно использовать как 
контейнер для размещения в объекте User-Control дополнительных элементов 
управления, как если бы это была форма Visual Basic (рис. 9.4). 

    Файлы, ассоциируемые с объектом UserControl 

    Исходный текст и значения свойства для объекта UserControl хранятся в 
текстовых файлах с расширением .ctl. Файл .ctl эквивалентен файлу Visual Basic 
.frm, который используется для хранения аналогичной информации для формы. 
    Графические элементы, которые не могут быть сохранены как текст, хранятся 
в файлах: расширением .ctx. Формат файла .ctx эквивалентен формату файла .frx, 
который исполь , ется для хозненир гозфических элементов в формах. 


    Глава 9, Создание элементов управления ActiveX 223 


    Рис. 9.4. Объект UserControl и его окно кода. 


    9.1.5. Тиражирование элементов управления ActiveX 

    Способ распространения элемента управления зависит от того, как элемент 
управления будет использоваться. Элемент управления можно тиражировать либо 
как компилированный компонент, либо включать исходный текст элемента 
управления как часть приложения. 
    Элемент управления ActiveX может использоваться во многих разных типах 
приложений, таких, как приложения Microsoft Office, Internet Explorer и формы 
Visual Basic. Элементы управления ActiveX можно использовать с локальными 
проектами или загружать их на Web-страницу. 

    Тиражирование элементов управления как компилированных компонентов 

    Чтобы иметь возможность распространять с приложением компилированный 
элемент управления — компонент (файл .осх), необходимо создать элемент 
управления ActiveX как public класс. Подключить компилированный компонент 
можно через программу Setup приложения. 

    Тиражирование элементов управления в виде исходного текста 

    Файл .ctl можно включать в любой проект Visual Basic. При построении 
приложения исходный текст элемента управления компилируется как часть 
исполняемого файла приложения. 
    Преимущества распространения элементов управления в виде исходного текста: 
    •   не требуется тиражировать и устанавливать файл .осх; 
    •   поддерживается независимость версий, так как версия исходного текста 
элемента управления компилируется в приложение. 
    Недостатком распространения элементов управления в виде исходного текста 
является требование дополнительного дискового пространства, так как каждое 
приложение включает весь исходный текст для элемента управления. 


    224 Создание пользовательского интерфейса элемента управления 


    9.1.6. Шаги создания элемента управления ActiveX 

    При формировании элемента управления ActiveX выполняются следующие шаги: 
    1. Создать пользовательский интерфейс для элемента управления. 
    2. Создать и установить свойства и методы элемента управления. 
    3. Определить порядок реакции элемента управления на события. 
    4. Добавить страницы свойств для элемента управления. 
    5. Отладить и испытать элемент управления. 

    9.2. Создание пользовательского интерфейса элемента управления 

    Процедура создания пользовательского интерфейса элемента управления 
ActiveX подобна построению стандартной формы Visual Basic. На полотне 
контейнера помещаются элементы управления и затем вводится программный код, 
который определяет поведение этих элементов управления. 
    Однако в отличие от формы элемент управления действует как компонент 
внутри приложения. Приступая к разработке элемента управления, полезно изучить 
реализацию существующих элементов управления. Например, если разрабатывается 
элемент управления который принимает ввод, можно просмотреть свойства, методы 
и события, обеспечиваемые стандартным элементом управления TextBox. 

    9.2.1. Добавление составляющих элементов управления 

    Элемент управления ActiveX включает объект UserControl и составляющие 
элементы управления. 
    Составляющий элемент управления — экземпляр элемента управления, который 
помещается в объект UserControl. При размещении элемента управления ActiveX в 
форме, создается экземпляр объекта UserControl, вместе с экземплярами других 
составляющих элементов управления, помещенных в объект UserControl. 
    На следующей иллюстрации показан объект UserControl, в который помещены 
несколько составляющих элементов управления: 

    Рис. 9.5. Элемент управления ActiveX и его конструктивы. 

    Использование составляющих элементов управления В UserControl можно 
использовать любой стандартный элемент управления Visual Basic, за исключением 
элемента управления OLE Container. 
    Если требуется использовать подключаемые (не встроенные) элементы 
управления, их нужно внести в проект через окно диалога Components (см. рис. 1.3). 


    Глава 9. Создание элементов управления ActiveX	225 


    9.2.2. Настройка размера элемента управления 

    Заранее нельзя предусмотреть, как пользователи элемента управления будут 
работать с ним на экране, поэтому при написании программного кода для элемента 
управления необходимо рассмотреть различные сценарии установления его размеров. 
    Факторы, которые определяют вывод элемента управления на экран, включают 
объем доступного экранного пространства, настройки пользователя и контейнера 
элемента управления. 
    Следующие сценарии описывают общие способы изменения размеров элементов управления: 
    •   пользователь изменяет размер элемента управления и его составляющих 
элементов управления в период выполнения; 
    •   разработчик формы, которая включает элемент управления, изменяет 
размер элемента управления и его составляющих элементов управления во время разработки. 
    Пользователь может также изменить размер формы, которая содержит объект 
UserControl, состоящий, например, из командной кнопки, нескольких текстовых 
полей и простого списка. Если к событию Resize не добавлен соответствующий 
программный код, при уменьшении пользователем размера формы текстовые поля и 
список могут быть видны не полностью. 

    Примечание: Контейнеры сами по себе не могут обрабатывать ошибки, 
возникающие во время события Resize, и в этом случае работа приложения, 
использующего элемент управления, может быть нарушена. Следовательно, 
обработку ошибок необходимо обеспечить в процедурах обработки события Resize. 


    9.2.3. Настройка пользовательского интерфейса 

    Событие Resize можно использовать для управления изменением размера 
элементов управления и подстройки их вида. Установка размеров составляющих 
элементов управления регулируется изменением текущих значений соответствующих 
свойств объекта UserControl. ' 
    В следующем фрагменте кода при изменении размера объекта UserControl 
подстраивается ширина текстового поля: 

    Private   Sub  UserControl_Resize() Const  MinWide   =   2000 If  
UserControl.ScaleWidth  < MinWide  Then 
    Textl.Width  =   1000 Else 
    '   Масштабировать   поле   в   соответствии  с  размером  UserControl 
Textl.Width  =  UserControl.ScaleWidth   -   Textl.Left End   If End  Sub 


    9.2.4. Создание элемента управления — контейнера 

    Некоторые элементы управления могут действовать как контейнеры для других 
элементов управления. Например, можно использовать элемент управления Рамка 
(Frame) Visual Basic как контейнер для любых составляющих элементов 
управления. При выборе элемента управления Рамка в форме и при его перемещении 
все составляющие элементы управления переместятся с контейнером. 
    Чтобы можно было использовать экземпляр элемента управления ActiveX в 
качестве контейнера для элементов управления другого разработчика, необходимо 
установить в True свойство ControlContainer объекта UserControl. 

    8 Зак.   136 


    226	Создание пользовательского интерфейса элемента управления 


    Производительность элемента управления — контейнера 

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

    Семейство ContainedControls 

    Для выполнения операций с любым из размещенных элементов управления можно 
использовать семейство ContainedControls экземпляра элемента управления 
ActiveX, который служит контейнером для других элементов управления. 
    Свойство ContainedControls возвращает семейство элементов управления, 
которые разработчик или конечный пользователь может добавлять к элементу 
управления ActiveX в период выполнения. При создании элемента управления это 
свойство недоступно, а в период выполнения доступно только для чтения. 
    В следующем фрагменте кода показано, как использовать семейство 
ContainedControls для получения имен элементов управления, содержащихся в 
элементе управления ActiveX: 

    Dim  CtrContained  As   Object For  Each   CtrContained   In  _ 
    UserControll.ContainedControls MsgBox  CtrContained.Name Next 

    В этом случае, если экземпляр элемента управления ActiveX содержит две 
командные кнопки и свойство ControlContainer элемента управления установлено в 
True, элемент управления выведет на экран имена кнопок. 

    9.2.5. Добавление окна About 

    Элементы управления ActiveX могут иметь свойство About. Чтобы добавить к 
элементу управления окно About: 
    1. Добавить к проекту форму About. 
    2. Добавить процедуру для вывода формы на экран. 
    3. В окне Procedure Attributes установить Procedure ID этой процедуры к AboutBox. 
    Чтобы вывести на экран окно About для элемента управления, нужно щелкнуть 
кнопку с многоточием (...) в строке свойства About (рис. 9.6). 

    9.2.6. Специфицирование пиктограммы для панели элементов 

    Для пользовательского элемента управления можно специфицировать растровый 
рисунок, которым элемент управления будет представлен на панели элементов 
Visual Basic, как показано на рис. 9.7. 
    Растровые рисунки панели элементов должны быть размером 16 X 15 пикселей. 
Если специфицируется рисунок другого размера, он будет масштабироваться к 
стандартному размеру, что обычно приводит к искажению образа. 


    Глава 9. Создание элементов управления ActiveX 227 


    Рис. 9.6. Окно About и его место в проекте. 

    Рис. 9.7. Кнопка пользовательского элемента управления на панели элементов. 

    Чтобы специфицировать растровый рисунок объекта UserControl, необходимо 
установить его свойство ToolboxBitmap. 


    228	Тестирование элемента управления 


    9.3. Тестирование элемента управления 

    В ходе разработки элемента управления ActiveX необходимо проводить 
тестирование егс функциональных возможностей. Разработчик, который будет 
использовать этот элемент управления ActiveX, должен иметь возможность 
работать с ним в режиме разработки. Та; как элемент управления сам по себе не 
может быть запущен, для его тестирования потребуется создать другой проект. 
    События в элементе управления ActiveX будут вести себя по-разному, в 
зависимости от порядка его инициирования. Понимание этого поведения поможет 
разработчику правильно организовать отладку элементов управления. 

    9.3.1. Создание испытательного проекта 

    При отладке элемента управления (в противоположность объектам других 
типов), при создании экземпляра элемента управления во время разработки 
некоторые части программного кода элемента управления фактически выполняются. 
    Для выполнения программного кода в режиме разработки имеется ряд причин, в 
частности то, что разработчик при этом может устанавливать свойства элемента 
управления (то есть взаимодействует с ним). 
    Так как элемент управления ActiveX не может выполняться автономно, то для 
тестирования проекта элемента управления необходимо создать другой проект 
.exe. Visual Basic позволяет загрузить два или больше проектов в группу 
проектов, которая сохраняется с расширением .vbg. Для запуска и тестирования 
элемента управления используется форма в другом проекте. 
    Для добавления испытательного проекта к группе проектов: 
    1. В меню File выбрать Add Project или нажать кнопку со списком Add 
Project на панели инструментов. 
    Команды Open Project или New Project выбирать нельзя, так как они закроют 
проект элемента управления. 
    2. В окне диалога Add Project дважды щелкнуть пиктограмму Standard EXE, 
чтобы добавить проект .ехе к группе проектов. 
    В окне Project Explorer теперь будут видны оба проекта. Заголовок окна 
Project Explorer указывает имя группы проекта (см. рис. 9.6). 
    Чтобы запустить программный код элемента управления во время разработки, 
необходимо закрыть визуальный дизайнер элемента управления. При этом Visual 
Basic выводит пиктограмму для элемента управления в панели элементов, что дает 
возможность размещать экземпляры элемента управления в форме-контейнере. 

    9.3.2. Отладка элемента управления и обработка ошибок 

    После создания для элемента управления ActiveX испытательного проекта 
можно тестировать и отлаживать элемент управления таким же образом, как это 
делается для компонента in-process. Различие между отладкой проекта элемента 
управления ActiveX и компонента in-process в том, что программный код 
компонента может выполняться в то время, когда клиент находится в режиме разработки. 
    В обоих случаях процесс отладки происходит между компонентом и клиентом 
внутри одной интегрированной среды разработки (IDE). Это позволяет проходить 
пошагово через код клиента с заходом в компонент. 

    Глава 9. Создание элементов управления ActiveX 229 
    Информацию относительно отладки элемента управления ActiveX см. в разделе 
"Тестирование программных компонентов ActiveX" главы 8 "Создание программных 
компонентов ActiveX". 
    9.3.3. Экземпляры и события элементов управления 
    Для успешного тестирования элементов управления полезно разобраться с 
поведением событий объекта UserControl. 
    Элемент управления ActiveX — клиент, который работает в форме или 
контейнере другого типа. Следовательно, его события ведут себя несколько 
по-другому, нежели события элемента управления в форме стандартного проекта .ехе. 
    События в экземплярах элементов управления 
    При создании элементов управления в форме или другом контейнере объект 
UserControl действует как шаблон для создания экземпляра класса элемента 
управления. В процессе создания элемента управления происходит ряд событий. 
Эти события и порядок, в котором они происходят, зависят от конкретных 
действий пользователя или системы, которые выполняются в течение периода 
существования экземпляра элемента управления. 
    В следующей таблице суммируется, какие события происходят в процессе 
создания элемента управления: 
    9.4. Предоставление свойств, методов и событий 
    Как и в случае с любым стандартным элементом управления в приложении 
Visual Basic, элемент управления ActiveX обеспечивает свои функциональные 
возможности, предоставляя свойства, методы и события. Процесс создания 
свойств, методов и событий для элемента управления подобен созданию их для 
программных компонентов. 
    Выполнить многие из процедур, ассоциированных с предоставлением свойств, 
методов и событий, можно с помощью мастера ActiveX Control Interface Wizard. 
    Ниже приводится информация относительно использования процедур Property 
для создания свойств, делегирования этих свойств нескольким элементам 
управления, а также сохранения и получения значений свойств. 

Тип экземпляра  Действие пользователя  События элемента управления 

Помещает элемент управле- Создается экземпляр периода разработки.
Initialize, InitProperties, Resize, ния в форму.                 
                              Paint Во время разработки 
запуска- Экземпляр  периода  раз- 

WriteProperties, Terminate, ет  приложение,  
содержащее работки   разрушается,   и 

Initialize, ReadProperties, элемент управления.                 создается экземпляр пе- 

Resize, Paint риода 
выполнения. Во время разработки выходит Экземпляр   периода   вы- 

Terminate, Initialize, из приложения, содержащего полнения  разрушается  и 

ReadProperties, Resize, Paint элемент управления.                 создается. 
Закрывает   форму,   содержа- Экземпляр периода разра- 

WriteProperties, Terminate щую элемент управления.          ботки разрушается. Запускает  
скомпилированное Создается эк земпляр пе- 

Initialize, ReadProperties, 
приложение.                               риода выполнения.              

Resize, Paint 


    230	Предоставление свойств, методов и событий 


    9.4.1. Построение свойств 


    Примечание: Контейнер для элемента управления ActiveX первоначально уже 
обеспечивает ряб умолчательных свойств, так что разработчик должен решить, 
какие потребуются дополнительные свойства. 

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

    Для создания свойств для элементов управления используются процедуры 
Property. Процесс создания свойства для элемента управления подобен созданию 
свойства для программного компонента. Дополнительную информацию см. в разделе 
"Использования процедур Property для создания свойств" главы 8 "Создание 
программных компонентов ActiveX". 
    Для элементов управления нельзя использовать переменные public для 
хранения значения свойства. Для передачи в контейнер уведомления о том, что 
значение свойства изменилось, используется метод PropertyChanged объекта 
UserControl внутри оператора PropertyLet или PropertySet. 
    Синтаксис метода PropertyChanged: o6be«m.PropertyChanged имя_свойства 
Элементы синтаксиса: 

    Элемент	Описание 

    объект	Имя объекта — в данном случае объекта EserControl. 
    имя_свойства	Строковое выражение, представляющее имя свойства, значение 
которого изменено элементом управления. 
    В следующем фрагменте кода показана процедура Property, в которой 
определяется свойство Name: 

    Public   Property  Get  Name()   As   String 
    Name  =  txtName.Text End  Property 
    Public   Property  Let  Name(ByVal  NewName  As   String) 
    txtName.Text  =  NewName 
    PropertyChanged   "Name" End  Property 


    Предоставление свойств составляющих элементов управления 

    Когда пользователь работает с элементом управления, свойства объекта 
UserControl и всех составляющих элементов управления, по умолчанию, во время 
разработки не доступны. Однако свойства можно сделать доступными через 
существующие свойства объекта User-Control или составляющих элементов управления. 
    Например, если создается элемент управления, который содержит элемент 
управления Label и элемент управления TextBox, то, используя процедуры 
Property, можно предоставлять свойства объекта UserControl или составляющих 
элементов управления. 
    В следующем фрагменте кода показано, как предоставить свойство Caption 
элемента управления Label, который является составляющим элементом управления 
объекта UserControl: 

    Public   Property  Get   Caption()   As   String 
    Caption  =   IblName.Caption End  Property 


    Глава 9. Создание элементов управления ActiveX	231 


    Public   Property  Let  Caption(ByVal   NewCaption  As   String) 
    IblName.Caption   =  NewCaption 
    PropertyChanged   "Caption" End  Property 

    Когда экземпляр объекта UserControl помещается в форму, свойство Caption 
для этого экземпляра становится доступным в окне свойств. Разработчик, который 
использует данный элемент управления, может установить текстовое значение, 
который появится в надписи. 

    Делегирование свойства нескольким элементам управления 

    Через механизм делегирования можно спроецировать свойство элемента 
управления на свойство более чем одного составляющего элемента управления. 
    Например, если для объекта UserControl устанавливается пользовательский 
цвет символа, этот цвет можно распространить на составляющие элементы 
управления, как показано в следующем примере кода: 

    Public Property Get ForeColorO As OLE_COLOR 
    ForeColor = Controll.ForeColor End Property 
    Public Property Let ForeColor(ByVal NewfColor As OLE_COLOR) Dim ctlElement 
As Object Controll.ForeColor = NewfColor For Each ctlElement In Controls 
    If(TypeOf ctlElement Is Label) _ 
    Or (TypeOf ctlElement Is CheckBox) _ 
    Then ctlElement.ForeColor = NewfColor Next 
    PropertyChanged "ForeColor" End Property 


    9.4.2. Добавление методов 

    Пользовательские методы можно создать или делегировать составляющим 
элементам управления точно так же, как это делается для свойств. 

    Создание метода 

    Процедура создания методов для элементов управления в целом аналогична 
созданию методов для программных компонентов — в модуле программного кода 
объекта UserControl объявляется процедура Public Sub или Function, которая 
затем вызывается в контейнере, в котором создается элемент управления класса UserControl. 
    Дополнительную информацию относительно создания методов см. в разделе 
"Создание методов" главы 8 "Создание программных компонентов ActiveX". 
    В следующем фрагменте кода в элементе управления UserControl 1 создается 
метод, который при загрузке формы выводит на экран дату: 

    Public Sub ShowDateO 
    MsgBox "Date is: " & Now () End Sub 
    Private Sub Form_Load() UserControll.ShowDate End Sub 


    232	Предоставление свойств, методов и событий 


    Предоставление методов составляющих элементов управления 

    В приложении также можно предоставлять методы любого составляющего 
элемента упр ления, который является частью пользовательского элемента 
управления; приложение-» тейнер может вызывать эти методы. 
    В следующем фрагменте создается метод IDFocus, который вызывается в 
событии кнопки в форме-контейнере: 

    Public   Sub   IDFocus() txtEmpID.SetFocus End  Sub 
    Private   Sub   cmdSet!dFocus_Click() 
    Controll.IDFocus End  Sub 

    В этом примере элемент управления txtEmpID — составляющий в объекте 
UserCon Когда пользователь щелкает кнопку в форме контейнера, фокус будет 
автоматиче установлен на поле txtEmpID в объекте UserControl. 

    9.4.3. Использование общих свойств контейнера 

    Разработчик элемента управления не всегда может предвидеть, контейнер 
какого будет использоваться. Следовательно, проектировать элемент управления 
следует • образом, чтобы он мог правильно функционировать в контейнерах разных 
типов. Что гарантировать согласованность между элементом управления и 
контейнером, можно i пользовать общие свойства контейнера. 
    Контейнеры содержат общие свойства, которые обеспечивают им правильное 
поведен при размещении элементов управления. Общие свойства гарантируют, что 
пользовател элемента управления увидит ожидаемые визуальные атрибуты и 
действия независимо от контейнера. Например, BackColor — одно из стандартных 
общих свойств формы Visual Basic. Контейнер предлагает для элемента управления 
цвет фона, который соответствует цвету контейнера. 

    Событие AmbientChanged 

    Событие AmbientChanged происходит при изменении общего свойства. Чтобы 
пользовательский элемент управления реагировал на изменения значений общих 
свойств контейнера во время разработки, необходимо поместить программный код в 
процедуру события AmbientChanged. Это событие имеет один параметр, 
PropertyName, который идентифицирует изменившееся свойство. 

    Объект Ambient 

    Объект Ambient позволяет читать значения различных общих свойств. 
    Например, в следующем примере показано, как использовать объект Ambient в 
процедуре события AmbientChanged: 

    Private   Sub  UserControl_AmbientChanged(PropertyName  As   String) 
    If   PropertyName   =   "BackColor"   Then 
    UserControl.BackColor  =  Ambient.BackColor 
    End   If End   Sub 

    В этом примере, если разработчик, который использует элемент управления, 
изменяет свойство BackColor контейнера, цвет фона экземпляра элемента 
управления также соответственно изменяется на цвет контейнера. 


    Глава 9. Создание элементов управления ActiveX	233 


    Поддержка свойства Enabled 

    Свойство Enabled — также общее свойство. Чтобы правильно поддерживать это 
свойство объекта UserControl, необходимо составить программный код для 
процедур Property свойства Enabled и затем ассоциировать этот код со свойством Enabled. 
    Так как контейнер ответственен за активацию и деактивацию элементов 
управления, необходимо ассоциировать свойство Enabled с идентификатором 
процедуры Enabled, гарантируя этим, что элемент управления не конфликтует с 
другими свойствами. Чтобы ассоциировать свойство Enabled с идентификатором 
процедуры Enabled, нужно выбрать Procedure Attributes в меню Tools и затем 
выбрать Enabled из списка Procedure ID. 

    9.4.4. Хранение и получение значений свойств 

    Экземпляры элементов управления непрерывно создаются и разрушаются, 
поэтому следует гарантировать сохранение значений свойств. При создании 
элемента управления необходимо включить программный код, который будет 
сохранять и отбирать значения свойств элемента управления. 
    Для хранения и получения информации состояния объекта при каждом вызове 
объекта используется объект PropertyBag, который передается через события 
ReadProperties и WriteProperties. 
    В следующем фрагменте кода с помощью объекта PropertyBag выполняется 
сохранение текущих значений свойств для метода WriteProperty: 

    Private   Sub  UserControl_ WriteProperties(PropBag As   PropertyBag) 
PropBag.WriteProperty  "Caption",   _ 
    Caption,   Username End  Sub 

    Чтение значения свойства выполняется с использованием события 
ReadProperties и метода ReadProperty объекта PropertyBag. 
    Метод ReadProperty принимает два параметра: строку, содержащую имя 
свойства, и значение по умолчанию. Если значение свойства было сохранено, 
метод ReadProperty возвращает это значение. Если значение свойства не было 
сохранено, метод возвращает значение по умолчанию. 
    В следующем примере показано, как использовать метод ReadProperty для 
возвращения сохраненного значения свойства Caption: 

    Private   Sub  UserControl  _ ReadProperties(PropBag  As   PropertyBag) '  
 Обработка  недействительных   значений  свойства On  Error  Resume  Next 
Caption  =   PropBag.ReadProperty   "Caption",   _ 
    Username 
    ' ... Обработка других свойств End Sub 


    Умолчательные значения свойств 

    При чтении и записи значений свойств важно обеспечить некоторые значения 
по умолчанию. Visual Basic записывает строку кода в файле контейнера элемента 
управления (.frm, .dob, .pag или .ctl), только если значение свойства 
отличается от значения по умолчанию, которое предусмотрел разработчик. В 
результате применения значений по умолчанию размеры файлов уменьшаются, а 
производительность приложения повышается. 


    234 Предоставление свойств, методов и событий 


    9.4.5. Использование именованных констант 

    В Visual Basic версии 5.0 можно использовать перечисления, чтобы 
обеспечивать для компонента именованные константы. Перечисления обеспечивают 
удобный способ группирования набора связанных именованных констант и 
ассоциирования их с постоянными значениями. Значения перечисления при 
написании программного кода для элемента управления можно получить в 
раскрывающемся списке при активированной функции Auto List Members (вкладка 
Editor окна диалога Options). 
    Члены перечисления будут доступны пользователям элемента управления, если 
перечисление объявлено как Public. Перечисление можно использовать в любом 
public модуле, который определяет класс, в таком, как модуль класса, 
UserControl или UserDocument. 
    В следующем фрагменте кода определяется перечисление, которое содержит 
именованные константы, представляющие температуры кипения по Цельсию для 
различных веществ: 

    Public  Enum  TempBoilCelsius 
    msubWater   =   100   '   Вода 
    msublron  =   2750   '   Железо 
    msubNitrogen   =   -195.8   '   Азот 
    msubGold  =   2807   '   Золото End  Enum 
    Это перечисление можно использовать, например, как тип данного свойства 
Temp, как показано на следующей иллюстрации: 

    Рис. 9.8. Значения перечисления в списке Auto List Members. 


    9.4.6. Инициирование событий элемента управления 


    Примечание: Информацию относительно инициирования событий см. также в 
разделе "Использование событий" главы 8 "Создание программных компонентов ActiveX". 
    Чтобы инициировать событие из элемента управления, вначале нужно объявить 
событие, а затем, используя оператор RaiseEvent, вызвать событие. 


    Глава 9. Создание элементов управления ActiveX 235 


    В следующем примере к объекту UserControl добавляется событие Click: 
    '   Объявить   public   событие  Click  без   параметров Public   Event   ClickO 
    В следующей строке инициируется событие Click: 

    RaiseEvent Click 

    Предоставление событий составляющих элементов управления 
    В отличие от предоставления свойств и методов делегированием, событие 
составляющего элемента управления предоставляется генерированием 
пользовательского события. 
    Чтобы предоставить события элемента управления объекта UserControl: 
    1. Объявить в объекте UserControl новое событие. 
    2. В событии составляющего элемента управления инициировать новое событие. 
    В следующем программном коде предоставляется событие KeyPress из элемента 
управления TextBox: 

    ' Код для элемента управления TextBox Public Event KeyPressl(KeyAscii As Integer) 
    Private Sub Textl_KeyPress(KeyAscii As Integer) 
    RaiseEvent KeyPressl (KeyAscii) End Sub 
    Обратите внимание, что параметры процедуры события также передаются клиенту. 
    ' Код для клиента элемента управления: 
    Private Sub ClientControl_KeyPressl(KeyAscii As Integer) 
    ' Преобразование символа в верхний регистр. 
    ' Так как параметр KeyAscii передается ByRef, он может быть 
    ' изменен в клиенте. 
    KeyAscii = Asc(UCase(Chr(KeyAscii))) End Sub 
    1 


    9.4.7. Использование мастера 


    ActiveX Control Interface Wizard 

    В Visual Basic имеется мастер ActiveX Control Interface Wizard, который 
упрощает задачу создания элементов управления. Этот мастер позволяет 
определить свойства, методы и события, которые составят определение интерфейса 
элемента управления. 
    ActiveX Control Interface Wizard позволяет проецировать функциональные 
возможности создаваемого элемента управления на объект UserControl или 
составляющие элементы управления. Впоследствии умолчательные соответствия 
можно изменить. 
    Кроме того, этот мастер генерирует исходный программный код интерфейса, включая: 
    •	реализацию свойств в коде процедур Property; 
    •	реализацию методов в коде процедур Sub и Function; 
    •	программный код инициирования выбранных событий. 
    Мастер генерирует правильные параметры и типы данных для стандартных 
событий и программный код передачи событий. 


    236 Предоставление свойств, методов и событий 


    Рис. 9.9. Мастер ActiveX Control Interface Wizard — экран выбора 
компонентов интерфейса. 

    В списках перечислены свойства, методы и события, которые первоначально доступны 
для использования в интерфейсе. Предварительно выбраны (правый список) компоненты, 
которые поддерживаются большинством элементов управления. 

    My Custom Members: 

    Рис. 9.10. Мастер ActiveX Control Interface Wizard — экран ввода 
пользовательских компонентов интерфейса, уникальных для элемента управления. 


    Глава 9. Создание элементов управления ActiveX	237 


    Рис. 9.11. Мастер ActiveX Control Interface Wizard — экран соответствий. 
Здесь можно спроецировать свойства, методы и события создаваемого элемента 
управления (список Public Name) на компоненты интерфейса составляющих 
элементов управлени (списки Control и Member). 

    ActiveX Control Interface Wizard - Set Attributes 

    Рис. 9.12. Мастер ActiveX Control Interface Wizard — экран установки 
атрибутов компонентов, для которых не было установлено соответствий в 
предыдущем экране . 


    238 Создание страниц свойств 


    9.5. Создание страниц свойств 

    Страницы свойств (окна диалога Property Pages) обеспечивают альтернативу 
организации свойств элементов управления ActiveX. При наличии страниц свойств 
пользователь может просмотреть связанные свойства в окне диалога картотечного 
вида. Это дает большую гибкость, чем использование окна свойств. 
    Например, если создается свойство Font, которое имеет несколько разных 
значений, для каждого из них можно создать страницу свойств, вместо вывода 
значений в раскрывающемся списке в окне свойств. 

    9.5.1. Создание интерфейса страниц свойств 

    Для создания страниц свойств вначале для каждой страницы создаются 
элементы интерфейса (вкладки и кнопки в окне диалога Property Pages создаются 
Visual Basic). 

    Рис. 9.13. Пользовательское окно диалога Property Pages: вкладки "Общие" и 
"Редактирование" — пользовательские, "Font" и "Color" — стандартные. 

    Чтобы добавить страницу свойств к проекту элемента управления: 
    1. В меню Project выбрать Add Property Page. 
    2. На вкладке New окна диалога Add Property Page дважды щелкнуть 
пиктограмму Property Page. 
    После этого на экран выводится визуальный дизайнер, который можно 
использовать для размещения элементов управления, как если бы это была 
стандартная форма (рис. 9.14). 

    9.5.2. Программирование поведения страниц свойств 

    Страницы свойств и формы внешне похожи друг на друга, и процедуры их 
создания подобны. Однако для страниц свойств и для форм используются разные 
события, и в результате функционируют они по-разному. 


    Глава 9. Создание элементов управления ActiveX 239 


    Рис. 9.14. Окно дизайнера страницы свойств с элементами управления. 

    Событие SelectionChanged 

    Событие SelectionChanged происходит при открытии страницы свойств, когда 
набор элементов управления изменяется. Это событие используется для установки 
и редактирования значений элементов управления, в которых выводятся значения свойств. 
    В следующем фрагменте кода значение свойства Interval элемента управления 
Timer устанавливается равным значению в текстовом поле на странице свойств: 

    Private   Sub   PropertyPage_SelectionChanged() txtTimerlnterval.Text   =  _ 
    SelectedControls(0).Interval End  Sub 


    Семейство SelectedControls 

    Семейство SelectedControls содержит все элементы управления в контейнере, 
которые были выбраны пользователем элемента управления. Семейство может 
содержать несколько экземпляров элемента управления. 
    Для определения количества выбранных элементов управления используется 
свойство Count семейства SelectedControls. Возвращаемое значение больше 1 
указывает, что в контейнере было выбрано несколько элементов управления. 

    Свойство Changed 

    Чтобы сообщить Visual Basic об изменениях, проведенных в свойствах на 
странице свойств, нужно установить в True свойство Changed объекта 
PropertyPage. При этом становится доступной кнопка Apply в окне диалога 
Property Pages. 
    Например, следующий программный код информирует Visual Basic, что в 
текстовом поле на странице свойств было изменено значение свойства Interval: 

    Private   Sub   txtTimerlnterval^ 
    Changed  =  True End  Sub 
    Change() 


    240 Создание страниц свойств 


    Событие ApplyChanges 

    Для переноса измененных значений свойств в выбранные элементы управления 
используется событие ApplyChanges. 
    Событие ApplyChanges происходит в следующих ситуациях: 
    •	щелчок кнопки ОК для закрытия окна диалога Property Pages; 
    •	щелчок кнопки Apply; 
    «	выбор другой вкладки в окне диалога Property Pages. 
    В следующем фрагменте кода объявляется переменная objControl, 
предназначенная дгя хранения ссылки на выбранный элемент управления, и 
применяются изменения свойства Interval страницы свойств элемента управления: 

    Private Sub PropertyPage_ApplyChanges() 
    Dim objControl As Variant 
    For Each objControl In SelectedControls 
    objControl.Interval = txtTimerlnterval.Text 
    Next End Sub 


    9.5.3. Установление отношений страниц свойств 

    В проекте элемента управления ActiveX может использоваться одна или более 
страниц свойств. Однако вначале между элементом управления и страницей свойств 
надо установить связь. 

    Подключение страниц свойств к элементу управления 

    Для ассоциирования одной или больше страниц свойств с элементом управления 
используется окно диалога Connect Property Pages. Чтобы вывести это окно 
диалога на экран, нужно в окне свойств элемента управления дважды щелкнуть 
свойство PropertyPages или нажать кнопку с многоточием (...) в строке свойства. 

    Рис. 9.15. Подключение страниц свойств к элементу управления. 


    Глава 9. Создание элементов управления ActiveX	241 


    Ассоциирование свойства со страницей свойств 

    Некоторые свойства представляют собой объекты с собственными свойствами. 
Другие свойства содержат массив значений. Когда свойство слишком сложно, чтобы 
его можно было установить в окне свойств, то для вывода на экран всех значений 
свойства можно использовать страницу свойств. 
    Ассоциируя свойство со страницей свойств, можно привлекать все 
инструменты, которые делают свойство более доступным. Например, свойство, 
которое ассоциируется со страницей свойств, можно идентифицировать кнопкой с 
многоточием (...). При щелчке этой кнопки открывается ассоциированная страница свойств. 
    Чтобы ассоциировать страницу свойств со свойством: 
    1. В окне Project Explorer выбрать объект UserControl и нажать кнопку View 
Code либо щелкнуть правой кнопкой мыши объект UserControl и затем в 
контекстном меню выбрать View Code, чтобы открыть окно редактора кода. 
    2. В меню Tools выбрать команду Procedure Attributes и в окне Procedure 
Attributes нажать кнопку Advanced. При этом на экран выводятся дополнительные 
опции (см. рис. 8.4). 
    3. В окне Name выбрать свойство, которое требуется ассоциировать со 
страницей свойств. 
    4. В списке Use this Page in Property Browser выбрать страницу свойств и 
затем щелкнуть кнопку Apply или ОК. 

    9.5.4. Использование стандартных страниц свойств 

    Стандартные страницы свойств позволяют использовать существующие 
компоненты для построения привычного пользовательского интерфейса. Эти 
интерфейсы дают пользователям возможность работать со сложными свойствами, 
например, имеющими отношение к стилю шрифта или цвету. 
    Visual Basic обеспечивает следующие стандартные страницы свойств: 
    •	StandardFont; 
    •	StandardColor; 
    •	StandardPicture. 
    При создании свойства типа Font, OLE_COLOR или Picture окно свойств 
автоматически ассоциирует эти свойства с соответствующей стандартной страницей 
свойств. В окне свойств кнопка с многоточием (...) в строке любого из этих 
свойств указывает, что, когда пользователь щелкнет кнопку, будет открыта 
стандартная страница свойств. 
    Если требуется, чтобы стандартные страницы свойств Visual Basic были 
представлены в окне диалога Property Pages, их необходимо подключить, 
используя окно диалога Connect Property Pages (см. рис. 9.13 и 9.15). 

    9.6. Тиражирование элемента управления 

    В этом разделе затрагиваются вопросы распространения пользовательских 
элементов управления, а также показано, как использовать мастер Application 
Setup Wizard для пакетирования всех требуемых компонентов приложения для тиражирования. 

    9.6.1. Лицензирование элементов управления 

    Для обеспечения защиты элементов управления ActiveX Visual Basic 
предоставляет возможности лицензирования. Лицензирование элементов управления 
не позволяет сторонним разработчикам использовать экземпляры данного элемента 
управления в приложениях и при создании других элементов управления. 


    242	Тиражирование элемента управления 

    Visual Basic обеспечивает поддержку лицензирования элементов управления 
путем компиляции ключа лицензии в файл .осх. Программа Setup элемента 
управления записывает этот ключ в системный реестр. 
    Когда пользователь во время разработки пытается создать экземпляр элемента 
управления, программа Setup проверяет в системном реестре значение ключа 
лицензии. Если ключ не найден, экземпляр элемента управления во время 
разработки создаваться не будет. Однако, если скомпилированное приложение 
включает лицензированный элемент управления, пользователь может создавать 
версию элемента управления периода выполнения без ключа лицензии. Чтобы можно 
было использовать лицензированные составляющие элементы управления как часть 
элемента управления, пользователи элемента управления должны иметь 
установленные составляющие элементы управления или ключ лицензирования должен 
быть включен с программой Setup элемента управления. 

    Добавление лицензирования 

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

    9.6.2. Создание программы установки элемента управления 

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

    Использование Application Setup Wizard 

    Самый простой способ создания программы установки — использовать мастер 
Application Setup Wizard, так как это гарантирует, что все файлы, необходимые 
для запуска приложения, будут упакованы и затем их можно будет безопасно тиражировать. 
    Application Setup Wizard работает одинаково, независимо от того, создается 
программа установки для компонента ActiveX или для любого другого компонента 
Visual Basic. Если требуется обеспечить поддержку лицензирования, возможно, 
придется включить дополнительные файлы поддержки для составляющих элементов 
управления, а также файл .vbl. 
    Если приложение включает большое количество файлов, учет этих файлов может 
стать сложной задачей. Application Setup Wizard обеспечивает простой и удобный 
способ учета файлов и создания программы Setup. 
    Чтобы создать программу Setup для компонентов элемента управления ActiveX: 
    1. В свойствах элемента управления специфицировать, требуется ли включать 
для элемента управления поддержку лицензирования. 
    2. Скомпилировать файл .осх. 
    3. Запустить Application Setup Wizard. 

    Использование программой Setup файла лицензирования 

    Если для элемента управления специфицирована поддержка лицензирования, 
Application Setup Wizard создает программу Setup, которая автоматически 
регистрирует все файлы .vbl в системном реестре. Мастер также запрашивает, 
какие файлы .vbl требуется установить на компьютере пользователя. 


    Глава 9. Создание элементов управления ActiveX	243 


    Если требуется установить файл .vbl, Application Setup Wizard обеспечивает 
умолчательную папку-адресат. Умолчательная опция — Do not install this file 
(He устанавливать этот файл), так как обычно разработчик имеет в виду, что 
пользователь должен иметь зарегистрированный файл лицензии, но его не 
обязательно нужно устанавливать на компьютере. Эта опция гарантирует, что 
разработчики смогут включать лицензированные элементы управления в свои 
приложения, в то время как пользователи приложений смогут обратиться только к 
экземпляру элементов управления периода выполнения. 
    Application Setup Wizard (файл Setupwiz.exe) обычно размещается в 
директории \VB\Setup-kit\Kitfi!32\ при установке Visual Basic. При его запуске 
пользователю последовательно предоставляются экраны, в которых он может 
выбрать и указать: 
    •   проект и его опции: создать программу Setup, создать Setup для 
загрузки через Internet и др.; 
    •   метод тиражирования — дискеты, общая директория, дисковые директории 
(Diskl, Disk2 и т. д.); 
    •   включаемые драйверы баз данных; 
    •   включаемые серверы — компоненты ActiveX, локальные и удаленные; 
    •   включаемые лицензионные компоненты; 
    •  другие данные. 
