Программирование для Word из Delphi

МОРДОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ИМЕНИ Н.П. ОГАРЕВА

Светотехнический факультет

Кафедра светотехники

КУРСОВАЯ РАБОТА

Программирование для Word из Delphi

САРАНСК 2008

Реферат

Курсовая работа содержит 23 страницы, 9 использованных источников, 1 рисунок, 2 таблицы и 1 приложение.

В курсовой работе используются следующие ключевые слова:

COM, OLE, сервер автоматизации, интерфейс, IDispatch, объект, семейство.

Объектом исследования является технология взаимодействия приложений с текстовым редактором Microsoft Word.

В процессе работы использовалась учебная литература по программированию в среде Borland Delphi для Windows.

В результате исследования: изучена методика создания приложений передающих данные в Microsoft Word.

Содержание

Введение

    Основы COM-технологии

      COM-объекты

      Вызов методов COM-объектов

      Создание и использование экземпляров серверов автоматизации

    Экспорт информации в Microsoft Word

      Структура приложения Microsoft Word

      Запуск сервера

      Взаимодействие с сервером на уровне документа

      Непосредственный вывод информации

      Форматирование текстовой информации

      Использование закладок

      Управление приложением

Заключение

Список использованных источников

Пиложение 1

Введение

Цель курсовой работы заключена в изучении технологий вывода данных из приложений созданных в среде Borland Delphi в другие распространенные программы, такие как Microsoft Office и в частности Microsoft Word. Среда Borland Delphi предоставляет широкие возможности вывода информации на принтер с помощью объекта TPrinter. Однако большинство задач печати сводится к выводу текста или таблиц. При этом с одной стороны, в программах приходится реализовывать сложные алгоритмы форматирования текста при выводе, а с другой стороны, такие задачи дублируют широко распространенные пакеты, в которых данные возможности уже реализованы. Более того, вывод информации на печатающее устройство жестко определяет вид получаемых документов, на который пользователь не может повлиять. При этом с развитием компьютерной техники печатные документы становятся все менее востребованными в связи с широким использованием для обмена информацией электронной почты и факсов. В таких условиях целесообразно наделять программные продукты возможностями сохранения информации в общепринятых форматах, таких, например, как формат текстовых документов RTF, тем более, что Delphi частично поддерживает такие возможности. Однако работа с такими форматами все-таки не проста, и требует от разработчика дополнительных усилий, особенно в условиях быстрого обновления стандартов на форматы представления данных.

Второй подход к повышению гибкости вывода информации поддерживается наличием в Windows технологии OLE (Object Linking and Embedding – связывание и внедрение объектов), позволяющей запускать сторонние приложения и передавать им данные, вызывая методы этих приложений. Технология OLE является частью технологии СОМ – признанного стандарта для выполнения подобных операций, и все больше программных продуктов поддерживают такие возможности. Исключением не является и группа продуктов Microsoft Office, каждое приложение которой может быть использовано из Delphi-приложений для передачи в них данных.

    ОСНОВЫ COM-ТЕХНОЛОГИИ

1.1 COM-объекты

СОМ (Component Object Model – Модель многокомпонентных объектов) – является объектно-ориентированной концепцией, описывающей правила построения классов, называемых СОМ-объектами, с целью обеспечения взаимодействия между ними вне зависимости от языка, на котором реализованы данные классы, и среды, в которой выполняются приложения, содержащие их. Объекты СОМ реализуются в специальном двоичном формате, являющимся фактически описанием класса, и не зависящем от языка разработки, и предоставляют свою функциональность (позволяют вызывать свои методы) через набор интерфейсов. Каждый СОМ-объект реализует как минимум один интерфейс IUnknown выполняющий следующие действия:

1. Поддержка счетчика экземпляров объекта с помощью методов AddRef, вызываемого при создании экземпляра класса для увеличения значения счетчика, и Release, вызываемого при разрушении экземпляра для уменьшения значения счетчика;

2. Предоставление ссылки на интерфейс, заданный его уникальным идентификатором, и поддерживаемый СОМ-объектом, с помощью метода Query Interface.

Для идентификации СОМ-объектов применяются глобальные уникальные идентификаторы, представляющие собой 128-разрядные целые числа, записываемые в следующем формате, где вместо символа 'х' указывается шестнадцатеричная цифра:

['{хххххххх-хххх-хххх-хххх-хххххххххххх}']

Например, главное приложение графического редактора Adobe Photoshop имеет такой идентификатор:

