Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом_Mage / Диплом / !!! Диплом (сборка).doc
Скачиваний:
51
Добавлен:
16.04.2013
Размер:
2.94 Mб
Скачать

2.3.3. Компоненты-серверы сом в Delphi 7 и их применение

Взаимодействие с Word, Excel и многими другими распространенными программами, входящими в стандартную установку Word и Microsoft Office, может осуществляться из приложений Delphi 7 с помощью компонентов, размещенных в библиотеке на странице Servers (рис. 2.10). Эти компоненты отображают множество импортируемых серверов СОМ. Все они являются потомками своего базового класса TOleServer. В этом классе объявлены абстрактные методы и свойства, позволяющие устанавливать связь с сервером. Поэтому объекты класса TOleServer нельзя создавать непосредственно. В приложениях используются только потомки этого класса — конкретные серверы СОМ. Они создаются импортом библиотек типов, осуществляемым в среде Delphi командой Project | Import [4].

В ИПС «Разработка и макетирование» применяются два вида серверов ExcelApplication и WordApplication. Ниже приводится описание компонента WordApplication.

Рис 2.10. Закладка с компонентами-серверами СОМ в Delphi 7

Свойство AutoConnect определяет, должен ли сервер автоматически загружаться с началом выполнения приложения. Если установить AutoConnect = true, то соединение с сервером произойдет в момент начала выполнения вашего приложения. Если же оставить значение AutoConnect = false, принятое по умолчанию, то соединение с сервером можно установить вызовом метода Connect. Например;

WordApplication.Connect;

Впрочем, совершенно не обязательно устанавливать соединение свойством AutoConnect или методом Connect. Соединение автоматически устанавливается, когда выполняется вызов какого-то метода сервера или задается значение какому-то его свойству [4].

При использовании свойства AutoConnect надо иметь в виду, что установка в true учитываается только при запуске приложения, т.е. если это свойство установлено во время проектирования. Задание AutoConnect = true во время выполнения приложения ни на что не влияет.

Свойство ConnectKind определяет, как именно осуществляется соединение с сервером. Это свойство может принимать значения, указанные в табл. 2.1. По умолчанию значение ConnectKind равно ckRunningOrNew. При этом если в момент соединения имеется выполняющийся сервер (применительно к WordApplication – если Word открыт), то приложение соединится именно с этим выполняющимся экземпляром сервера. Если же в этот момент соответствующий сервер не выполняется, то будет создан новый экземпляр сервера (в нашем случае будет осуществлен запуск Word) [4].

Таблица 2.1

Значения свойства ConnectKind компонента WordApplication

ckRunningOrNew

Подсоединиться к выполняющемуся серверу или создать новый экземпляр сервера

ckNewInstance

Всегда создавать новый экземпляр сервера

ckRunninglnstance

Только подсоединиться к выполняющемуся серверу

ckRemote

Эта опция должна сочетаться с заданием свойства RemoteMachineName

ckAttachToInterface

Не подсоединяться к серверу. Вместо этого приложение обеспечивает интерфейс методом ConnectTo (об этом ме­тоде будет сказано позднее). Опция ckAttachToInterface не может использоваться совместно с установкой в true свойства AutoConnect

После того, как установлено соединение с сервером, он еще не становится видимым пользователю. Впрочем, приложение может работать с этим сервером, вызывать любые его методы, изменять или читать свойства, но сам сервер останется для пользователя за кадром. Именно в фоновом режиме происходит работа с COM-серверами в программе. Однако при отладке программы, для определения того, корректно ли завершена работа с сервером, можно сделать его видимым. Для этого свойству Visible сервера задается значение true. Например:

WordApplication.Visible := true;

Разрыв соединения с сервером осуществляется методом Disconnect.

При работе с сервером Word множество обращений происходит к свойству Documents. Оно представляет собой собрание всех документов, открытых в Word в данный момент. Каждый документ представлен в нем как объект Document, имеющий свои свойства и методы. Общее число открытых документов определяется свойством Count собрания документов Documents. Особо следует отметить свойство ActiveDocument – активный документ.

Создание нового документа Document и включение его в Documents осуществляется методом Add объекта Documents. Новый документ создается на основе шаблона. Если шаблон не указан, то документ создается на основе шаблона «Обычный (Normal.dot)».

