Скачиваний:
100
Добавлен:
01.05.2014
Размер:
1.56 Mб
Скачать

Создание контроллеров для произвольных серверов автоматизации

Как было сказано ранее, наличие тех или иных возможностей управления произвольным сервером зависит от того, какие объекты, свойства и методы сервера предоставлены разработчиками сервера программистам для автоматизации с помощью внешних приложений.

Каким образом можно получить информацию о них?

Обычно такие сведения содержатся в документации или файлах справочной системы, поставляемых с данным сервером, как, например, это сделано в MS Office или Seagate Crystal Reports Professional. Но в принципе такую информацию можно получить и из библиотеки типов.

В качестве примера рассмотрим использование информации из библиотеки типов MS Excel как одного из наиболее часто применяемых серверов автоматизации в практике отечественных разработчиков. Надо заметить, что практически все, что может сделать пользователь, работая с этим приложением, равно как и с другими приложениями MS Office, доступно для автоматизации.

Как и в предыдущем случае, для управления сервером автоматизации следует создать переменную типа Variantи вызвать функцию CreateOleObject:

Variant XL;

...

XL = CreateOleObject("Excel.Application.9");

В качестве параметра функции CreateOleObjectпередается имя объекта, который мы хотим создать. Найти его можно в реестре Windows.

Коллекции объектов внутри серверов автоматизации

Внутри некоторых OLE-серверов (в частности, приложений MS Office) существует иерархия вложенных объектов примерно следующего вида.

Свойствами объектов Excel могут являться так называемые коллекции объектов. Например, коллекция Workbooks является свойством объекта Excel.Application, при этом она содержит набор вложенных объектов — рабочих книг Excel, а те, в свою очередь, обладают свойством Worksheets, представляющим собой коллекцию рабочих листов, каждый из которых обладает свойством Cells, являющимся коллекцией ячеек. Аналогично коллекция Charts также является свойством рабочей книги, и, соответственно, внутри свойствами объектов Word могут быть коллекции Paragraphs, Words, Tables.

В С++Builder обращение к члену коллекции производится следующим образом:

Variant MyWorkbook = XL.OlePropertyGet ("WorkBooks")

.OlePropertyGet ("Item", 1);

Рассмотрим пример, использующий такие коллекции. Пусть при нажатии на кнопку главной формы приложения-клиента будут выполнены следующие действия:

1 создание в Excel рабочей книги с двумя страницами и какими-нибудь именами; 2 заполнение первых 10 ячеек двух первых колонок числами; 3 вычисление в одиннадцатой ячейке их суммы; 4 изменение цвета и начертания шрифта в одной из колонок, а также цвета ячеек; 5 сохранение полученной рабочей книги в файле.

Код, заставляющий Excel выполнить эти действия, будет выглядеть следующим образом:

Variant XL, v0, v1, v2;

void __fastcall TForm1::Button1Click(TObject *Sender)

{

XL = CreateOleObject ("Excel.Application.9");

XL.OlePropertySet ("Visible", true);

v0 = XL.OlePropertyGet ("Workbooks");

v0.OleProcedure ("Add");

v1 = v0.OlePropertyGet ("Item", 1);

v0 = v1.OlePropertyGet ("Worksheets") ;

v0.OlePropertyGet ("Item",1)

.OlePropertySet ("Name", "Бухгалтерия желтая");

v0.OlePropertyGet ("Item", 2)

.OlePropertySet ("Name", "Бухгалтерия красная");

for (int j = 1; j < 3; j++)

{

v1 = v0.OlePropertyGet ("Item", j);

for (int i = 1; i < 11; i++)

{

v1.OlePropertyGet ("Cells").OlePropertyGet ("Item", i, 1)

.OlePropertySet ("Value", i);

v1.OlePropertyGet ("Cells").OlePropertyGet ("Item", i, 2)

.OlePropertySet ("Value", i * 5);

v2 = v1.OlePropertyGet ("Cells").OlePropertyGet ("Item", i, 2);

v2.OlePropertyGet ("Font").OlePropertySet ("Color", clBlue);

v2.OlePropertyGet ("Font").OlePropertySet ("Bold", true);

v2.OlePropertyGet ("Interior")

.OlePropertySet ("ColorIndex", 9 - 3 * j);

}

v1.OlePropertyGet ("Cells").OlePropertyGet ("Item", 11, 1)

.OlePropertySet ("Value", "=SUM(A1:A10)");

v1.OlePropertyGet ("Cells").OlePropertyGet ("Item", 11, 2)

.OlePropertySet ("Value", "=SUM(B1:B10)");

}

// отключить диагностику при закрытии сервера

XL.OlePropertySet ("DisplayAlerts", false);

XL.OlePropertyGet ("Workbooks").OlePropertyGet ("Item", 1)

.OleProcedure ("SaveAs", "test.xls");

XL.OleProcedure ("Quit");

}

Отметим, что для запуска Excel в фоновом режиме без отображения его окна на экране достаточно убрать из кода С++Builder строку:

XL.OlePropertySet ("Visible", true);

Следует обратить внимание на то, что вариантная переменная XLобъявлена за пределами процедуры манипуляции OLE-сервером. Это сделано для того, чтобы существование вариантной переменной не ограничивалось данной процедурой.