Мы продолжаем знакомится с Технологией ActiveX. Мы уже познакомились с парой примеров разработки ActiveX приложений, и сегодня мы вдаримся в теорию по самые гланды. Теория будет касатся в основном самостоятельной разработки компонентов.
ActiveX - это достаточно сложная для понимания и разработки технология. Она является продолжением развития OLE, которая была пополнена технологией COM и переименована в более ёмкое назнание - ActiveX . Под этим термином скрывается несколько самостоятельных технологий:
Формы ActiveForm - мы с ними познакомились в самом начале.
Элементы управления
Библиотеки
Серверы автоматизации
Страницы свойств
Всё это объединяется под одним термином ActiveX.
Рис 1. Создание компонентов ActiveX
Для разработки приложений с использованием ActiveX нужно иметь достаточно много знаний и навыков. Фирма Borland упростила эту технологию как для понимания, так и для разработки создав свою надстройку - Delphi ActiveX (часто сокращается до DAX). Благодаря DAX ты можешь любой компонент Delphi превратить компонент ActiveX и использовать его в любой другой среде разработки.
Вот именно эти мы и займёмся. Сегодня мы создадим компонент ActiveX с использованием Delphi и надстройки DAX. Хотя о присутствии DAX ты можешь и не знать.
Кликай File->New и на закладке ActiveX выбирай ActiveX Control (рис 1). Кликай "ОК". Перед тобой должно открыться окно ActiveX Control Wizard , как на рис 2.
Посмотрим на содержимое окна ActiveX Control Wizard :
VCL Class Name - Имя компонента, который мы хотим превратить в ActiveX. Выбери из списка TPanel.
Рис 2. Мастер компонента ActiveX
New ActiveX Name - Имя ActiveX компонента (оставь по умолчанию)
Implementation Unit - Имя модуля (оставь по умолчанию)
Project Name - Имя проекта (оставь по умолчанию)
Threading Model - Модель потока.
Make Control Licensed - Лицензия компонента. Включай только если захочешь продавать свой компонент.
Include Version Information - Включить информацию о версии
Include About Box - добавить окно "About"
После нажатия пимпы "ОК", Delphi создаст заготовку для нового твоего компонента, в которой уже готовы к использованию все методы и свойства компонента TPanel. Весь исходный код реализующий компонент будет находится в модуле PanelImpl1.pas. Перейди в него и посмотри.
Здесь полно процедур и функций начинающихся словом Get_ или Set_. Зачем они нужны? В ActiveX нет свойств или переменных, весь доступ к компоненту происходит через процедуры или функции, поэтому, чтобы прочитать заголовок панели delphi создал функцию Get_Caption, а чтобы изменить заголовок на новый - Set_Caption(const Value: WideString). Немного позже мы напишем собственную реализацию изменения заголовка.
Вся информация о методах компонента находится в библиотеке типов. Чтобы её увидеть выбери Type Library из меню View (рис 3).
Рис 3. Библиотека типов
Когда ты вибираешь какой-нибудь элемент библиотеки, в правой стороне окна появляется несколько закладок. На закладке Attributes ты можешь видеть:
Name - имя объекта
GUID - уникальный номер в библиотеке (менять не советую)
Version - версия
LCID - Идентификатор языка
Help String - Краткое описание
Help File - Имя Help файла связанного с объектом
Help Context - Идентификатор контекста справки
Некоторые из флагов:
None - Флаги отсутствуют
Restricted - Запретить использование библиотеки в средах программирования макросов
Control - В библиотеке находится компонент ActiveX
Hidden - Библиотека скрыта от пользователей
DispInterface - достук к свойствам и методам производится только через IDispatch.
Nonextensible - Если выделен, то реализация интерфейса IDispatch (основной интерфейс ActiveX) будет включать только те свойства и методы, которые показаны в реализации.
Dual - Методы и свойства интерфейса передаются и через IDispatch, и таблицу виртуальных методов.
OLE Automation - используются только совместимые с автоматизацией типы данных.
Source - указывает, что возвращаемое значение является типа VARIANT, являющееся источником событий
Bindable - свойство поддерживает связывание данных
Request Edit -свойство поддерживает сообщение OnRequestEdit
Небольшое отступление: Интерфейс в библиотеке типов ActiveX, это набор определений свойств и методов. Программа-клиент может получить доступ к интерфейсам (методам) через специальный интерфейс IDispatch,либо через таблицу виртуальных методов. Интерфейс IDispatch позволяет использовать свойства и методы объектов через уникальный идентификатор DispID.
Рис 4
Давай создадим собственный метод. Для этого выдели ветку IPanelX и щёлкни по кнопке . Delphi создаст новое объявление метода Method1 . Переименуй его в SetCap. Delphi создаст процедуру SetCap, которая будет является реальзацией метода SetCap. Перейди на Parametrs (рис 4) и добавь новый параметр для процедуры с именем Caption с типом LPSTR, и Modifier равный [in].
Чтобы изменить Modifier нужно дважды щёлкнуть по нему (рис 5). Здесь тебе доступны:
Рис 5
In - означает, что метод является процедурай и используется для установки значений
Out - Говорит о том, что метод будет считывать значение компонента
RetVal - метод будет возвращать значение
Теперь перейди в модуль PanelImpl1.pas и найди процедуру эту SetCap и напиши в ней следующее:
procedure TPanelX.SetCap(Caption: PChar);
begin
FDelphiControl.Caption:=Caption;
end;
FDelphiControl указывает на компонент TPanel. С помощью SetCap мы изменяем свойство Caption у TPanel, то есть наш метод делает то же, что и Set_Caption.
Рис 6
Теперь создадим свойство. Кликни по кнопке New Property и выбери "read | write" (рис 6). Delphi создаст два метода: один для чтения свойства, а другой для записи. Переименуй их в MyProp. В модуле PanelImpl1 у тебя появится две новые процедуры:
function TPanelX.Get_MyProp: Integer;
begin
end;
procedure TPanelX.Set_MyProp(Value: Integer);
begin
end;
Можешь их реализовать, но я не стал. Мне главное было показать, как это делается. Зарегестрируй новый компонент в системе (Run->Register ActiveX Server). Теперь можешь установить его на палитру компонентов (Component->Import ActiveX Control) и протестировать. После регистрации, компонент будет практически не виден на палитре, потому что у него не будет иконки. Чтобы найти свою панель, перейди на закладку ActiveX и проведи мышкой по палитре компонентов. Самой правой окажется PanelX.
Для теста нужно:
Создай новый проект
Поставь на форму новый компонент
Поставь кнопку и напиши по её событию:
procedure TForm1.Button1Click(Sender: TObject);
begin
PanelX1.SetCap('привет');
end;