При вызове из Delphi любого метода сервера СОМ аргументы передаются как объекты типа OleVariant. Если какие-то аргументы не являются обязательными, то все равно они должны фигурировать в вызове метода. Только вместо их значений может быть указана EmptyParam – переменная типа OleVariant, используемая вместо необязательных параметров. Таким образом, для создания нового документа на основе обычного шаблона надо выполнить оператор [4]:

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

Но если требуется создать документ на основе специального шаблона (как, например, для формирования ведомости), то следует выполнить такой код:

var

Template : OleVariant;

begin

Template := 'c:\Template\1.dot';

WApplication.Documents.Add(Template,EmptyParam,EmptyParam,EmptyParam);

end;

С объектом Document удобно работать с помощью специального сервера СОМ – компонента WordDocument. Это сервер документа, т.е. объекта, содержащегося в объекте WordApplication. Он подключается к соответствующему объекту методом ConnectTo:

WordDocument.ConnectTo(WordApplication.ActiveDocument);

Такой оператор подключает компонент WordDocument к активному документу, открытому ранее в Word и указанному свойством ActiveDocument, о котором уже говорилось ранее.

Текст в документе, с которым связывается WordDocument, разбивается, в свою очередь, на объекты Range. Каждый такой объект соответствует непрерывному фрагменту текста. Объект Range может создаваться специальным методом Range, в котором в качестве начала и конца указываются определенные позиции символов или параграфы. Например, код

WordDocument.Range.Select;

WordDocument.Range.Copy;

выделяет и копирует в буфер весь документ, а код:

EndOfDocument := wdCollapseEnd;

WordDocument.Range(EndOfDocument,EndOfDocument).Select;

перемещает курсор в конец документа и убирает выделение.

К объектам типа Range можно применять методы InsertBefore, InsertAfter, Paste, Collapse [4].

Если в документе присутствуют таблицы, то обращение к ним происходит через свойство Tables объекта WordDocument. Для доступа ко второй таблице в документе необходимо вызвать такой оператор:

WordDocument.Tables.Item(2);

Он возвратит указатель на таблицу – объект Table. У него есть свойство Cells(RowNum,ColNum) для обращения к ячейке строки RowNum и столбца ColNum. Чтобы вставить в эту ячейку какой-либо текст, следует выполнить оператор присваивания:

Cell(RowNum, ColNum).Range.Text := ‘текст’;

Многие функции, вызываемые диалогами, могут вызываться как методы документа Document, если от пользователя не требуется активных действий. Сохранение активного документа в файле с заданным именем можно осуществить методом SaveAs, передавая в него как аргумент типа OleVariant имя файла с путем к нему. Если путь отсутствует, то файл сохраняется в текущем каталоге. Вызов метода SaveAs может быть таким:

var

FileName : OleVariant;

begin

FileName := ‘My.doc’;

WordDocument.SaveAs(FileName);

end;

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

WordDocument.PrintOut;

Предварительный просмотр документа перед печатью осуществляется методом PrintPreview:

WordDocument.PrintPreview;

Стоит также отметить, что при работе с различными версиями Word нормальное функционирование компонента WordApplication зависит от его версии. Например, компонент WordApplication из библиотеки WordXP может взаимодействовать с редактором Word XP или более поздними (Word2003). Чтобы добавить в программу возможность работы еще и с Word2000, необходимо заменить пакет компонент-серверов. Это делается при помощи главного меню Delphi (Component – Install Packages) [4].

Также было выявлено, что Word 2000 и Word XP по-разному адресуют объединенные ячейки в таблицах. Поэтому могут возникнуть проблемы с автоматическим заполнением документов. Во избежание этого необходимо использовать соответствующие версии редактора операторы. Подобное ветвление создается с использованием свойства Version компонента WordApplication:

if WordApplication.Version = '10.0'

then

PrintCardXP

else if WordApplication.Version = '9.0'

then PrintCard2000;

Свойства и методы рассмотренных компонентов были использованы при разработке программного обеспечения ИПС «Разработка и макетирование» для создания печатных форм.

Титул экономического раздела