{43191D98-5D34-4103-BE42-226A55C2312A}

1.2 Вызов методов СОМ-объектов

СОМ-объекты могут использоваться либо внутри приложения (такие СОМ-объекты называются внутрипроцессными), либо в виде исполняемых модулей (внешние СОМ-объекты). Приложение (приложение-клиент), использующее СОМ-объект, вызывает метод, заявленный в каком-либо интерфейсе этого СОМ-объекта (объекта-сервера). Вызов производится по имени с передачей необходимых параметров, вне зависимости от типа используемого СОМ-объекта (внешний или внутрипроцессный). Связывание вызова метода с его адресом может быть выполнено двумя способами:

1. Через интерфейс IDispatch.

2. Через таблицу виртуальных методов.

Таблица виртуальных методов строится для СОМ-объекта на этапе компиляции программы, которая его использует, и обладает такими достоинствами, как высокая скорость работы и отсутствие ошибок в передаче параметров, так как синтаксис вызова проверяется компилятором. Такой вид связывания называется ранним, по аналогии с ранним связыванием вызовов методов для экземпляров обычных классов Delphi. Для раннего связывания необходимо наличие библиотеки типов, содержащей информацию о сигнатуре методов.

На рис 1. приложение-клиент «Приложение1» обращается к методу «Метод 2» СОМ-объекта напрямую, используя механизм раннего связывания. Для этого адрес метода должен быть внесен в таблицу виртуальных методов приложения.

Второй вариант связывания – позднее связывание – осуществляется с помощью использования интерфейса IDispatch. СОМ-объекты, реализующие интерфейс IDispatch, называются серверами автоматизации. Именно серверы автоматизации и интересуют нас в контексте вывода информации за пределы программы.

Заметим, что принадлежность СОМ-объекта к серверам автоматизации не запрещает возможность раннего связывания, наоборот, интерфейс IDispatch предоставляет необходимую приложению информацию о типах.

Интерфейс IDispatch предназначен для использования сервера автоматизации в условиях позднего связывания и имеет несколько методов для определения информации о типах. Также в интерфейсе IDispatch заявлен метод Invoke, которому передается имя метода для вызова и список необходимых параметров. На этом методе и построен механизм использования серверов автоматизации из Delphi-программ. Механизм вызова метода объекта через метод Invoke интерфейса IDispatch, реализованного этим объектом, показан на рис. Приложение-клиент «Приложение 2» обращается к методу invoke, который определяет метод «Метод 2», запрошенный приложением, и вызывает его.

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

Рис 1. Различные механизмы вызова методов COM-объектов.

1.3 Создание и использование экземпляров серверов автоматизации

Для создания сервера автоматизации используется функция CfeateOleObject, описанная в модуле Comobj следующим образом:

function CreateOleObject(const ClassName: string): IDispatch;

Функция выдает ссылку на интерфейс IDispatch объекта, зарегистрированного в реестре Windows под именем ClassName. Для определения названия класса следует изучить документацию к программному продукту, предоставляющему сервер автоматизации. Для приложения Microsoft Word таким именем является «Word.Application», а для Microsoft Excel – «Excel.Application». Аналогичные названия классов имеют и другие компоненты Microsoft Office.

Если сервер автоматизации уже запущен, то ссылку на него можно получить с помощью функции GetActiveOleObject:

function GetActiveOleObject(const ClassName: string): IDispatch;

Если при вызове метода GetActiveOleObject система не может обнаружить запущенную версию заданного сервера автоматизации, то будет возбуждена исключительная ситуация класса EOleError.

Ссылки, которые возвращают функции GreateOleObject и GetActiveOleObject, следует сохранять в переменных для дальнейшего доступа к созданному или полученному объекту. Несмотря на то, что тип ссылки определен как IDispatch, переменная, в которую эта ссылка сохраняется, должна иметь тип Variant. Это связано с тем, что из данной переменной будут вызываться методы сервера автоматизации, которые не описаны в интерфейсе IDispatch.

Var

Object: Variant;

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

Использование экземпляра сервера автоматизации, то есть вызов его методов, осуществляется с помощью конструкций, обычных для вызова методов в Delphi:

<Ссылка на сервер>.<Название метода>(<Список параметров>);

Однако механизм, используемый для реального вызова, существенно отличается от вызова методов Delphi-классов. Название метода и список его параметров запаковываются в специальную структуру, которая затем передается методу invoke СОМ-объекта через ссылку, полученную при вызове функции CreateOleObject. Метод invoke определяет, какой именно его метод должен быть вызван, выполняет его, запаковывает результат и возвращает его в вызвавшую программу.

