- •Технологический раздел
- •2.2.1. Реляционные базы данных.
- •2.2.2. Сущности и атрибуты в реляционной модели
- •2.2.3. Связи в реляционной модели
- •2.2.4. Краткое описание возможностей ibExpert
- •2.2.5. Моделирование с помощью Database Designer
- •2.2.6. Создание бд на основе sql-скрипта
- •2.2.7. Создание бд «с нуля»
- •2.3.1. Общие сведения
- •2.3.2. Сом и ole-автоматизация
- •2.3.3. Компоненты-серверы сом в Delphi 7 и их применение
2.3.3. Компоненты-серверы сом в Delphi 7 и их применение
Взаимодействие с Word, Excel и многими другими распространенными программами, входящими в стандартную установку Word и Microsoft Office, может осуществляться из приложений Delphi 7 с помощью компонентов, размещенных в библиотеке на странице Servers (рис. 2.10). Эти компоненты отображают множество импортируемых серверов СОМ. Все они являются потомками своего базового класса TOleServer. В этом классе объявлены абстрактные методы и свойства, позволяющие устанавливать связь с сервером. Поэтому объекты класса TOleServer нельзя создавать непосредственно. В приложениях используются только потомки этого класса — конкретные серверы СОМ. Они создаются импортом библиотек типов, осуществляемым в среде Delphi командой Project | Import.
В ИПС «Разработка и макетирование» применяются два вида серверов ExcelApplication и WordApplication. Ниже приводится описание компонента WordApplication.
Рис 2.10. Закладка с компонентами-серверами СОМ в Delphi 7
Свойство AutoConnect определяет, должен ли сервер автоматически загружаться с началом выполнения приложения. Если установить AutoConnect = true, то соединение с сервером произойдет в момент начала выполнения вашего приложения. Если же оставить значение AutoConnect = false, принятое по умолчанию, то соединение с сервером можно установить вызовом метода Connect. Например;
WordApplication.Connect;
Впрочем, совершенно не обязательно устанавливать соединение свойством AutoConnect или методом Connect. Соединение автоматически устанавливается, когда выполняется вызов какого-то метода сервера или задается значение какому-то его свойству.
При использовании свойства AutoConnect надо иметь в виду, что установка в true учитываается только при запуске приложения, т.е. если это свойство установлено во время проектирования. Задание AutoConnect = true во время выполнения приложения ни на что не влияет.
Свойство ConnectKind определяет, как именно осуществляется соединение с сервером. Это свойство может принимать значения, указанные в табл. 2.1. По умолчанию значение ConnectKind равно ckRunningOrNew. При этом если в момент соединения имеется выполняющийся сервер (применительно к WordApplication – если Word открыт), то приложение соединится именно с этим выполняющимся экземпляром сервера. Если же в этот момент соответствующий сервер не выполняется, то будет создан новый экземпляр сервера (в нашем случае будет осуществлен запуск Word).
Таблица 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, используемая вместо необязательных параметров. Таким образом, для создания нового документа на основе обычного шаблона надо выполнить оператор:
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.
Если в документе присутствуют таблицы, то обращение к ним происходит через свойство 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;
Свойства и методы рассмотренных компонентов были использованы при разработке программного обеспечения ИПС “Разработка и макетирование” для создания печатных форм.