|
Вернуться к содержанию
Глава 28
Использование ActiveX
Компонентное программирование начиналось с Microsoft
Visual Basic. Именно в этой среде впервые были применены 16-разрядные модули
расширения VBX. Наличие такой возможности очень заинтересовало разработчиков,
и в течение короткого времени возможности сред программирования значительно
углубились и расширились — за счет появления сотен и тысяч новых VBX. Идея компонентной
разработки получила развитие, и скоро по этому принципу стали строиться и другие
продукты (например, Delphi). С приходом 32-разрядного программирования компонентный
подход еще более развился, и теперь для него есть единый стандарт — ActiveX.
Он представляет собой продолжение и развитие технологии СОМ.
С точки зрения программиста, ActiveX — это черный
ящик, обладающий свойствами, методами и событиями. ActiveX встроены в Delphi
настолько органично, что вы можете ничего не знать о СОМ и, тем не менее, задействовать
всю полноту их возможностей. С точки зрения модели объектов СОМ элемент управления
ActiveX — это сервер, поддерживающий технологию Automation, реализованный в
виде динамической библиотеки и исполняемый в адресном пространстве вашего приложения
и допускающий визуальное редактирование.
В этой главе рассмотрено, как компоненты Delphi
превратить в ActiveX. Также обсуждается очень важная возможность Delphi — преобразование
форм в ActiveX, так называемая технология ActiveForms.
Технология СОМ — вещь насколько привлекательная,
настолько же и сложная. Точнее сказать — не сложная, а трудоемкая. Для того
чтобы самому строить объекты, нужно потратить немало времени. Поэтому и опытные
пользователи, и новички строят их в Delphi при помощи целого набора мастеров.
Сразу оговоримся, что мастер для создания ActiveX "напрямую", с нуля, не предусмотрен.
Вместо этого вы можете выбрать один из двух вариантов — превращение в элемент
управления одного из компонентов Delphi или целой формы.
Превращение компонентов в ActiveX
Первая из предоставляемых Delphi возможностей
— превращение любого оконного компонента (потомка TWincontrol) в ActiveX. Этот
мастер
"скрывается" под именем ActiveX Control
на странице ActiveX пункт New...
меню File. Вы можете поначалу расширительно толковать его название — но
он умеет только то, что умеет (рис. 28.1).

Рис. 28.1.
Мастер преобразования компонентов в ActiveX
Использование его предельно просто — вы выбираете
компонент VCL, мастер предлагает вам имена для будущего ActiveX и связанньк
с ним файлов. Возможны три дополнительных свойства: Include About
Box — включение в проект диалогового окна с
информацией о разработчике; Include Version Information
— включение информации о версии элемента (этого требуют некоторые контейнеры);
и наконец, если вы не хотите свободного распространения своего продукта, вы
можете включить в него лицензионную информацию, и пользоваться им в режиме разработки
(то есть во всех средах вроде Delphi или Visual Basic) смогут только пользователи,
имеющие лицензию.
После того как вы отредактируете предложенные
параметры, мастер автоматически сгенерирует все необходимые файлы: собственно
проект (напомним, что элементы ActiveX всегда оформляются в виде библиотек DLL
— в данном случае с расширением осх), библиотеку типов вместе с ее представлением
на Object Pascal, и еще один файл с исходным текстом — файл реализации. Он и
описанные в нем классы тоже играют роль мостика, но если в случае tlb
класс ToieControi обеспечивал связь между возможностями ActiveX и требованиями
среды Delphi, то здесь потомки класса TActivexcontrol устанавливают соответствие
между бывшим компонентом и его новыми "хозяевами" — контейнерами, в которых
будет размещаться созданный ActiveX. Мы заостряем внимание на этом, потому что
в файлах вы найдете два одноименных класса (скажем, при работе с компонентом
TCheckBox это будет класс TCheckBoxx). Но тот
из них, который является потомком
Telecontrol, нужен при импорте ActiveX, а потомок TActiveXControl — при экспорте.
Преобразование форм в ActiveX
Более интересной представляется возможность создать
в Delphi комплексный элемент управления, состоящий из многих простых. Она служит
предметом зависти разработчиков, работающих в других средах. Можно сказать,
вы мало кого осчастливите, преобразовав в ActiveX стандартный компонент Delphi.
Если вы разработали свой, интереса будет больше; но почти все нужные идеи уже
реализованы. С другой стороны, перебирая десятки уже созданных элементов управления,
вы почти в каждом найдете какой-то маленький штрих или деталь, из-за чего он
не подходит именно вам. И только создание ActiveX на базе формы позволит сочетать
богатство возможностей с простотой реализации. Эта технология называется ActiveForms.
Попытаемся опять совместить приятное с полезным
и подберем для иллюстрации ActiveForms практический пример. Многим, кто создает
графические приложения, нужны возможности выбора пользователем параметров пера
и кисти. В то же время, переносить рутинный код из приложения в приложение не
хочется. Выход — объединить его внутри нашего элемента управления.
Итак, для его создания необходимо сделать следующее:
- В пункте New...
меню File на странице
ActiveX выбираем элемент списка ActiveForm.
- Появившийся мастер практически не отличается
от изображенного на рис. 28.3. Вводим имя нового элемента управления —
РепХ; синхронно видоизменятся и остальные имена.
- Образовавшийся проект состоит из файлов penimpli
. раs (это собственно код реализации нашего ActiveX), связанного с ним penproji_tlb.pas,
a также файла penproji . раs (там содержится заголовок DLL). Сохраните все
на диске.
Теперь поверхность формы трепх (модуль penimpli.
pas) становится рабочей поверхностью.