Объекты автоматизации поддерживают также и доступ к свойствам через специальным образом описанные методы.

Для разрушения структур данных, связанных с использованием СОМ-объекта в программе, следует присвоить ссылке на него значение Unassigned. Данная операция не закрывает запущенный сервер автоматизации:

Var

Object: Variant;

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

Object := Unassigned; // Разрушение программных структур

    ЭКСПОРТ ИНФОРМАЦИИ В MICROSOFT WORD

2.1 Структура приложения Microsoft Word

Приложения, входящие в состав Microsoft Office, имеют иерархическую объектную структуру. Структура каждого приложения сложна и существенно отличается от структуры других приложений, что обусловлено различной направленностью самих приложений. Объекты иерархий Microsoft Office содержат в себе методы, количество которых приблизительно равно количеству действий, поддерживаемых при редактировании документов, поэтому их число очень велико. Иерархическая структура объектов отражает представление данных, редактируемых в том или ином приложении. Структура Microsoft Word включает в себя объект верхнего уровня Application, управляющий непосредственно приложением, и вложенные в него объекты типа Document, предоставляющие доступ к документам, открытым в данный момент. При добавлении очередного объекта Document сторонним приложением с помощью методов сервера автоматизации Microsoft Word открывает очередной документ. Аналогично объекты типа Document могут содержать в себе объекты типа Paragraph, представляющие собой ссылки на абзацы текста. Доступ к объектам различного уровня из программы-клиента, реализованной, например, на Delphi, осуществляется единообразно, через ссылки на вышестоящие в иерархии объекты. Объекты одного уровня и назначения, например, объекты типа Document, объединяются в одно свойство, так называемое семейство, которое имеет название типа объектов во множественном числе. Таким образом, объекты типа Document объединяются в свойство Documents.

Такие свойства являются, фактически списками, для которых можно определить количество элементов в каждом из них (свойство Count) и получить доступ к элементу с помощью функции Item, получающей в качестве параметра номер объекта в списке. Элементы нумеруются от единицы. Для передачи параметров в методы объектов автоматизации и присвоения значений их свойствам используется специальный тип данных OleVariant, основное отличие которого от типа Variant состоит в его совместимости с операционной системой, которая и поддерживает технологию СОМ. Итак, для экспорта информации в Microsoft Word с использованием сервера автоматизации следует:

1. Создать экземпляр сервера автоматизации «Word.Application» (запустить Word) или получить ссылку на уже запущенный экземпляр.

2. Создать новый документ.

3. Вывести информацию в созданный документ.

4. Разрушить структуры, связанные с экземпляром сервера автоматизации в программе, а также ссылки на элементы его объектной иерархии.

      Запуск сервера

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

      Взаимодействие с сервером на уровне документа

Для создания нового документа следует добавить элемент в семейство Documents объекта «Word.Application» с помощью функции Add, которая вернет ссылку на созданный документ:

Add(Template: String, NewTemplate: Boolean): Document;

Строковый параметр Template определяет, на основе какого шаблона должен быть создан новый документ, а параметр NewTemplate указывает на то, что создаваемый документ сам должен являться шаблоном. Если метод вызывается без параметров, то новый документ создается на основе шаблона Normal (обычный) и является обычным документом.

Ссылку на вновь созданный документ, возвращаемую методом Add, следует сохранить в переменной типа Variant для дальнейшего доступа к документу с целью вывода информации в него. При необходимости вывода информации в сложные формы новый документ можно создать на основе некоторого «шаблона» - ранее созданного и сохраненного документа. Параметры могут передаваться методу Add в обычной форме.

Закрыть документ после окончания вывода информации в него можно с помощью метода close.

2.4 Непосредственный вывод информации

Вывод информации в Microsoft Word аналогичен работе пользователя в редакторе и некоторым образом эмулирует ее. Так, с помощью объекта Selection, отражающего текущее выделение в документе, поддерживаются команды ввода текста и настройки его параметров. Если явного выделения не присутствует, то объект Selection отражает местонахождение текстового курсора. Заметим, что объект Selection принадлежит объекту «Word.Application», а не объекту Document. Для вывода информации в объект Selection используется его метод TypeText. Для ввода символа перевода строки можно воспользоваться методом TypeParagraph объекта Selection. При последовательном выводе информации изменение автоматически установленного выделения обычно не требуется, однако, если возникнет такая необходимость, можно установить параметры выделения с помощью методов Move, MoveRight (сместить выделение вправо) и MoveLeft (сместить выделение влево):

