Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабы / ИТСлаб6.doc
Скачиваний:
30
Добавлен:
16.04.2013
Размер:
74.24 Кб
Скачать

Использование позднего связывания

При использовании позднего связывания компилятору системы Borland C++ Builder не требуется никакой информации об объекте автоматизации. Для получения доступа к серверу автоматизации используется функция Borland C++ Builder

PACKAGE _di_IDispatch __fastcall CreateOleObject(const AnsiString ClassName);

С помощью параметра ClassName передается строковый идентификатор, связанный с объектом автоматизации. Функция CreateOleObject возвращает указатель на интерфейс _di_IDispatch, который используется для связи с объектом автоматизации, и осуществляет запуск сервера автоматизации.

Переменная, которая будет являться указателем на интерфейс, должна иметь тип Variant (изменяемый или заранее неизвестный тип) или OleVariant, специально предназначенный для работы с объектами автоматизации. После получения ссылки на интерфейс объекта автоматизации можно вызывать любые методы этого объекта.

Функция CreateOleObject находится в модуле COMObj, имя которого нужно указывать в директиве #include того модуля, который вызывает эту функцию.

Компилятор системы Borland C++ Builder не располагает информацией о методах и свойствах используемого программой объекта автоматизации, и если попытаться вызвать несуществующий метод или сослаться на несуществующее свойство, программа все равно будет откомпилирована без сообщений об ошибках. Ошибка обнаружится только во время выполнения программы, пользователь программы будет проинформирован об ошибке соответствующим сообщением.

Позднее связывание с сервером автоматизации Word

Для работы с текстовым редактором Word можно использовать два объекта автоматизации Basic и Application, интерфейсы которых существенно отличаются. Рассмотрим на примерах способы управления этими объектами с помощью предусмотренных для них методов.

Использование интерфейса объекта автоматизации Basic

С объектом автоматизации Basic связан строковый идентификатор "Word.Basic". Следующий фрагмент программы устанавливает указатель W на интерфейс объекта автоматизации Basic, запускает сервер автоматизации Word, вызывает метод AppShow для отображения окна текстового редактора на экране, создает новый документ методом FileNew и вставляет в него строки текста методом Insert. Включаемый в строку текста символ '\n' обеспечивает перевод курсора в начало следующей строки документа. Для приостановки выполнения программы использована процедура ShowMessage.

Variant W, R;

Procedure ShowApp("AppShow");

Function FileNew("FileNew");

Procedure Insert("Insert");

W = Variant::CreateObject("Word.Basic");

W.Exec(ShowApp);

R = W.Exec(FileNew << "Normal");

W.Exec(Insert << "Пример №1 создания нового документа\n");

W.Exec(Insert.ClearArgs() << "и передачи в него текста\n");

W.Exec(Insert.ClearArgs() << "методом позднего связывания\n");

ShowMessage("Для продолжения нажмите кнопку");

Для управления объектом автоматизации Basic можно использовать еще ряд методов, например:

FileOpen << FileLoc - открыть файл, местонахождение которого задано строкой символов FileLoc;

FileSaveAs << FileLoc << 3 - сохранить документ в файле, местонахождение которого задается строкой символов FileLoc;

FileSave - сохранить изменения, сделанные в документе;

FileClose - закрыть документ;

AppHide - не отображать окно текстового редактора на экране;

AppClose - закрыть приложение (сервер автоматизации).

Использование интерфейса объекта автоматизации Application

С объектом автоматизации Application связан строковый идентификатор "Word.Application". Следующий фрагмент программы устанавливает указатель W на интерфейс объекта автоматизации Application, запускает сервер автоматизации Word, устанавливает свойство Visible объекта автоматизации Application равным true для отображения окна текстового редактора на экране, методом Add создает новый документ в коллекции Documents открытых на текущий момент документов, методом Selection выбирает последний открытый документ в коллекции Documents и вставляет строки текста в документ методом TypeText. Включаемые в строку текста символы '\n' обеспечивают перевод курсора в начало следующей строки документа, т.е. вызывают "возврат каретки" и образование абзацев.

Variant W, D, S;

PropertySet VisTrue("Visible");

PropertyGet GetDocs("Documents");

Function DocAdd("Add");

PropertyGet GetSel("Selection");

Procedure AddText("TypeText");

W = CreateOleObject("Word.Application");

VisTrue << true;

W.Exec(VisTrue);

D = W.Exec(GetDocs);

D.Exec(DocAdd);

S = W.Exec(GetSel);

AddText.ClearArgs();

S.Exec(AddText<<WideString("Пример №2 создания нового документа\n\

и передачи в него текста\n\

методом позднего связывания"));

Поскольку документ включает в себя абзацы, то сервер автоматизации Word для работы с ними предоставляет объект автоматизации Paragraphs. Новый абзац вставляется в документ с помощью имеющегося у объекта Paragraphs метода Add, выполнение которого дает такой же эффект, какой получается, если пользователь, работающий в текстовом редакторе, нажимает на клавишу Enter. Например, следующий оператор обеспечивает вставку в 1-й открытый документ трех пустых абзацев:

for (int i=0; i<3; i++) W.OlePropertyGet("Documents").OleFunction("Item",1). OlePropertyGet("Paragraphs").OleFunction("Add");

Количество абзацев в документе хранится в свойстве Count объекта Paragraphs и может быть присвоено переменной целого типа (например, NumPars):

NumPars = WordApp.OlePropertyGet("Documents").OleFunction("Item",1). OlePropertyGet("Paragraphs").OlePropertyGet("Count");

Для ссылки на нужный абзац у объекта Paragraphs предусмотрен метод Item, параметр которого задает номер абзаца в выбранном документе. Чтобы получить возможность работать с фрагментом текста R, находящимся в третьем абзаце документа, можно применить оператор

R = W.OlePropertyGet("Documents").OleFunction("Item",1).OleFunction("Range", W.OlePropertyGet("Documents").OleFunction("Item",1). OlePropertyGet("Paragraphs").OleFunction("Item",3). OlePropertyGet("Range").OlePropertyGet("Start"), W.OlePropertyGet("Documents").OleFunction("Item",1). OlePropertyGet("Paragraphs").OleFunction("Item",3). OlePropertyGet("Range").OlePropertyGet("End"));

Фрагмент текста R можно копировать в буфер, удалять с запоминанием в буфере и дополнять текстом, хранящимся в буфере, с помощью соответствующих методов Copy, Cut и Paste.

Соседние файлы в папке лабы