Для лучшего понимания механизма обработки событий COM создадим программу, обрабатывающую события от нашего сервера. Для этого создадим проект с одной формой и добавим в него объект, реализующий интерфейс IAutoTestEvents. Этот объект реализуется в виде Automation Object.
После этого в редакторе библиотеки типов необходимо произвести следующие действия.
Нажимаем кнопку «Обновить» и в сгенерированном модуле пишем код обработчика события:
procedure TEventSink.TestEvent; begin MessageBox(0, 'Event Fired', NIL, 0); end;Обработчик готов, теперь в проект надо добавить код для его использования.
Добавляем к классу формы поля для хранения необходимых данных — ссылки на экземпляр обработчика событий, экземпляр объекта, точку подключения и идентификатор подключения:
При создании формы создаем COM-сервер AutoTest и COM-объект обработчика событий:
procedure TForm1.FormCreate(Sender: TObject); var Container: IConnectionPointContainer; begin AutoTest := CreateOleObject('Project1.AutoTest') as IAutoTest; EventSink := TEventSink.Create as IEventSink;Запрашиваем у COM-сервера интерфейс IConnectionPointContainer:
Container := AutoTest as IConnectionPointContainer;Получаем ссылку на «точку подключения»:
OleCheck(Container.FindConnectionPoint(IEventSink, ConnectionPoint));и регистрируем в ней свой обработчик:
OleCheck(ConnectionPoint.Advise(EventSink, Cookie)); end;По окончании работы отключаем обработчик:
procedure TForm1.FormDestroy(Sender: TObject); begin ConnectionPoint.UnAdvise(Cookie); end;Теперь можно вызвать метод объекта и убедиться, что обработчик реагирует на события в нем:
Хорошая новость: проделывать все эти сложные манипуляции не обязательно. Мы сделали это в основном для демонстрации механизмов работы COM. Можно пойти другим, более простым путем. Для этого вы можете просто импортировать библиотеку типов сервера, поддерживающего события, и в мастере импорта библиотеки типов нажать кнопку Install.
После этого на закладку ActiveX палитры компонентов будет помещен компонент для работы с этим сервером, который можно просто положить на форму.
При этом сгенерированный компонент Delphi будет иметь обработчики событий для всех событий, объявленных в COM-объекте. Остается только написать для них свой код — всю работу по созданию объекта-обработчика, подключению к серверу и трансляции его событий в события компонента VCL Delphi возьмет на себя.
КомпьютерПресс 5'2001