Глава 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 практический пример. Многим, кто создает графические приложения, нужны возможности выбора пользователем параметров пера и кисти. В то же время, переносить рутинный код из приложения в приложение не хочется. Выход — объединить его внутри нашего элемента управления.

Итак, для его создания необходимо сделать следующее:

  1. В пункте New... меню File на странице ActiveX выбираем элемент списка ActiveForm.
  2. Появившийся мастер практически не отличается от изображенного на рис. 28.3. Вводим имя нового элемента управления — РепХ; синхронно видоизменятся и остальные имена.
  3. Образовавшийся проект состоит из файлов penimpli . раs (это собственно код реализации нашего ActiveX), связанного с ним penproji_tlb.pas, a также файла penproji . раs (там содержится заголовок DLL). Сохраните все на диске.
  4. Теперь поверхность формы трепх (модуль penimpli. pas) становится рабочей поверхностью.

Рис. 28.2. Внешний вид объекта ТРепХ

  1. Поместите на нее два компонента тсогпЬоВох и один — TUpDown. Сблизьте их и уменьшите размеры формы, чтобы наш элемент ActiveX не вышел слишком большим (рис. 28.2).
  2. Раскрывающиеся списки будут предназначены для выбора цвета и стиля пера, а компонент TUpDown — для выбора его толщины. Свойства Min и мах компонента TUpDown установите в 1 и 8 соответственно. Списки будут наглядно показывать его свойства, поэтому придадим их свойствам Style значения csOwnerDrawFixed (отрисовываемые пользователем), и опишем такие обработчики событий:
  3.  

    Листинг 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 уже готов. Однако чтобы получить от него какую-то пользу, недостает интерфейса с пользователем. Ведь нам выбор цветов и стилей нужен не сам по себе, а для передачи их пользователю! Переходим к следующему пункту.

  4. В меню View выбираем пункт Type Library. В появившемся окне Редактора библиотеки типов открываем интерфейс i penx и добавляем к нему три свойства — PenWidth, PenStyle И PenColor. В списке они отобразятся как три пары методов — для чтения и для записи (рис. 28.3).
  5. Нажмите кнопку 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;

    Мы стали еще на один шаг ближе к цели — вы можете приостановить дальнейшее развитие элемента, скомпилировать его, установить, увидеть в Инспекторе объектов три созданные нами свойства и дальше обращаться к ним. Но когда пользователь должен переустанавливать параметры своего пера? Он пока не извещен о том, что что-то произошло внутри элемента. Это и будет последним штрихом.

  1. Обратимся снова к просмотру библиотеки типов (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 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, который и является тем самым общим языком, на котором вы сможете разговаривать с коллегами по всему миру.