- •Технология автоматизации - ole Automation.
- •Методы взаимодействия с сервером автоматизации.
- •Компоненты системы Delphi для взаимодействия с серверами автоматизации msOffice.
- •Технология ActiveX.
- •Реализация технологии ado.
- •Компонент tadoDataSet.
- •Особенности компонентов ado.
- •Технология Inter Base Express (ibx).
Методы взаимодействия с сервером автоматизации.
При использовании позднего связывания компилятору не требуется никакой информации об объекте автоматизации. Для получения доступа к серверу автоматизации используется функция 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”.