Move(Unit: Integer, Count: Integer);

MoveRight(Unit: Integer, -Count: Integer, Extend: Boolean = False);

MoveLeft(Unit: Integer, Count: Integer, Extend: Boolean = False);

Методы сдвигают выделение на заданное параметром Count количество единиц. Значение параметра может быть положительным, либо отрицательным. В случае метода Move знак параметра Count определяет направление смещения выделения. Отрицательное значение параметра указывает на смещение влево, а положительное – вправо. Методы MoveRight и MoveLeft изначально настроены на смещение выделения в заданную сторону (вправо и влево соответственно), поэтому отрицательное значение параметра Count в их вызове просто меняет направление смещения выделения. При использовании методов Move, MoveLeft и MoveRight, выделение, если оно существовало до их вызова, снимается. Этого можно избежать в функциях MoveLeft и MoveRight, если в качестве значения необязательного параметра Extend задать значение True (по умолчанию устанавливается False).

Параметр Unit определяет единицу смещения выделения. Некоторые его значения, указаны в таблице 1.

Таблица 1. – Некоторые значения параметра Unit.

Значение

Единица смещения выделения

1

Один символ

2

Одно слово

3

Одно предложение

4

Один абзац

5

Одна строка

9

Один столбец таблицы, если выделение находится в таблице

10

Одна строка таблицы, если выделение находится в таблице

12

Одна ячейка таблицы, если выделение находится в таблице

И, наконец, чтобы просто сбросить выделение, не изменяя его начального положения, можно воспользоваться методом Collapse объекта Selection.

2.5 Форматирование текстовой информации

Для форматирования текущего выделения, через объект Selection можно получить доступ к объекту Font, определяющему характеристики шрифта данного выделения. Основные свойства объекта Font перечислены в таблице 2.

Таблица 2. – Основные свойства объекта Font.

Название свойства

Тип

Описание

Name

String

Название шрифта

Size

Integer

Размер шрифта

Bold

Boolean

Наличие атрибута «Полужирный»

Italic

Boolean

Наличие атрибута «Наклонный»

StrikeThrough

Boolean

Наличие атрибута «Перечеркнутый»

sub>script

Boolean

Символы в режиме «Нижний индекс»

Superscript

Boolean

Символы в режиме «Верхний индекс»

SmallCaps

Boolean

Все символы строчные

AllCaps

Boolean

Все символы заглавные

Документ, с точки зрения текстовой информации, состоит из набора (семейства) абзацев, представленных объектами Paragraph, доступ к каждому из которых возможен через функцию item объекта-семейства Paragraphs. Форматирование параграфа, редактирование которого производится в данный момент, осуществляется через свойство ParagraphFormat объекта Selection, а для объектов типа Paragraph возможности форматирования доступны напрямую. Доступные для изменения настройки абзаца включают выравнивание, наличие буквицы (первой буквы абзаца специального начертания), отступы первой строки от границы абзаца и отступы самой границы абзаца от краев страницы, название стиля абзаца, и множество других параметров, используемых в Word. Мы рассмотрим две часто используемых настройки абзаца – отступы абзаца и его выравнивание.

Отступы абзаца задаются свойствами Leftindent (отступ слева), Rightlndent (отступ справа) и FirstLinelndent (отступ первой строки от левой границы абзаца) объекта ParagraphFormat. Значения отступов задаются вещественными числами в условных единицах, которые можно получить из сантиметров или дюймов с помощью методов объекта «Word.Application» CentimetersToPoints и InchesToPoints.

Выравнивание редактируемого (текущего) абзаца выполняется с помощью свойства>

Для установки одинакового выравнивания для всех абзацев можно воспользоваться объектом-семейством Paragraph.

2.6 Использование закладок

Microsoft Word поддерживает возможность работы с закладками – неотображаемыми атрибутами документа, управление которыми (добавление, удаление и переход на закладку) осуществляется с помощью диалога пункта главного меню Вставка→Закладка. Приложение, которое является OLE-клиентом, может обратиться к семейству Bookmarks закладок для доступа к каждой из них, или к объекту Selection для перехода (перемещения выделения) на закладку, заданную именем.

Для перехода на закладку следует использовать метод Goto объекта Selection.

