Главная страница
Навигация по странице:

  • Значение свойства ConnectKind Характеристика

  • DateTimeToStr

  • 00.2 Уч-мет пос МПиС d4 (1). Лабораторная работа Формирование статистической таблицы с возможностью сортировки, фильтрации и группировки данных 4


    Скачать 2.1 Mb.
    НазваниеЛабораторная работа Формирование статистической таблицы с возможностью сортировки, фильтрации и группировки данных 4
    Дата09.10.2022
    Размер2.1 Mb.
    Формат файлаdocx
    Имя файла00.2 Уч-мет пос МПиС d4 (1).docx
    ТипЛабораторная работа
    #722618
    страница7 из 9
    1   2   3   4   5   6   7   8   9

    Лабораторная работа № 6.
    Доступ к COM серверам Microsoft Office из Delphi


    Рассмотрим вопрос доступа к общеизвестным приложениям Microsoft Office, таким как Word, Excel, Outlook и других, через набор компонент, представленных в Delphi.

    В Delphi имеется закладка на палитре инструментов – Servers. Через эти компоненты можно получать доступ к COM серверам приложений Office, использующих автоматизацию (прежде известную как OLE Automation).

    Ценность приложений Office для разработчика заключается в том, что все, что можно сделать руками, можно сделать программным путем с использованием средств VBA (Visual Basic for Application). Приложения Office поставляют сервера COM, которые предоставляют интерфейс доступа к приложению и его объектам. Разработчик в среде Delphi имеет возможность, создав контроллер автоматизации, управлять сервером. Приложение рассматривается как совокупность объектов со своими методами, свойствами, событиями, которые обеспечивают скелет приложения.

    Наследование – мощный инструмент построения нового класса. Еще один способ получения класса – встраивание. Как и наследование, встраивание транзитивное отношение. В объектной модели Office нет наследования в полном смысле этого слова, а есть только встраивание.

    Всегда существует задающий приложение корневой объект, он всегда называется Application. Каждое приложение Office имеет свой собственный окорневой обект – Word.Application, Excel.Application.

    Outlook приложение само является корневым объектом, несмотря на это в объект Application встраиваются все остальные объекты (участники), которые являются свойствами главного объекта.

    Имеются одинаковые методы в различных приложениях OfficeRun, Quit, Activate.

    В разных приложениях имеют различный набор параметров, а зачастую выполняют не адекватные действия. На рисунке 1 показан фрагмент структуры объекта Microsoft Word Objects (рис. 34).

    Рис. 34. Фрагмент структуры объекта Microsoft Word Objects


    Полное представление об объектной архитектуре приложений Office можно найти в соответствующих файлах помощи.

    При открытии нового документа (PowerPoint, Excel, Word), автоматически создается каркас нового документа, который представляет собой набор библиотек с классами.

    Объекты этих классов будут доступны в данном документе. Задачей разработчика контроллера автоматизации является получить доступ к корневому объекту сервера, выстроить цепочку доступа к объектам – участникам (встроенным объектам), правильно передать параметры.
    Объекты Application и организация доступа к ним из Delphi

    Фундаментальным объектом любого приложения является Application. Алгоритм получения доступа из Delphi следующий:

    • создаем новый проект;

    • на главную форму выкладываем компоненту с закладки Servers, которая называется WordApplication;

    • Устанавливаем свойства компоненты AutoConnect и AutoQuit в True;

    • запускаем приложение на выполнение.

    Запустилась форма и отобразилась на экране. Наше приложение запустило сервер автоматизации Microsoft Word, этот факт можно обнаружить, запустив на выполнение Task Manager и выбрав закладку Processes. Среди прочих процессов обнаруживаем WINWORD.EXE.

    При создании формы, в системном реестре, по идентификатору CLSID найден сервер Word.Application. Запущено на выполнение приложение, находящееся по адресу в реестре (ProgID). Сервер предоставил приложению, которое и является контроллером автоматизации интерфейс, через который мы получим доступ к объекту Application.

    Интерфейс Idispatch унаследован от Iunknown, который имеет три метода. _ADDRef - умеет считать количество клиентов, в настоящий момент использующих сервер. Как только от сервера отсоединиться последний клиент, он автоматически будет выгружен из памяти компьютера.

    Закройте приложение и загляните в Task Manager - Word выгрузился из памяти (рис. 35).


    Рис. 35. Процедура выгрузки Word из памяти


    Такой же результат можно получить, прописав следующий код:
    var

    wd:OleVariant;

    fileName:string;

    begin

    try

    fileName:=ExtractFilePath(Application.EXEName)+'report.DOC';

    //Создаем объект интерфейса для доступа к серверу COM

    wd:=CreateOleObject('Word.Application');

    //Проверка наличия методов и правильность передачи параметров будет осуществляться на стадии выполнения приложения

    wd.application.documents.add; wd.application.activedocument.range.insertAfter(now);

    wd.application.activedocument.saveas(fileName);

    //выгрузаем сервер из памяти компьютера

    wd.application.quit(true,0);

    .

    Добавьте в раздел uses модуль COMOBJ.
    Базовый класс TOLEServer

    На закладке Service находится набор компонент для доступа к серверам автоматизации. Не все компоненты возвращают ссылку на объект Application, могут быть получены интерфейсы для доступа к вложенным объектам, таким как Документ Word или рабочая книга Excel.

    Все компоненты унаследованы от класса TOLEServer, который наследует свойства класса Tcomponent.

    TOLEServer является базовым классом всех COM серверов, которые можно получить через среду IDE следующим образом: Project | Import Type Library.

    Класс TOLEServer имеет еще несколько свойств и методов для управления связью с COM сервером.

    Свойство AutoConnect автоматически запускает COM сервер и производит извлечение из него интерфейса, обеспечивающего связь с контроллером.

    Важное свойство класса TOLEServerConnectKind – указывающее тип процесса, к которому устанавливается связь. Свойство используется методом Connect, который вызывается автоматически, если свойство AutoConnect истинно.

    В табл. 7 описаны значения, которые может принимать ConnectKind:

    Таблица 7.

    Значения ConnectKind

    Значение свойства ConnectKind

    Характеристика

    CkRunningOrNew

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

    CkNewInstance

    При соединении с сервером каждый раз создается новый экземпляр

    CkRunningInstance

    Соединение устанавливается с уже запущенным COM сервером. Если таковой отсутствует – будет создан соответствующий объект ошибки, который необходимо обработать

    CkRemote

    Это значение используется совместно со свойством RemoteMachineName, если необходимо подключиться к серверу на удаленной машине

    ckAttachToInterface

    При установке этого значения интерфейс не создается и соответственно нельзя указывать значение True для свойства AutoConnect. Соединение с сервером производится с помощью метода ConnectTo


    Рассмотрим подробнее значении свойства ConnectKind равном ckAttachToInterface.

    Соединяемся с сервером через главный интерфейс, представленный в объекте Application. Если возникает необходимость подключить к проекту такие компоненты, как WordDocument или WordParagraphFormat, то производим подключение к уже существующему интерфейсу, а не создаем его заново. Это может быть необходимо, когда контроллер должен отслеживать события, происходящие в COM сервере.
    Пример. Создайте новое приложение. Выложите на форму компонент WordApplication и WordDocument свойства AutoConnect и AutoQuit для WordApplication и установите в True свойство ConnectKind для WordDocument установите в ckAttachToInterface. Для события onDokumentChange и onFormCreate пропишите следующий код:
    procedureTForm1. WordApplicationDocumentChange(Sender: TObject);

    begin

    //производим подключение к текущему документу

    WordDocument1.ConnectTo(WordApplication1.ActiveDocument);

    //контроллер добавляет новую строку в текущий документ

    WordDocument1.Range.InsertAfter(#13+’Переход к документу’+#13+ WordApplication1.ActiveDocument.Get_FullName+’произведен:’+DateTimeToStr(Now));

    end;
    procedure TForm1.FormCreate(Sender: TObject);

    begin

    //COM сервер отображает себя на экране

    WordApplication1.Visible:=true;

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

    Аналогично можно управлять и сервером ExcelApplication.

    При создании новой рабочей книги на сервере, в контроллере будет проинициализировано событие onNewWorkBook, которое можно обработать аналогично предыдущему примеру.
    Классы – наследники ToleObject

    Рассмотрим подробнее компоненты закладки Servers. Все классы унаследованы от ToleObject. Наследуется и интерфейс из библиотеки TLB.

    Происходит по следующему алгоритму:

    • из среды программирования Delphi удаляем пакет с компонентами COM серверов (Component | Install Packages | Borland Sample Automation Servers Component | Remove). После этого закладка Servers удалилась.

    • создаем новый пакет с использованием библиотеки типов.

    • выберите Project | Type library

    • из списка зарегистрированных серверов выберите библиотеку типов Excel (Microsoft Excel Object Library)

    • укажите имя закладки палитры компонент (Pallete Page), куда будут установлены новые классы – TexcelQueryTable, TexcelApplication, TexcelChart, TexcelWorksheet, TexcelWorkbook, TExcelOLEObject.

    • выберите закладку Servers.

    • в боксе - General Component Wraper установите флажок для генерации компонеты на основе библиотеки типов и размещении ее на палитре компонент.

    • нажмите кнопку Install.

    • специфицируйте имя пакета, где будет сгенерирован новый класс.

    • установите сервер на палитру компонент.

    После проделанных манипуляций стал доступен COM сервер Excel, в состав которого входят шесть классов (рис. 36).


    Рис. 36. Набор подключенных библиотек


    Аналогичным образом восстановите компоненты для сервера Word и Outlook. Объявление класса TwordApplication и его предка -ToleServer:
    TOleServer=class(TComponent, IUnknown)

    TwordApplication= class(TOleServer)
    Благодаря объявлению, класс TwordApplication наследует свойства и методы класса Tcomponent (способен устанавливаться на палитре компонент и прочие…), а также знает все о доступе к интерфейсам COM серверов, благодаря наследованию интерфейса IUNknown.

    В библиотеке типов прописаны все доступные методы и свойства COM сервера.

    Когда создается контроллер автоматизации (выкладываем на форму соответствующий компонент из палитры), то приложение получает доступ к Dual Interface описанный в библиотеке типов.

    Dual интерфейс – это совокупность пользовательского интерфейса, описанного в библиотеке типов и dispinterface, который доступен в момент выполнения приложения. Это реализовано с помощью COM VTABLE интерфейса, унаследованного от IDISPATCH.

    Использование Vtable интерфейса имеет ряд преимуществ:

    • Передаваемые параметры, их типы и количество проверяется на стадии проектирования и редактор кода сопровождает разработчика всевозможными подсказками.

    • Через Vtable интерфейс осуществляется значительно быстрый доступ к серверу автоматизации, чем через DispInterface.

    • В то же время, не всегда разработчик получает доступ к библиотеке типов и соответственно к V – таблице, поэтому приходится иногда пользоваться Idispatch интерфейсом.

    Пример использования Dual интерфейса.
    procedureTForm1. FormCreate(Sender: TObject);

    var

    foo:TWordApplication;

    foo1:_Application;

    begin

    foo:=WordApplication1;

    foo1:=CoWordApplication.Create;

    ShowMessage(foo.UserName+#13+foo1.Get_Name);

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

    Для доступа к COM серверу автоматизации существует три способа: Vtable, Idispatch и позднее связывание (CreateOleObject).

    Наиболее прогрессивный – первый способ, через который работают компоненты Delphi для доступа к COM серверам приложений Office.
    Пример использования Vtable интерфейса

    Постановка задачи: Имеется шаблон документа – shablon.DOC, подготовленный в MS Word, поля, которые должны быть заменены, помечены символом @.

    Необходимо прочитать данные из источника информации и заменить метки, на реальные данные, после чего распечатать полученный документ.

    Метод Vtable. Выкладываем на форму компоненту WordApplication, WordDocument и кнопку Button.

    Для события OnClick компоненты Button1 пропишем следующий код:
    procedure TForm1.Button1Click(Sender: TObject);

    var

    //Объявление переменных, для передачи их в качестве формальных параметров в сервер автоматизации

    Shablon,FileName,oldStr,newStr,replace,ext:OleVariant;

    begin

    Table1.Active:=false;

    Table1.Active:=true;

    Shablon:=ExtractFilePath(Application.EXEName)+'shablon.DOC';

    FileName:=ExtractFilePath(Application.EXEName)+'report.DOC';

    //Открываемшаблондокумента

    WordApplication1.Documents.Open(Shablon,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,

    EmptyParam,EmptyParam,EmptyParam,EmptyParam);

    //Связываемкомпонентуссуществующиминтерфейсом

    WordDocument1.ConnectKind:=ckAttachToInterface;

    WordDocument1.ConnectTo(WordApplication1.ActiveDocument);

    //Следующие переменные понадобятся нам для выполнения методов сервера

    replace:=1; oldStr:='@1'; newStr:=DateTimeToStr(Now);

    //Находим в документе метки и производим их замены

    WordDocument1.Range.Find.Execute(oldStr,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,

    EmptyParam,EmptyParam,newStr,replace);

    oldStr:='@2'; newStr:=WordApplication1.UserName;

    WordDocument1.Range.Find.Execute(oldStr,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,

    EmptyParam,EmptyParam,newStr,replace);

    ………

    //сохранение документа и отображение его в OLE контейнере (предварительный просмотр)

    WordDocument1.SaveAs(FileName); WordDocument1.Close;

    OleContainer1.CreateLinkToFile(FileName,false); OleContainer1.Refresh;

    end;
    Обратите внимание на передачу параметров в методы. Все параметры описаны как OleVariant и передаются в методы по ссылке (такая передача параметров характерна только для сервера Word, Excel и OutLook, например, принимают в основном фактические параметры).

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

    После того как установили компоненты, библиотеки типов разместились в директории …Delphi\Imports\. В файлах библиотек типов можно найти, например, все константы, необходимые для передачи параметров в Excel и OutLook, названия их интуитивно понятны.

    В модуле SystemDelphi описана переменная EmptyParam, которую необходимо использовать для передачи “пустышек” в качестве параметров.
    var

    EmptyParam: OleVariant; {«Пустой параметр» который должен опционально использоваться в Dual интерфейсе}
    Описание методов в библиотеке типов заставляет аккуратно соблюдать порядок передачи параметром, что затрудняет процесс программирования. Dual интерфейс работает значительно быстрее чем передача именованных параметров при позднем связывании сервера и контроллера автоматизации.
    Пример использования Dispatch интерфейса

    Постановка задачи: получить информацию о документе, который открывается MS Word, при этом не должны использоваться никакие компоненты для доступа к серверам автоматизации.

    Создадим новое приложение и выложим на форму кнопку.

    Пропишем событие onDoubleClick для кнопки следующим образом:


    procedure TForm1.Button1Click(Sender: TObject);

    var

    Shablon:OleVariant;

    word:_ApplicationDisp;

    begin

    Shablon:=ExtractFilePath(Application.EXEName)+'shablon.DOC';

    word:=CoWordapplicaTion.Create as _ApplicationDisp;

    (Word.Documents as DocumentsDisp).Open(Shablon,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,

    EmptyParam,EmptyParam,EmptyParam,EmptyParam);

    showmessage((Word.Application as _application).Get_Name+#13+

    ((Word.Application as _application).ActiveDocument as _documentDisp).Path );

    word.quit(EmptyParam,EmptyParam,EmptyParam);

    end;
    Переменная word имеет тип
    ApplicationDisp = dispinterface ['{00020970-0000-0000-C000-000000000046}'],
    который описан в библиотеки типов Word97_TLB.Pas.

    Строка word:=CoWordapplicaTion.Createas _ApplicationDisp; создает экземпляр сервера и возвращает DispInterface.

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

    В сравнении с использованием метода позднего связывания через функцию CreateOleObject этот метод более прогрессивный. Часть информации компилятору известна.
    Использование компонент для доступа к COM серверам через Vtable интерфейс значительно ускоряет работу приложения и ограждает разработчика от ошибок.
    Другие компоненты для доступа к COM серверам

    Сервер Excel.

    После импортирования библиотеки типов, на закладке палитры компонент появились шесть иконок, основная из них ExcelApplication - компонента, обеспечивающая доступ к объекту Application сервера Excel. Следующий пример демонстрирует работу с объектом Application и WorkBook сервера Excel.

    Параметры серверу передаются по значению, библиотека типов предоставляет все основные константы для работы с сервером (рис. 37):

    const

    xlDays = $00000000;

    xlMonths = $00000001;

    xlYears = $00000002;
    procedure TForm1.FormCreate(Sender: TObject);

    begin

    ExcelApplication1.Workbooks.add(ExtractFilePath(Application.EXEName)+'customs',0);

    ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook);

    ExcelApplication1.Visible[0]:=true;

    end;


    Рис. 37. Использование ресурсов MS Excel из Delphi


    Получив доступ к серверу можем формировать всевозможные отчеты, строить графики. Из Delphi можно пользоваться ресурсами MS Excel.
    Работа с Outlook из Delphi

    В сервере Outlook имеется класс Application, в который встраивается класс NameSpace. Последний предоставляет доступ к данным через объект класса MAPIFolders, представляющий собой коллекцию папок пользователя. Получив доступ к Outlook через компоненту OutLookApplication, извлекается объект доступа к MAPI папкам.
    mapi:=OutlookApplication1.GetNamespace('MAPI');

    for i:=1 to mapi.Folders.Count do

    ListBox1.Items.Add(mapi.Folders.Item(i).Name);
    Имеем дело с вложенными объектами.

    Пример рассылки писем, извлекая адреса из таблицы базы данных.

    Самостоятельно доработаете данный пример.


    procedureTForm1.Button1Click(Sender: TObject);

    var

    mapi:NameSpace;

    begin

    Table1.Active:=false;

    Table1.Active:=true;

    //Получаем доступ к папке

    mapi:=OutlookApplication1.GetNamespace('MAPI');

    while not Table1.Eof do

    begin

    //Подключаем объект класса TMailItem к новому елементу исходящих писем , для работы через Vtable интерфейс

    MailItem1.ConnectTo(_DMailItem(mapi.Folders.Item(olPersonal). Folders.Item(olFolderOutbox). Items.Add(olPostItem) as

    iDispatch));

    //Наполняемновоеписьмоинформацией

    MailItem1.Subject:='test for '+Table1Common_Name.Value;

    MailItem1.to_:=Table1Category.Value+'@elsite.ru';

    Table1Graphic.SaveToFile(Table1SpeciesNo.AsString+'.BMP');

    MailItem1.Attachments.Add(ExtractFilePath(Application.EXEName)+Table1SpeciesNo.AsString+

    '.BMP',1,1,Table1SpeciesName.Value);

    MailItem1.Body:=#13#13+'Письмосвложеннымдокументом '+#13+ MailItem1.SenderName;

    MailItem1.Sensitivity:=olConfidential ;

    MailItem1.FlagStatus:=olFlagMarked;

    //Сохраняем письмо. OutLook самостоятельно его отошлет по почте

    MailItem1.Save;

    Table1.next;

    end;

    end;
    Использование Vtable интерфейса значительно упростило процесс разработки контроллеров автоматизации COM серверов.

    Используя язык Delphi и открытый интерфейс серверов MS Office можно строить очень большие и серьезные приложения, работающие совместно.
    Контрольное задание
    Индивидуально (согласно заданию преподавателя) сформировать документ MSWord и подключить к BorlandDelphi. Прописать функциональные кнопки аналогично приведенным формам и алгоритмам.
    1   2   3   4   5   6   7   8   9


    написать администратору сайта