«Любой дурак может написать программу, которую поймет компилятор. Хорошие программисты пишут программы, которые смогут понять другие программисты»
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-объектом, находящимся в контейнере