Selection. GoTo (What: Integer; Name: String);

Параметр What указывает тип элемента, на который следует переместиться. Параметр Name задает название закладки, указанное при ее добавлении в документ.

Использование закладок существенно упрощает подготовку унифицированных документов, например, анкет, в которых большая часть информации является вспомогательной, а на ее основе следует заполнить какие-либо поля данных. Места, куда должна быть введена информация, можно пометить закладками, по которым Delphi-программа будет перемещать выделение с целью вывода информации методом TypeText объекта Selection.

2.7 Управление приложением Microsoft Word

Приложение Microsoft Word, которое является сервером автоматизации, может присутствовать на экране в момент обращения к нему клиента, а может быть, скрыто. Видимость приложения определяется логическим свойством Visible. Управление видимостью приложения может быть необходимо, чтобы пользователь не смог помешать процессу экспорта информации. Приложения Office устроены таким образом, что им все рано, кто вводит информацию – стороннее приложение через сервер автоматизации или пользователь с помощью интерфейса. Таким образом, если Delphi-приложение осуществляет длительный экспорт информации, используя метод TypeText объекта Selection, пользователь имеет возможность переключиться в окно Word и, например, изменить положение текстового курсора. В результате таких действий изменится состояние объекта Selection, и информация будет выведена не по порядку, а из того места, которое указал пользователь. Для того, чтобы запретить пользователю изменять выделение во время процесса экспорта информации, можно скрыть окно приложения с экрана на это время.

Еще одна интересная особенность использования сервера автоматизации Microsoft Word вытекает из принадлежности объекта Selection к объекту «Word.Application», а не к объекту Document, с которым работает программа. Если ссылка на сервер автоматизации не создана в программе функцией CreateOleObject, а получена из функции GetActiveOleObject, то переключение пользователем в другое окно приложения Word, используемого программой, также приведет к изменению смысла свойства Selection. После переключения в другой документ данное свойство будет определять выделение в этом документе, что является недопустимым, так как в него будет осуществляться вывод информации. Для избежание таких проблем не следует использовать сервера автоматизации, полученные функцией GetActiveOleObject, если вывод информации может занять длительное время. Заметим, что даже вывод нескольких строк может дать пользователю возможность переключения между приложениями, поэтому более правильно создавать новый сервер автоматизации при использовании методов объекта «Word.Application» вообще.

Заключение

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

В данный момент Microsoft Word является наиболее мощным и распространенным текстовым редактором. Включение его возможностей в приложения позволяет создавать по-настоящему функциональные и полезные программы работающие с текстовыми данными.

Список использованных источников

    Сухарев М.В. Основы Delphi. Профессиональный подход. – СПб.: Наука и Техника, 2004. – 600 с.: ил.

    Кэнту М. Delphi 7: Для профессионалов. – СПб.: Питер, 2004. – 1101 с.: ил.

    Фленов М.Е. Библия Delphi. – СПб.: БХВ-Петербург, 2004. – 880 с.: ил.

    Фленов М.Е. Программирование в Delphi глазами хакера. – СПб.: БХВ-Петербург, 2004. – 368 с.: ил.

    Тейксейра С., Пачеко К. Delphi 5, Руководство разработчика. в 2 т. – СПб.: Питер, 2005.

    Стивенс Р. Delphi. Готовые алгоритмы / Пер. с англ. – М.: ДМК Пресс, 2001. – 384.: ил.

    Стивенс Р. Delphi. Готовые алгоритмы / Пер. с англ. Мерещука П. А. - 2-е

изд., стер. - М.: ДМК Пресс ; СПб.: Питер, 2004. - 384 с.: ил.

    http://www.demo.ru

    Borland Delphi 2005. Электронный самоучитель. ООО «ИДДК», 2005.

Приложение 1

Создать приложение создающее документ Word и записывающее в него 100 строк цифр от 100 до 200.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Comobj, StdCtrls, Buttons;

type

TForm1 = class(TForm)

BitBtn1: TBitBtn;

procedure BitBtn1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);

var

WordDoc: variant;

x: integer;

y: string;

begin

WordDoc := CreateOLEObject('Word.Application');

WordDoc.Visible := true;

WordDoc.Documents.Add;

x := 100;

while x<201 do

begin

y := IntToStr(x);

WordDoc.Selection.TypeText(y);

WordDoc.Selection.TypeParagraph;

x:= x+1;

end;

WordDoc := Unassigned;

end;

end.