Библиотека программиста

«Очень важно не прерывать вопросов. Любопытство имеет свое право на существование»

Альберт Эйнштейн

Главная страница > Технология COM > 62. Создание и отображение OLE-документов в формах

62. Создание и отображение OLE-документов в формах

Для целей внедрения объектов в Delphi имеется компонент TOleContainer (страница System на палитре компонент). Этот компонент инкапсулирует все интерфейсы, необходимые для создания клиентов OLE-документов, и позволяет разместить внедренный объект на форме.

Пример создания приложения-контейнера.

Для использования OLE-контейнера необходимо выполнить следующие действия.

Шаг 1. Создать типовое приложение.

Шаг 2. Разместить на форме панель TPanel и установить ее свойство Align=alClient. Эта панель необходима для размещения на ней панели инструментов соответствующего СОМ-сервера.

Шаг 3. На панель поместить компонент OleContainer. Так как этот компонент визуальный, то надо задать его размеры и местоположение. Впоследствии окно сервера будет располагаться в пределах этого контейнера.

Шаг 4. Добавить главное меню с пунктами «Новый объект», «Выход» и любыми другими дополнительными. При внедрении OLE-документа к этому меню будет добавлено меню СОМ-сервера в соответствии с правилами слияния меню, принятыми в Windows.

Шаг 5. Создать обработчик события, вызываемый при выборе пункта меню «Новый объект» следующего содержания:

procedure TForm1.MNewObjClick(Sender: TObject);

begin

OleContainer.InsertObjectDialog;

end;

Теперь можно первый раз опробовать приложение. При выборе пункта меню «Новый объект» появится, с некоторой задержкой на «медленных» компьютерах, диалоговое окно, представленное на рис. 1.

После выбора какого-либо документа, например, «Точечный рисунок» и нажатия кнопки «Ок» на экране появится новый документ в пределах компонента OleContainer. Двойной щелчок по этому документу приведет к внедрению меню и панели инструментов сервера, после чего с ним можно работать почти так же, как и с сервером, запущенным в виде отдельного приложения. Меню сервера будет добавлено к меню приложения, но не целиком: первой темы главного меню сервера не будет.

При включении флага «В виде значка» документ будет добавлен как значок, двойной щелчок по которому приведет к запуску сервера в отдельном окне. Если посмотреть на меню сервера, то можно увидеть там новые пункты в меню File, такие как «Обновить Ole-контейнер» и «Выход и возврат к имя_приложения».

Метод контейнера

Function ObjectPropertiesDialog: Boolean;

предназначен для вызова диалога, с помощью которого пользователь приложения может просматривать и изменять свойства объекта (если таковые поддерживаются сервером), содержащегося в контейнере. Все сделанные пользователем изменения немедленно отображаются объектом. Функция ObjectPropertiesDialog возвращает True, если страница свойств была показана и пользователь нажал кнопку OK, и False в противном случае.


Рис 1. Диалоговое окно вставки документа в контейнер, вызываемое с помощью функции OleContainer.InsertObjectDialog

Метод контейнера

Function PasteSpecialDialog: Boolean;

предназначен для вызова диалога, с помощью которого пользователь приложения может управлять процессом вставки содержимого буфера обмена Windows в контейнер. Пользователь может выбрать формат данных, способ вставки – внедрение (embedded), связывание (linked) или в виде иконки. Если пользователь завершает диалог PasteSpecialDialog нажатием кнопки OK и в контейнере при этом содержится какой-либо OLE-объект, то этот объект уничтожается и все сделанные в нем изменения теряются.

Модифицируем наше приложение, добавив в меню File пункты «Показать свойства», «Специальная вставка» и «Уничтожить объект», привязав к ним обработчики событий ObjectPropertiesDialog, PasteSpecialDialog и DestroyObj соответственно (рис.2). Реализуем эти методы так:

Procedure TForm1.ObjPropClick(Sender: TObject);

Begin

if OleContainer.State<>osEmpty then

OleContainer.ObjectPropertiesDialog

else

ShowMessage('Контейнер пуст!');

End;

Procedure TForm1.PasteSpecialClick(Sender: TObject);

Begin

OleContainer.PasteSpecialDialog;

End;

Procedure TForm1.DestroyObjClick(Sender: TObject);

Begin

OleContainer.DestroyObject;


End;

Рис.2. Меню приложения

Теперь можно компилировать приложение и проверить функциональность этих методов. Запустим MS Word, поместим какой-либо текст в буфер обмена и выберем в приложении тему меню текст из MS Word, то по нажатию правой клавиши мыши можно вызвать всплывающее меню с темами «Изменить» и «Открыть». Выбор «Изменить» приводит к активации MS Word по месту, а «Открыть» – в отдельном окне.

Наиболее часто используемыми свойствами компонента TOleContainer являются следующие:

· AutoActivate определяет способ активации OLE-документа;

· State отражает состояние OLE-контейнера;

· AllowInPlace устанавливает способ активации сервера (по месту или в отдельном окне);

· Iconic указывает на то, должен ли объект отображаться целиком или быть представлен иконкой;

· OleClassName содержит имя класса объекта, находящегося в контейнере (CLSID).

Свойство AutoActivate контейнера, определяющее способ активации объекта, находящегося в контейнере, может иметь следующие значения:

aaManual

объект должен быть активизирован программным путем с помощью метода контейнера DoVerb (ovShow);

aaGetFocus

объект активизируется, когда контейнер получает фокус (щелчок левой кнопкой мыши или выбор контейнера с помощью клавиши tab);

aaDoubleClick

объект активизируется с помощью двойного щелчка левой кнопкой мыши (значение по умолчанию).

Свойство для чтения State, позволяющее узнать состояние объекта и соответствующего ему приложения, может иметь одно из следующих значений:

osEmpty

контейнер пуст

osLoaded

контейнер содержит объект, но соответствующий сервер не запущен

osRunning

сервер объекта выполняется

osOpen

объект открыт в отдельном окне

osInPlaceActive

объект «активизирован по месту», однако его меню и панели инструментов еще не внедрены в клиентское приложение. Это промежуточное состояние, которое автоматически изменится на osUIActive

osUIActive

объект «активизирован по месту» и его меню и панели инструментов внедрены в клиентское приложение

Если установить AllowInPlace=True (значение по умолчанию) и значение свойства Iconic при этом равно False, то OLE-объект будет активироваться по месту, а если задать AllowInPlace=False – в отдельном окне.

Присваивая свойству Iconic значение True, мы заставляем объект отображаться в контейнере в виде иконки, а значение False – так же, как в окне сервера.





<< Предыдущая статья
«61. Внедрение и связывание объектов»
Следующая статья >>
63. Управление OLE-объектом, находящимся в контейнере