Классы – наследники 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. Как это происходит? Проведем следующее упражнение:
После проделанных манипуляций вам стал доступен 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 интерфейса имеет ряд преимуществ:
Ниже приведен пример использования интерфейса
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
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 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|