Средства технологии OLE в Delphi

advertisement
Средства технологии OLE в Delphi.
1. Основные понятия OLE и COM
OLE (Object Linking and Embedding – Связывание и Внедрение
Объектов) – это технология, разработанная компанией Microsoft, реализующая
механизм , дающий возможность вставить в приложение документ,
подготовленный в другом приложении. OLE в свою очередь разработана на
основе технологии COM (Component Object Model). COM – это спецификация,
созданная для описания структуры COM-объектов. COM-объекты могут
использоваться в любых языках программирования, вне зависимости от
того, какая программная среда применялась при их создании.
Приложение, в которое можно вставить данные из другого приложения,
называется клиентом OLE, а приложение-поставщик данных – сервером OLE.
Клиент может обратиться к доступному серверу OLE для
выполнения такой операции, которую он сам выполнить не может.
Например, если нам доступен OLE-сервер Microsoft Word, предоставляющий
услугу отобразить документ в формате *.doc, то можно вызвать этот
сервер из своего приложения и отобразить документ Word его средствами,
без необходимости реализовать эту функцию самим.
-
Механизм OLE может действовать двумя способами:
Внедрение (embedding). Внедрённый документ становится частью того
документа, в который он вставляется.
Связывание (linking). Связанный объект в приложении представляет собой
не сам документ, а только ссылку на него.
2. Компонент OLE Container
Основным компонентом для работы с OLE является OLEContainer
(находится на вкладке System). Этот компонент предоставляет приложению
возможность связывать и внедрять объекты, подготовленные сервером OLE.
Когда пользователь активирует объект, помещённый в контейнер OLE,
управление переходит к приложению-серверу OLE, функциональность которого
становится доступна из приложения, содержащего контейнер.
Контейнер OLE позволяет вставить данные из любого доступного OLEсервера: текстовый документ Word или WordPad, таблицу Excel, точечный
рисунок Paint, звук WAV и т.п.. Набор доступных серверов зависит от
установленного на конкретном компьютере программного обеспечения.
Обычный способ работы с компонентом OleContainer состоит в том, что
в ответ на требование пользователя открыть объект (выраженное, например,
нажатием
кнопки)
приложение
вызывает
метод
TOleContainer.InsertObjectDialog. Этот метод открывает диалоговое окно,
содержащее список типов встраиваемых объектов, поддерживаемых системой
в данный момент. Очевидно, что этот список зависит от набора доступных OLEсерверов.
Начиная с версии 5 в Delphi на палитре компонентов появилась вкладка
Servers, на которой находится более трёх десятков компонентов,
предназначенных для встраивания документов, подготовленных конкретными
серверами OLE – приложениями Microsoft Office. Эти компоненты облегчают
разработчику задачу управления офисными приложениями из своей программы
по сравнению с написанием программного кода.
Рассмотрим пример приложения-клиента OLE.
Продемонстрируем, как использовать в своей программе
компонент
OleContainer. Напишем приложение, умеющее отображать точечные рисунки,
документы Word, таблицы Excel и объекты прочих типов, обрабатываемых
доступными OLE-серверами.
1. Разместим на форме следующие компоненты: Panel, OleContainer, 1 кнопку
Button. Панель мы предназначили для размещения на ней кнопок, так как
всё остальное пространство главного окна будет отведено под отображение
внедряемого документа. Поэтому установим свойство Panel1.Align равным
alBottom и поместим кнопки на панель.
procedure TForm1.FormCreate(Sender: TObject);
begin
//размер контейнера устанавливаем по размеру формы
OleContainer1.Align:=alClient;
OleContainer1.Ctl3D:=False; //устанавливаем белый фон
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//отображаем диалог встраиваемого объекта:
OleContainer1.InsertObjectDialog;
end;
2. Нажатие на кнопку Button1 «Вставить объект» приведёт к открытию
диалогового окна, позволяющего выбрать тип объекта для внедрения или
связывания. В этом диалоговом окне можно выбрать либо создание нового
объекта (на форме будет отображён пустой документ соответствующего
формата), либо загрузку объекта из существующего файла. Если вы
попытаетесь открыть файл, не обслуживаемый ни одним из доступных OLEсерверов, то будет сгенерировано исключение EOleSysError, стандартная
обработка которого состоит в выдаче сообщения об ошибке.
3. Когда вы устанавливаете переключатель в положение «Создать из
файла», становится доступен флажок «Связь». При установленном
флажке встраиваемый объект будет связан (linked), при снятом,
соответственно, - внедрён (embedded). Всегда доступен флажок «В виде
значка». Его установка приводит к тому, что вместо объекта на форме
будет показана иконка документов соответствуещего типа.
4. При открытии какого-либо из существующих файлов вcтроенный документ
будет доступен только для чтения. Чтобы перейти к его редактированию,
нужно дважды щёлкнуть в любом месте области отображения документа.
Запустится приложение-сервер OLE, а для отображения документа оно
будет использовать окно нашего приложения.
5. Для того, чтобы во встроенном в наше приложение документе
отображалась строка меню, нужно поместить на форму рядом с
компонентом OleContainer компонент MainMenu, затем снова собрать и
запустить приложение, внедрить в него документ и открыть его двойным
щелчком.
{Обратите внимание на отсутствие группы команд «Файл», в результате чего
мы не сможем, например, сохранить отредактированный документ. Чобы
устранить эту проблему, включите флажок «Связь», тогда документ
одновременно будет загружен в ваше приложение и доступен для
редактирования и сохранения в отдельном окне. При закрытии отдельного окна
изменения отобразятся в вашем приложении.}
3. Программный вызов сервера OLE
Рассмотрим один из способов linking использования OLE технологии на
примере программного вызова таблицы Excel и ввода данных в Excel
клиентским приложением. В качестве клиентского приложения будем
использовать таблицу StringGrid, разработанную нами на практическом занятии
OP_7.
Добавим на форму кнопку Button2 “Excel”, при нажатии которой будет
вызвана таблица Excel и рассчитанные данные столбца «За год» будут
экспортированы в столбец книги Excel.
В секцию Uses добавляем запись (модуль) ComObj (от названия технологии
“COM”); в секцию глобальных переменных добавляем переменную
ExcelApplication типа Variant. Ещё одна переменная типа Variant понадобится
для представления текущего рабочего листа, её мы объявим локально внутри
процедуры обработчика события нажатия кнопки “Excel”.
procedure TForm1.Button2Click(Sender: TObject);
var
Sheet : Variant;
I : Integer;
begin
ExcelApplication := CreateOLEObject('Excel.Application');
ExcelApplication.Visible:=True;
ExcelApplication.DisplayAlerts:=True;
//создаём новую рабочую книгу
ExcelApplication.Workbooks.Add;
//открываем первый рабочий лист
Sheet:=ExcelApplication.Workbooks[1].Worksheets[1];
//копируем записи из ячеек пятого столбца таблицы StringGrid
//во второй столбец таблицы Excel, начиная с третьей строки
for I:=0 to 5 do
Sheet.Cells[I+3,2]:=StringGrid1.Cells[5,I];
end;
Download