00.2 Уч-мет пос МПиС d4 (1). Лабораторная работа Формирование статистической таблицы с возможностью сортировки, фильтрации и группировки данных 4
Скачать 2.1 Mb.
|
Лабораторная работа № 6. |
Значение свойства 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, названия их интуитивно понятны.
В модуле System – Delphi описана переменная 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. Прописать функциональные кнопки аналогично приведенным формам и алгоритмам.