Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции 2005 / P4 / Технология автоматизации.doc
Скачиваний:
159
Добавлен:
16.04.2013
Размер:
191 Кб
Скачать

Методы взаимодействия с сервером автоматизации.

При использовании позднего связывания компилятору не требуется никакой информации об объекте автоматизации. Для получения доступа к серверу автоматизации используется функция Create Ole Object.

Delphi: Function Create Ole Object (const Name: string):IDispatch;

Builder C++: _di_IDispatch __fastcall CreateOleObject (const

AnsiString ClassName);

Таким образом, для Delphi процедура вызова такого объекта автоматизации как текстовый редактор Word, будет выглядеть так:

Procedure TFormMain.ButtonClick (Sender:TObject);

Var W:OleVariant;

Begin

W := CreateOleObject('Word.Basic'); {указатель на интерфейс объекта Basic сервера Word - запуск текстового редактора}

W.AppShow; {текстовый редактор становится видимым, т.е. показывается окно Word}

W.FileNew; {создать новый документ}

W.Insert ('Hello from Delphi' + #13);

end;

А для Builder C++ :

void __fastcall TFormMain::ButtonClick(TObject *Sender)

{

Variant V;

V = CreateOleObject("Word.Basic");

V.Exec(Procedure("AppShow"));

V.Exec(Procedure("FileNew") << "Normal");

V.Exec(Procedure("Insert")<< "Hello from Borland");

}

Заметим, что в данном примере редактор Word был запущен в отдельном окне, но в библиотеке визуальных компонентов Borland-компиляторов (Delphi и Builder C++) имеется такой объект как OLE-контейнер, позволяющий внедрять объект автоматизации в уже работающее приложение и связывать их в единое целое.

Пример внедрения и связывания объектов в C++ Builder.

На странице System библиотеки визуальных компонентов имеется контейнер OLE – OleContainer – компонент, обеспечивающий внедрение и связывание. Разместим на форме этот контейнер и компонент главного меню MainMenu, а также диалоги OpenDialog и SaveDialog. В главном меню создадим только подменю Объект и в нём пункты Новый, Открыть, Сохранить и Закрыть.

Дополнительно, для наглядности, можно добавить панель ToolBar и на ней быстрые кнопки, дублирующие основные команды меню.

Объект создаётся в процедуре обработки пункта Новый, она может иметь вид:

void __facstcall TForm::MNewClick(TObject *Sender)

{

if (OleContainer1->InsertObjectDialog())

{

FName = “”;

OleContainer1->DoVerb(ovShow);

}

}

Пояснения.

FName – глобальная переменная, в которой будет храниться имя файла объекта OLE.

Метод InsertObjectDialog делает обращение к стандартному окну Вставка объекта, в котором пользователь может указать тип вставляемого объекта. Затем, метод инициализирует объект и загружает его в контейнер OleContainer1.

Метод DoVerb обеспечивает немедленное открытие программы, связанной со вставляемым документом. Этот метод – не обязательный. Если его не вызывать, то контейнер может остаться пустым, а для вызова документа и открытия программы, пользователь должен сделать двойной щелчок на контейнере.

Аналогично, процедура обработки пункта Открыть, может иметь вид:

void __facstcall TForm::MOpenClick(TObject *Sender)

{

if (OpenDialog1->Execute())

{

OleContainer1->LoadFromFile(OpenDialog1->FileName);

FName = OpenDialog1->FileName;

OleContainer1->DoVerb(ovShow);

}

}

А процедура обработки пункта Закрыть, может иметь вид:

void __facstcall TForm::MCloseClick(TObject *Sender)

{

OleContainer1->DestroyObject();

}

Процедура обработки пункта Сохранить, может иметь вид:

void __facstcall TForm::MSaveClick(TObject *Sender)

{

if (FName== “”)

if (SaveDialog1->Execute())

FName = SaveDialog1->FileName;

else return;

// Принудительно заменяем расширение файла на “ole”

OleContainer1->SaveToFile(

ChangeFileExt(FName,“.ole”));

}

}

Полный стандартный пример находится в библиотеке примеров по адресу: “…\EXAMPLES\DOC\OLESTNRS\olemdi.bpr”.

Ниже на рис.1 приводится вид приложения до вызова в контейнер редактора Word, а на рис.2 приводится вид приложения после открытия и внедрения в приложение редактора Word.

Обратите внимание, что после открытия приложения в контейнере, это приложение встроится вместе со всеми своими инструментальными панелями и меню. При этом ваша инструментальная панель сохранилась и после загрузки объекта и начала работы с ним. А вот первое подменю приложения заменилось. Вместо подменю Файл, появилось ваше подменю Объект, со всеми своими командами открытия и закрытия файла.

Рис.1. Вид приложения до открытия Word’a.

Рис.2. Вид приложения после открытия и внедрения Word’a.

Если тип нового объекта известен заранее, то мы можем задать ещё перед компиляцией класс создаваемого объекта, т.е. задать приложение, которое подвергнется раннему связыванию. Для этого достаточно в обработчик события формы OnCreate (или в обработчик щелчка на какой-либо кнопке) вставить операторы:

OleContainer1->CreateObject(“класс_объекта”,false);

OleContainer1->DoVerb(ovShow);

Где параметр класс_объекта задаёт класс создаваемого объекта OLE. Например, для создания Word-документа, нужно задать класс объекта в виде “Word.Document”, для Excel-страницы – “Excel.sheet”, а для слайда PowerPoint – “PowerPoint.showt”.

При использовании раннего связывания компилятор должен получить информацию о методах и свойствах, которыми обладает объект автоматизации. Информация такого рода содержится в библиотеках типов, которые поставляются вместе с серверами автоматизации. В библиотеках типов содержится только описание методов объекта, а не их реализация. Поэтому библиотека типов напоминает модуль, в котором содержится только интерфейсная часть.

Многие из методов объектов автоматизации могут содержать необязательные формальные параметры, значения которых задаются по умолчанию. Для таких необязательных параметров при вызове метода объекта в качестве фактического параметра задается специальная константа EmptyParam.

Пример с ранним связыванием - вызов редактора Word и создание нового документа с текстом (из Delphi):

Uses... ComObj, Word97 (или Word2000);

Procedure TForm1.Button1.Click (Sender:TObject);

Var W:_Application;

D:OleVariant;

Begin

W:=CoWordApplication.Create; {запуск текстового редактора Word}

W.Visible:=True; {показать окно Word}

W.Documents.Add (EmptyParam,EmpryParam,

EmpryParam,EmpryParam);

W.Selection.InsertAfter ('...'+ #13);

D:=wdCollapseEnd; {чтобы убрать выделенность текста}

W.Selection.Collapse(D);

end;

Соответствующий пример для Builer C++ находится по адресу: “…\EXAMPLES\PWORDDEMO\pwordcomp.bpr”.