МОРДОВСКИЙГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИМЕНИН.П. ОГАРЕВА
Светотехническийфакультет
Кафедрасветотехники
КУРСОВАЯРАБОТА
Программированиедля Wordиз Delphi
САРАНСК2008
Реферат
Курсовая работасодержит 23 страницы, 9 использованных источников, 1 рисунок, 2 таблицы и 1приложение.
В курсовой работеиспользуются следующие ключевые слова:
COM,OLE, сервер автоматизации, интерфейс, IDispatch,объект, семейство.
Объектом исследованияявляется технология взаимодействия приложений с текстовым редактором MicrosoftWord.
В процессе работыиспользовалась учебная литература по программированию в среде Borland Delphiдля Windows.
В результатеисследования: изучена методика создания приложений передающих данные в MicrosoftWord.
Содержание
Введение
1. ОсновыCOM-технологии
1.1 COM-объекты
1.2 Вызовметодов COM-объектов
1.3 Созданиеи использование экземпляров серверов автоматизации
2. Экспортинформации в MicrosoftWord
2.1 Структураприложения MicrosoftWord
2.2 Запусксервера
2.3 Взаимодействиес сервером на уровне документа
2.4 Непосредственныйвывод информации
2.5 Форматированиетекстовой информации
2.6 Использованиезакладок
2.7 Управлениеприложением
Заключение
Список использованных источников
Пиложение 1
Введение
Целькурсовой работы заключена в изучении технологий вывода данных из приложенийсозданных в среде Borland Delphiв другие распространенные программы, такие как MicrosoftOffice и в частности MicrosoftWord. Среда BorlandDelphi предоставляет широкиевозможности вывода информации на принтер с помощью объектаTPrinter. Однако большинство задач печати сводится к выводу текста или таблиц.При этом с одной стороны, в программах приходится реализовывать сложныеалгоритмы форматирования текста при выводе, а с другой стороны, такие задачидублируют широко распространенные пакеты, в которых данные возможности ужереализованы. Более того, вывод информации на печатающее устройство жесткоопределяет вид получаемых документов, на который пользователь не можетповлиять. При этом с развитием компьютерной техники печатные документы становятсявсе менее востребованными в связи с широким использованием для обменаинформацией электронной почты и факсов. В таких условиях целесообразно наделятьпрограммные продукты возможностями сохранения информации в общепринятыхформатах, таких, например, как формат текстовых документов RTF, тем более, чтоDelphi частично поддерживает такие возможности. Однако работа с такимиформатами все-таки не проста, и требует от разработчика дополнительных усилий,особенно в условиях быстрого обновления стандартов на форматы представленияданных.
Второйподход к повышению гибкости вывода информации поддерживается наличием в Windowsтехнологии OLE (Object Linking and Embedding – связывание и внедрениеобъектов), позволяющей запускать сторонние приложения и передавать им данные,вызывая методы этих приложений. Технология OLE является частью технологии СОМ –признанного стандарта для выполнения подобных операций, и все большепрограммных продуктов поддерживают такие возможности. Исключением не является игруппа продуктов Microsoft Office,каждое приложение которой может быть использовано из Delphi-приложений дляпередачи в них данных.
1. ОСНОВЫ COM-ТЕХНОЛОГИИ
1.1COM-объекты
СОМ(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 следующим образом:
functionCreateOleObject(const ClassName: string): IDispatch;
Функциявыдает ссылку на интерфейс IDispatch объекта, зарегистрированного в реестреWindows под именем ClassName. Для определения названия класса следует изучитьдокументацию к программному продукту, предоставляющему сервер автоматизации.Для приложения Microsoft Word таким именем является «Word.Application», а дляMicrosoft Excel – «Excel.Application». Аналогичные названия классов имеют идругие компоненты Microsoft Office.
Еслисервер автоматизации уже запущен, то ссылку на него можно получить с помощьюфункции GetActiveOleObject:
functionGetActiveOleObject(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; // Разрушениепрограммныхструктур
2. ЭКСПОРТ ИНФОРМАЦИИ В MICROSOFTWORD
2.1 Структураприложения MicrosoftWord
Приложения,входящие в состав Microsoft Office,имеют иерархическую объектную структуру. Структура каждого приложения сложна исущественно отличается от структуры других приложений, что обусловленоразличной направленностью самих приложений. Объектыиерархий Microsoft Office содержат всебе методы, количество которых приблизительно равно количеству действий,поддерживаемых при редактировании документов, поэтому их число очень велико. Иерархическаяструктура объектов отражает представление данных, редактируемых в том или иномприложении. Структура Microsoft Word включает в себя объект верхнего уровняApplication, управляющий непосредственно приложением, и вложенные в негообъекты типа Document, предоставляющие доступ к документам, открытым в данныймомент. При добавлении очередного объекта Document сторонним приложением спомощью методов сервера автоматизации MicrosoftWord открывает очередной документ. Аналогично объекты типа Document могутсодержать в себе объекты типа Paragraph, представляющие собой ссылки на абзацытекста. Доступ к объектам различного уровня из программы-клиента,реализованной, например, на Delphi, осуществляется единообразно, через ссылкина вышестоящие в иерархии объекты. Объекты одного уровня и назначения,например, объекты типа Document, объединяются в одно свойство, так называемоесемейство, которое имеет название типа объектов во множественном числе. Такимобразом, объекты типа Document объединяются в свойство Documents.
Такиесвойства являются, фактически списками, для которых можно определить количествоэлементов в каждом из них (свойство Count) и получить доступ к элементу спомощью функции Item, получающей в качестве параметра номер объекта в списке.Элементы нумеруются от единицы. Для передачи параметров в методы объектовавтоматизации и присвоения значений их свойствам используется специальный типданных OleVariant, основное отличие которого от типа Variant состоит в егосовместимости с операционной системой, которая и поддерживает технологию СОМ. Итак,для экспорта информации в Microsoft Word с использованием сервера автоматизацииследует:
1.Создать экземпляр сервера автоматизации «Word.Application» (запустить Word) илиполучить ссылку на уже запущенный экземпляр.
2.Создать новый документ.
3.Вывести информацию в созданный документ.
4.Разрушить структуры, связанные с экземпляром сервера автоматизации в программе,а также ссылки на элементы его объектной иерархии.
2.2 Запуск сервера
Созданиеили получение ссылки на экземпляр сервера автоматизации выполняется с помощьюфункций CreateOleObject или GetActiveOleObject соответственно. В некоторыхслучаях целесообразно сначала пытаться подключиться к существующему серверу, ав случае неудачи запустить собственную версию.
2.3 Взаимодействие с сервером на уровне документа
Длясоздания нового документа следует добавить элемент в семейство 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 Наличие атрибута «Перечеркнутый» Subscript Boolean Символы в режиме «Нижний индекс» Superscript Boolean Символы в режиме «Верхний индекс» SmallCaps Boolean Все символы строчные AllCaps Boolean Все символы заглавные
Документ,с точки зрения текстовой информации, состоит из набора (семейства) абзацев,представленных объектами Paragraph, доступ к каждому из которых возможен черезфункцию item объекта-семейства Paragraphs. Форматирование параграфа,редактирование которого производится в данный момент, осуществляется черезсвойство ParagraphFormat объекта Selection, а для объектов типа Paragraphвозможности форматирования доступны напрямую. Доступные для изменения настройкиабзаца включают выравнивание, наличие буквицы (первой буквы абзаца специальногоначертания), отступы первой строки от границы абзаца и отступы самой границы абзацаот краев страницы, название стиля абзаца, и множество других параметров,используемых в Word. Мы рассмотрим две часто используемых настройки абзаца –отступы абзаца и его выравнивание.
Отступыабзаца задаются свойствами Leftindent(отступ слева), Rightlndent(отступ справа) и FirstLinelndent(отступ первой строки от левой границы абзаца) объекта ParagraphFormat.Значения отступов задаются вещественными числами в условных единицах, которыеможно получить из сантиметров или дюймов с помощью методов объекта «Word.Application»CentimetersToPoints и InchesToPoints.
Выравниваниередактируемого (текущего) абзаца выполняется с помощью свойства Alignmentобъекта ParagraphFormat. Выравнивание всех абзацев документа можно выполнитьчерез одноименное свойство объекта-семейства Paragraphs. В качестве значений,определяющих выравнивание, могут использоваться: 0 (выравнивание по левомукраю), 1 (выравнивание по центру), 2 (выравнивание по правому краю) и 3(выравнивание по ширине).
Дляустановки одинакового выравнивания для всех абзацев можно воспользоватьсяобъектом-семейством Paragraph.
2.6Использование закладок
MicrosoftWord поддерживает возможность работы с закладками – неотображаемыми атрибутамидокумента, управление которыми (добавление, удаление и переход на закладку)осуществляется с помощью диалога пункта главного меню Вставка→Закладка.Приложение, которое является OLE-клиентом, может обратиться к семействуBookmarks закладок для доступа к каждой из них, или к объекту Selection дляперехода (перемещения выделения) на закладку, заданную именем.
Дляперехода на закладку следует использовать метод Goto объекта Selection.
Selection.GoTo (What: Integer; Name: String);
ПараметрWhat указывает тип элемента, на которыйследует переместиться. Параметр Nameзадает название закладки, указанное при ее добавлении в документ.
Использованиезакладок существенно упрощает подготовку унифицированных документов, например,анкет, в которых большая часть информации является вспомогательной, а на ееоснове следует заполнить какие-либо поля данных. Места, куда должна бытьвведена информация, можно пометить закладками, по которым Delphi-программабудет перемещать выделение с целью вывода информации методом TypeText объектаSelection.
2.7Управление приложением MicrosoftWord
ПриложениеMicrosoft Word, которое является сервером автоматизации, может присутствоватьна экране в момент обращения к нему клиента, а может быть, скрыто. Видимостьприложения определяется логическим свойством Visible. Управление видимостьюприложения может быть необходимо, чтобы пользователь не смог помешать процессуэкспорта информации. Приложения Officeустроены таким образом, что им все рано, кто вводит информацию – стороннееприложение через сервер автоматизации или пользователь с помощью интерфейса.Таким образом, если Delphi-приложение осуществляет длительный экспортинформации, используя метод TypeText объекта Selection, пользователь имеетвозможность переключиться в окно Word и, например, изменить положениетекстового курсора. В результате таких действий изменится состояние объектаSelection, и информация будет выведена не по порядку, а из того места, котороеуказал пользователь. Для того, чтобы запретить пользователю изменять выделениево время процесса экспорта информации, можно скрыть окно приложения с экрана наэто время.
Ещеодна интересная особенность использования сервера автоматизации MicrosoftWord вытекает из принадлежности объектаSelection к объекту«Word.Application», а не к объекту Document, с которым работает программа. Еслиссылка на сервер автоматизации не создана в программе функцией CreateOleObject,а получена из функции GetActiveOleObject, то переключение пользователем вдругое окно приложения Word, используемого программой, также приведет кизменению смысла свойства Selection. После переключения в другой документданное свойство будет определять выделение в этом документе, что являетсянедопустимым, так как в него будет осуществляться вывод информации. Дляизбежание таких проблем не следует использовать сервера автоматизации,полученные функцией GetActiveOleObject, если вывод информации может занятьдлительное время. Заметим, что даже вывод нескольких строк может датьпользователю возможность переключения между приложениями, поэтому болееправильно создавать новый сервер автоматизации при использовании методовобъекта «Word.Application» вообще.
Заключение
Воперационной системе Windowsприложения существуют не изолированно; пользователи, как правило, желают, чтобыони взаимодействовали. Буфер обмена Windowsпредлагает простой способ взаимодействия между приложениями, поскольку с егопомощью пользователи могут копировать и вставлять данные. Однако все больше ибольше программ предлагают интерфейс автоматизации, позволяющий управлять имииз других программ. Помимо очевидного преимущества программируемойавтоматизации по сравнению с ручными операциями пользователя, эти интерфейсыполностью нейтральны по отношению к языку программирования, используемому дляих написания. Технология COMи OLE позволяют разработчикам в полноймере использовать все средства уже созданных программ. Используя их,разработчики расширяют функциональность своих приложений, прикладывая к этомуминимум усилий и времени. К тому эти технологии предоставляют возможностьэкспортировать данные в общепринятые и распространенные форматы, что в конечномитоге делает созданное приложение более удобным и полезным.
Вданный момент MicrosoftWord является наиболее мощным ираспространенным текстовым редактором. Включение его возможностей в приложенияпозволяет создавать по-настоящему функциональные и полезные программыработающие с текстовыми данными.
Список использованныхисточников
1. СухаревМ.В. Основы Delphi.Профессиональный подход. – СПб.: Наука и Техника, 2004. – 600 с.: ил.
2. КэнтуМ. Delphi 7: Для профессионалов.– СПб.: Питер, 2004. – 1101 с.: ил.
3. ФленовМ.Е. Библия Delphi. – СПб.:БХВ-Петербург, 2004. – 880 с.: ил.
4. ФленовМ.Е. Программирование в Delphiглазами хакера. – СПб.: БХВ-Петербург, 2004. – 368 с.: ил.
5. ТейксейраС., Пачеко К. Delphi 5, Руководстворазработчика. в 2 т. – СПб.: Питер, 2005.
6. СтивенсР. Delphi. Готовые алгоритмы /Пер. с англ. – М.: ДМК Пресс, 2001. – 384.: ил.
7. СтивенсР. Delphi. Готовые алгоритмы / Пер. с англ. Мерещука П. А. — 2-е
изд., стер. — М.: ДМКПресс; СПб.: Питер, 2004. — 384 с.: ил.
8. http://www.demo.ru
9. BorlandDelphi 2005. Электронныйсамоучитель. ООО «ИДДК», 2005.
Приложение 1
Создатьприложение создающее документ Wordи записывающее в него 100 строк цифр от 100 до 200.
unitUnit1;
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}
procedureTForm1.BitBtn1Click(Sender: TObject);
var
WordDoc:variant;
x:integer;
y:string;
begin
WordDoc:= CreateOLEObject('Word.Application');
WordDoc.Visible:= true;
WordDoc.Documents.Add;
x:= 100;
whilex
begin
y:= IntToStr(x);
WordDoc.Selection.TypeText(y);
WordDoc.Selection.TypeParagraph;
x:=x+1;
end;
WordDoc:= Unassigned;
end;
end.