
- •Технология автоматизации - 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и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”.