Создание контроллеров автоматизации с помощью C++Builder

       

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


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


Примерная иерархия вложенных объектов OLE-сервера

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

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

Variant  MyWorkbook=XL.OlePropertyGet(“WorkBooks”).OlePropertyGet(“Item”,1);

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

  • создание в Excel рабочей книги с двумя страницами и какими-нибудь именами;
  • заполнение первых 10 ячеек двух первых колонок числами;
  • вычисление в одиннадцатой ячейке их суммы;
  • изменение цвета и начертания шрифта в одной из колонок, а также цвета ячеек;
  • сохранение полученной рабочей книги в файле.
  • Код, заставляющий Excel выполнить эти действия, будет выглядеть следующим образом:



    //———————————————————————————————#include <vcl.h>

    #pragma hdrstop

    #include <ComObj.hpp>

    #include “xlauto2.h”

    //———————————————————————————————#pragma package(smart_init)

    #pragma resource “*.dfm”

    TForm1 *Form1;

    Variant XL,v0,v1,v2;

    //Function Item(“Item”);

    //———————————————————————————__fastcall TForm1::TForm1(TComponent* Owner)

    : TForm(Owner)

    {

    }

    //———————————————————void __fastcall TForm1::Button1Click(TObject *Sender)

    {

    XL=CreateOleObject(“Excel.Application.8”);

    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-сервером. Это сделано для того, чтобы существование вариантной переменной не ограничивалось данной процедурой.


    Содержание раздела