Урок 13: OLE
Из статьи Вы узнаете
основные сведения об OLE, некоторые
вещи относительно OLE 2 и OLE
Automation. В статье рассказывается об использовании
объекта TOLEContainer для построения
OLE приложения в Delphi.
Прежде, чем перейти к рассмотрению основ OLE,
потребуется изучить терминологию.
Аббревиатура OLE обозначает Objects Linked and Embedded (Присоединенные И Встроенные Объекты - ПИВО J ). Данные, разделяемые между приложениями называются OLE объектом. Приложение, которое может содержать OLE объекты, называют OLE контейнером (OLE Container). Приложение, данные из которого можно включить в OLE контейнер в виде OLE объекта, называют OLE сервером.
Например, MicroSoft Word может включать в документ графические объекты, аудио- и видеоклипы и множество других объектов (такой документ иногда называют составным документом - compound document ).
Как следует из названия, OLE объекты можно либо присоединить к OLE контейнеру, либо включить в него. В первом случае данные будут храниться в файле на диске, любое приложение будет иметь доступ к этим данным и сможет вносить изменения. Во втором случае данные включаются в OLE контейнер и только он сможет просматривать и модифицировать эти данные.
OLE является дальнейшим развитием идеи разделяемых между приложениями данных. Если с помощью DDE можно было работать с текстом, то OLE позволяет легко встроить в приложение обработку любых типов данных. Как и в случае с DDE, для правильной работы приложения-клиента (OLE контейнера) требуется наличие приложения OLE сервера. Каждый раз, когда в программе-клиенте пользователь обращается к OLE объекту с целью просмотра или редактирования данных (обычно двойной щелчок мышкой на объекте), запускается приложение-сервер, в котором и происходит работа с данными.
В природе существует несколько видов OLE, отличающихся по способу активации OLE сервера. OLE версии 1 запускает сервер в отдельном окне. OLE 2 реализует то, что называется in-place activation and editing. В данном случае сервер запускается “внутри” приложения-клиента, модифицирует вид системного меню, линейки инструментов и др. Развитие идеи OLE привело к появлению OLE automation - приложение-клиент может выполнить часть кода сервера. Тип OLE объекта, помещенного в программу-клиент, определяется тем, какую версию OLE поддерживает сервер.
Объект
TOLEContainer находится на странице
System Палитры Компонент и нужен для создания
приложений OLE-контейнеров. TOLEContainer
скрывает все сложности, связанные с внутренней
организацией OLE и предоставляет программисту
достаточно простой интерфейс. Построим простейшее приложение с использованием
OLE объекта. Создайте
новый проект и поместите на форму TOLEContainer,
в Инспекторе Объектов дважды щелкните мышкой на свойство ObjClass
или ObjDoc - появится
стандартный диалог Windows “Insert Object” (см.
рис.1)
В этом диалоге есть список всех зарегистрированных в системе OLE-серверов (регистрация происходит при инсталляции программы). Тип OLE-объекта определяется как раз тем сервером, который Вы укажете. Если Вы создаете новый объект (Create New), то при нажатии кнопки OK запустится программа OLE-сервер, в которой и формируется новый объект. После выхода из программы-сервера новый OLE объект включается (embedded object) в программу. OLE объект можно создать используя уже имеющийся файл в формате одного из OLE-серверов. Для этого нужно выбрать пункт Create from File (см. рис.2)
Выбранный объект можно как включить в приложение, так и присоединить, отметив пункт Link.
Итак, давайте при создании
нашего проекта создадим новый объект, выбрав для этого, например, Microsoft
Word Document (рис.1).
Нажмите OK и после того, как запустится
MS Word, наберите там любой текст (“Это
OLE-объект Microsoft Word document”).
Для завершения работы в меню есть специальный пункт “File|Close
and Return to Form1” (Win’95+MS Word 7.0). Запустите
проект, он будет выглядеть примерно так:
Щелкните дважды мышкой на OLE-контейнер - запустится MS Word с документом из OLE-объекта, который можно редактировать, при этом все изменения сохраняются в OLE-объекте.
!!! Если во время дизайна Вы выбираете объект для включения в OLE-контейнер, то он полностью записывается в файл формы (FORM1.DFM) и в дальнейшем прикомпилируется к EXE файлу. В случае очень больших объектов это может привести во время дизайна к длительным паузам и даже к возникновению ошибки “Out of resource”. Поэтому рекомендуется большие объекты делать присоединенными (linked).
TOLEContainer позволяет отображать в программе объект в его непосредственном виде (с различной степенью увеличения или уменьшения - свойство Zoom) или в виде пиктограммы, определяемой в диалоге на рис.1 (Display as Icon).
Выбор OLE-объекта
может происходить не только во время дизайна, но и во время выполнения
программы (об этом чуть ниже). Результаты работы с этим объектом можно
сохранить в виде файла и в следующий
раз восстановить его оттуда, для этого TOLEContainer имеет
два метода SaveToFile и LoadFromFile.
Среди демонстрационных примеров, входящих в Delphi
есть два, относящихся к работе с OLE-объектами
(в директориях X:\DELPHI\DEMOS\OLE2
и X:\DELPHI\DEMOS\DOC\OLE2). Более
полным является второй, который, кроме всего прочего является примером
построения MDI приложения. Данная программа
демонстрирует все основные возможности TOLEContainer
и позволяет:
- создавать новый OLE контейнер во время выполнения программы;
- инициализировать OLE объект либо в стандартном диалоге Windows “Insert Object”, либо с помощью Clipboard, либо с помощью техники “перенести и бросить” (drag-and-drop);
- сохранить OLE объект в файле и восстановить его оттуда;
На рис.4 показан пример MDI приложения, содержащий два дочерних окна с OLE объектами. Для создания нового OLE объекта нужно выбрать пункт меню File|New и далее Edit|Insert Object. Появится стандартный диалог Windows для инициализации OLE объекта (см. рис.1). Если приложение OLE-сервер имеет возможность сохранять информацию об OLE объекте в Clipboard, то проинициализировать объект можно с помощью пункта меню Edit|Paste Special.
Достаточно интересной является возможность применения техники drag-and-drop в применении к OLE объектам. Запустите MS Word (разместите его окно так, чтобы было видно и OLE приложение), наберите какой-нибудь текст, выделите его и с помощью мышки перетащите и бросьте на главное MDI окно приложения. Появится новое дочернее окно с OLE контейнером, содержащим этот текст. Программирование данной возможности достаточно сложно. Полное описание технологии построения данного OLE приложения есть в документации в коробке с Delphi (User’s guide), этому посвящена отдельная глава.
procedure TOLEForm.SaveOLE(Sender: TObject);
var
BlSt : TBlobStream;
begin
With Table1 do
BlSt:=TBlobStream.Create(BlobField(FieldByName('OLE')),
bmReadWrite);
OLEContainer.SaveToStream(BlSt as TStream);
BlSt.Free;
end;