Рис. 28.2.
Внешний вид объекта ТРепХ
- Поместите на нее два компонента тсогпЬоВох
и один — TUpDown. Сблизьте их и уменьшите размеры формы, чтобы наш элемент
ActiveX не вышел слишком большим (рис. 28.2).
- Раскрывающиеся списки будут предназначены
для выбора цвета и стиля пера, а компонент TUpDown — для выбора его толщины.
Свойства Min и мах компонента TUpDown установите в 1 и 8 соответственно. Списки
будут наглядно показывать его свойства, поэтому придадим их свойствам Style
значения csOwnerDrawFixed (отрисовываемые пользователем), и опишем такие обработчики
событий:
Листинг 28.1
Обработчик событий объекта ТUpDown
const DefColors : array [0..15] of TColor =( clBlack,
cIMaroon, cIGreen, clOlive, cINavy, cIPurple, cITeal,
cIGray, cISilver, cIRed, cILime, clYellow, clBlue, clFuchsia, clAqua, clWhite)
;
var GblWidth: Integer; procedure TPenX.FormCreate(Sender:
TObject);
var i: Integer;
begin
for i := Low(DefColors) to High(DefColors) do
ComboBoxl.Items.Add(IntToStr(i) );
for i := 0 to 7 do begin ComboBox2 . Items. Add
(IntToStr (i) ) ;
end;
end; procedure TPenX.CoinboBoxIDrawItem(Control:
TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin with ComboBoxl.Canvas do
begin Brush.Color := DefColors [Inaex] ;
FillRect(Rect) ;
end;
end;
procedure TPenX.CoinboBox2DrawItem(Control: TWinControl; index: integer;
Rect: TRect; State: TOwnerDrawState) ;
var hh : Integer;
begin hh := Rect.Top + (Rect.Bottom-Rect.Top)
div 2;
with ComboBox2.Canvas do
begin
Brush.Color := clWhite;
FillRect(Rect) ;
Pen.Style := TPenStyle(Index);
Pen.Width := GblWidth;
MoveTo(Rect.Left,hh) ;
LineTo(Rect.Right,hh);
end;
end;
procedure TPenX.UpDownlClick(Sender: TObject; Button:
TUDBtnType) ;
begin
GblWidth := UpDownl.Position;
ComboBox2.Repaint ;
end;
При нажатии на кнопку первого списка в нем должен появляться
выбор из 16 основных цветов; при нажатии на кнопку второго списка — выбор
из возможных типов линий.
Формально элемент ActiveX уже готов. Однако
чтобы получить от него какую-то пользу, недостает интерфейса с пользователем.
Ведь нам выбор цветов и стилей нужен не сам по себе, а для передачи их пользователю!
Переходим к следующему пункту.
- В меню View
выбираем пункт Type Library. В
появившемся окне Редактора библиотеки типов открываем интерфейс i penx и добавляем
к нему три свойства — PenWidth, PenStyle И PenColor. В списке они отобразятся
как три пары методов — для чтения и для записи (рис. 28.3).
Нажмите кнопку Refresh Implementation
в верхней панели инструментов — при этом в обоих файлах проекта появляются
описания свойств, а в penimpli.pas — заготовки кода для их реализации.
В Delphi предусмотрен и другой путь добавления
свойств в ActiveX — через пункт Add to Interface
меню Edit. Но он иногда дает неоднозначные
результаты.

Рис. 28.3.
Редактор Библиотеки типов с добавленными в интерфейс IPenX свойствами
Приведем реализацию только для методов чтения.
Переустановка значений этих свойств программно не планируется.
function TPenX.Get_PenColor: Integers;
begin Result := DefColors[StrToInt(ComboBoxl.Text)]
;
end;
function TPenX.Get_PenStyle: Integer;
begin
Result := StrToInt(ComboBox2.Text);
end;
function TPenX.Get_PenWidth: Integers; begin
Result := UpDownl.Position;
end;
Мы стали еще на один шаг ближе к цели — вы можете
приостановить дальнейшее развитие элемента, скомпилировать его, установить,
увидеть в Инспекторе объектов три созданные нами свойства и дальше обращаться
к ним. Но когда пользователь должен переустанавливать параметры своего пера?
Он пока не извещен о том, что что-то произошло внутри элемента. Это и будет
последним штрихом.
- Обратимся снова к просмотру библиотеки типов
(TLB), на сей раз — к интерфейсу ipenXEvents. К нему нужно добавить не свойство,
а метод, и назвать его onPaiiChanged. В отличие от свойств, появляется только
ссыл-ка на метод, а не заготовка для него. Реализовывать реакцию на событие
OnPenChanged будем не мы, а программист, использующий наш элемент ActiveX,
поэтому наша задача — вовремя инициировать наступление этого события. Такой
код нужно поставить везде, где происходит изменение хотя бы одного из параметров
пера:
procedure TPenX.ComboBox1Change(Sender: TObject);
begin if FEvents о nil then FEvents.OnPenChanged;
end;
Элемент управления ActiveForm в целом готов (рис.
28.4).

Рис. 28.4.
Внешний вид элемента у правления РепХ
Осталось зарегистрировать элемент, включить
его в состав одного из пакетов, и... наслаждаться возможностями, которые предоставляет
вам компонентный подход к программированию!
Web deployment: использование активных
форм в среде Интернет
Давая возможность разрабатывать активные формы,
в Inprise думали об их использовании не столько в традиционных приложениях,
сколько в среде Обозревателя Интернет, поддерживающего ActiveX — Internet Explorer
или Netscape Navigator современных версий. За последние несколько лет образовалась
устойчивая тенденция к использованию обозревателя в качестве клиентского звена
в распределенных и многозвенных приложениях. Поэтому конечного пользователя
следует снабдить интерфейсом хотя бы с минимальным набором функций — возможностей
HTML здесь мало.
Как отображаются объекты ActiveX в окне Обозревателя?
Для этого в языке HTML предусмотрен специальный тег <object> с параметрами,
которые позволяют загрузить объект и правильно отобразить его на Web-странице.
Для того чтобы сделать ваш ActiveX доступным через
Интернет, нужно выполнить ряд условий и проделать несколько операций. Все это
объединено в Delphi под именем Web Deployment (распространение через Web). Два
соответствующих пункта меню: Web Deployment Options и Web Deploy появляются
в меню Project, если ваш текущий
проект — ActiveX или активная форма (рис. 28.5). Собственно, всю работу по настройке
параметров нужно осуществить в пункте Web Deployment Options,
а второй пункт только позволит исполнить то, что описано в первом.

Рис. 28.5.
Диалоговое окно настройки Web Deployment Options, страница
Project
Для нормальной активизации ActiveX нужно правильно
прописать три пути. Чтобы не заблудиться в этих "трех соснах", нужно иметь в
виду:
- параметр Target dir
означает папку на сервере, где будет фактически размещаться осх- или САв-файл
с вашим элементом ActiveX;
- параметр HTML dir
означает папку на сервере, где находится создаваемая HTML-страница, описывающая
ваш осх- или слв-файл;
- параметр Target URL
означает адрес, по которому следует обращаться пользователю за страницей с
вашим ActiveX. Этот адрес должен соответствовать одной из виртуальных папок
вашего WEB-сервера или, по крайней мере, находиться в такой папке. Для сервера
PWS обычно для этих целей служит папка с именем WebPub. Вы просто создаете
внутри нее другую папку (в данном случае PenXDemo) и присоединяете ее название
к URL папки WebPub.
К названию папки Target url следует присоединить
и название созданной страницы. Если переименовать ее в default.htm (для WEB-серверов
от Microsoft) или index.htm (для других типов серверов), страница будет загружаться
автоматически. Впрочем, в большинстве случаев можно настроить название автоматически
загружаемой страницы.
В результате работы пункта Web Deploy
в папке Target Dir оказывается созданный вами элемент управления в виде осх-
или слв-файла, в папке html dir — нужная страница. Выглядит он примерно следующим
образом:
<HTML> <Н1> Delphi 5 ActiveX Test
Page </Н1><р>
You should see your Delphi 5 forms or controls
embedded in the form below.
<HR>
<center><P>
<OBJECT
classid="clsid:EE213FB2-A785-11D2-9F60-000000000000"
codebase="http://localhost
/webpub/penxdemo/Penxproj.ocx#version=l ,0,0,0"
width=167
height=97
align=center
hspace=0
vspace=0
>
</OBJECT>
</HTML>
Собственно, из всего содержимого страницы вас
должно интересовать только правильное описание тега <object>. Созданная
страница обладает минимальной функциональностью для загрузки ActiveX, но, понятно,
она не обладает даже зачатками дизайна. Можно продолжить оформление созданной
страницы, а можно и встроить тэг объекта в созданные вами HTML-страницы.
Чтобы у пользователя нормально загружались и устанавливались
элементы ActiveX, созданные вами, нужна соответствующая настройка уровня безопасности
Обозревателя. В случае типовой настройки Обозреватель может запретить загрузку
и выполнение элементов ActiveX; если это происходит, уровень безопасности следует
снизить.
Остальные параметры-флажки на странице
Project имеют следующий смысл:
- Use CAB file compression — использовать
ли при распространении файла его сжатие в формате cab. Поскольку файлы ActiveX,
созданные на Delphi, имеют не самые маленькие
размеры, такое сжатие позволит уменьшить размер (и время загрузки) в полтора-два
раза;
- Include file version number — включать
в поставку номер версии ActiveX. В этом случае при несовпадении номеров версий
загружается более новая;
- Auto increment release number — автоматически
увеличивать номер релиза при каждой операции WEB Deploy;
- Deploy required packages и deploy additional
files — включать в распространяемый
комплект пакеты Delphi и дополнительные файлы.
Если указаны два последних свойства, разработчику
имеет смысл заглянуть на две оставшиеся страницы диалогового окна
Web Deployment Options. Там сосредоточены параметры,
описывающие местоположение и свойства этих файлов.
Резюме
Роль, которую сыграло появление компонентного
программирования, трудно переоценить. Еще несколько лет назад на семинаре, проводимом
Microsoft, один из авторов впервые услышал о том, что вскоре все программы будут
состоять из кирпичиков, и что кирпичики тоже сможет делать каждый. В то время
большинству эта идея показалась довольно абстрактной — в ходу было функциональное
программирование, а на семинар собрались знатоки ассемблера. Но прошло совсем
немного времени, и теперь компьютер невозможно представить себе без стандарта
ActiveX, который и является тем самым общим языком, на котором вы сможете разговаривать
с коллегами по всему миру.
Вернуться к содержанию
|