Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Классы – наследники ToleObject

Доступ к COM серверам Microsoft Office из Delphi

 

Цель работы: Получить практические навыки в реализации доступа к приложениям Microsoft Office, таким как Word, Excel.

Приложения и

Пример.

- Создайте новое приложение

- Выложите на форму компонент WordApplication и WordDocument

- Свойства AutoConnect и AutoQuit для WordApplication установите в True

- Свойство ConnectKind для WordDocument установите в ckAttachToInterface

- Для события onDokumentChange и onFormCreate пропишите следующий код:

 

 

procedure TForm1.WordApplication1DocumentChange(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 8.0 Object Library)
  • Укажите имя закладки палитры компонент (Pallete Page), куда будут установлены новые классы – TexcelQueryTable, TexcelApplication, TexcelChart, TexcelWorksheet, TexcelWorkbook, TExcelOLEObject. Выберите закладку Servers.
  • В боксе - General Component Wraper установите флажок для генерации компонеты на основе библиотеки типов и размещении ее на палитре компонент.
  • Нажмите кнопку Install
  • Специфицируйте имя пакета, где будет сгенерирован новый класс
  • Установите сервер на палитру компонент.

После проделанных манипуляций вам стал доступен COM сервер Excel, в состав которого входят шесть классов. Аналогичным образом восстановите компоненты для сервера 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 интерфейсом

Ниже приведен пример использования интерфейса

procedure TForm1.FormCreate(Sender: TObject);

Var

foo:TWordApplication;

foo1:_Application;

Begin

foo:=WordApplication1;

foo1:=CoWordApplication.Create;

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

end;

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

Подводя итог можно говорить о том, что для доступа к COM серверу автоматизации существует три способа

- Vtable

- Idispatch

- Позднее связывание (CreateOleObject)

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

Пример передачи данных из базы данных в Word


Var

R:Range;

T:Table;

numRec, numField,I,j: integer;

C:Cell;

numRec:=IBTable1.RecordCount;

numField:= IBTable1.FieldCount;

WordApplication1.Connect;

WordApplication1.Documents.Add(EmptyParam, EmptyParam,EmptyParam, EmptyParam);

WordApplication1.Visible:=True;

WordApplication1.Selection.TypeText(‘Таблица 1. список сотрудников’);

R:= WordApplication1.Selection.Range;

R.Tables.Add(r,NumRec+1, NumField, EmptyParam,EmptyParam);

T:= WordApplication1.ActiveDocument.Tables.Item(1);

For j:=0 to numField-1 do begin

C:=T.Cell(1, j+1);

C.Range.InsertAfter(IBTable1. Fields[j].FieldName);

End;

For i:=0 to numRec do

For j:=0 to numField-1 do begin

C:=T.Cell(i+1, j+1);

IBTable1.RecNo:=1;

C.Range.InsertAfter(IBTable1. Fields[j].AsString);

End;

End;

 

Пример передачи данных из базы данных в Excel

procedure TForm3.BitBtn4Click(Sender: TObject);

 

const

CellName: array[0..11] of Char=('A','B','C','D','E','F','G','H','I','J','K','L');

Var

index:OLEVariant;

C1, V: OLEVariant;

i,j:integer;

 

numRec, numField: integer;

 

begin

numRec:=DataModule1.IBTable1.RecordCount;

numField:= DataModule1.IBTable1.FieldCount;

ExcelApplication1.Connect;

ExcelApplication1.WorkBooks.Add(EmptyParam, 0);

ExcelApplication1.Visible[0]:=True;

ExcelWorkBook1.ConnectTo(ExcelApplication1.ActiveWorkBook);

index:=1;

ExcelWorkSheet1.ConnectTo(ExcelWorkBook1.WorkSheets.Item[index] as _WorkSheet);

ExcelWorkSheet1.Activate(0);

//IBTable1.Open;

try

For i:=1 to NumRec do begin

DataModule1.IBTable1.RecNo:=i;

For j:=0 to NumField-1 do begin

C1:=CellName[j]+IntToStr(i);

V:=DataModule1.IBTable1.Fields[j].Value;

DataModule1.IBTable1.RecNo:=i;

ExcelWorkSheet1.Range[C1,C1].Value:= V;

end;

end;

Finally;

DataModule1.IBTable1.Close;

end;

 

end;

 

Задание

1. Написать программу формирования выходных документов с использованием Word и Excel. Программа выгрузки данных из базы данных согласно варианту тематической базы данных.

2. Оформить отчет по результатам лабораторной работы.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...