Книги-online
Event Oriented Programming.
32 урока по Delphi
Урок 13: OLE
Содержание урока
13:
Обзор
Основы OLE
Объект TOLEContainer
Пример OLE приложения
Сохранение OLE объекта
в базе данных
Обзор
Из статьи Вы узнаете
основные сведения об OLE, некоторые
вещи относительно OLE 2 и OLE
Automation. В статье рассказывается об использовании
объекта TOLEContainer для построения
OLE приложения в Delphi.
Основы OLE
Прежде, чем перейти к рассмотрению основ 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
Объект
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.
Пример OLE приложения
Среди демонстрационных примеров, входящих в 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), этому посвящена
отдельная глава.
Сохранение OLE объекта
в базе данных
Иногда необходимо хранить OLE объекты
не в файлах, а в базе данных (BLOB поле
в таблице). Конечно, в данном случае OLE объект
должен быть присоединенным (embedded) в
целях переносимости. К сожалению, в стандартной поставке Delphi
нет специального объекта типа TDBOLEContainer
для данных целей, но OLE объект
можно сохранять и восстанавливать с помощью методов SaveToStream
и LoadFromStream. Например:
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;