Глава 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 практический пример. Многим, кто создает графические приложения, нужны возможности выбора пользователем параметров пера и кисти. В то же время, переносить рутинный код из приложения в приложение не хочется. Выход — объединить его внутри нашего элемента управления.
Итак, для его создания необходимо сделать следующее:
Теперь поверхность формы трепх (модуль penimpli. pas) становится рабочей поверхностью.
Рис. 28.2. Внешний вид объекта ТРепХ
Листинг 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 уже готов. Однако чтобы получить от него какую-то пользу, недостает интерфейса с пользователем. Ведь нам выбор цветов и стилей нужен не сам по себе, а для передачи их пользователю! Переходим к следующему пункту.
Нажмите кнопку 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;
Мы стали еще на один шаг ближе к цели — вы можете приостановить дальнейшее развитие элемента, скомпилировать его, установить, увидеть в Инспекторе объектов три созданные нами свойства и дальше обращаться к ним. Но когда пользователь должен переустанавливать параметры своего пера? Он пока не извещен о том, что что-то произошло внутри элемента. Это и будет последним штрихом.
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 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 имеют следующий смысл:
Если указаны два последних свойства, разработчику имеет смысл заглянуть на две оставшиеся страницы диалогового окна Web Deployment Options. Там сосредоточены параметры, описывающие местоположение и свойства этих файлов.
Резюме
Роль, которую сыграло появление компонентного программирования, трудно переоценить. Еще несколько лет назад на семинаре, проводимом Microsoft, один из авторов впервые услышал о том, что вскоре все программы будут состоять из кирпичиков, и что кирпичики тоже сможет делать каждый. В то время большинству эта идея показалась довольно абстрактной — в ходу было функциональное программирование, а на семинар собрались знатоки ассемблера. Но прошло совсем немного времени, и теперь компьютер невозможно представить себе без стандарта ActiveX, который и является тем самым общим языком, на котором вы сможете разговаривать с коллегами по всему миру.