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

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

При использовании позднего связываниякомпилятору не требуется никакой информации об объекте автоматизации. Для получения доступа к серверу автоматизации используется функция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иBuilderC++) имеется такой объект как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;

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