Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИПОВС (2002) / Shimarik / Shimarik / Мусор.doc
Скачиваний:
14
Добавлен:
16.04.2013
Размер:
293.38 Кб
Скачать

6.4.3 Автоматизация ole

Внедрение и связывание позволяют запустить приложение, обрабатывающее соответствующий документ как единое целое. Автоматизация OLE позволяет уп­равлять этим приложением (сервером OLE), используя экспонированные им функ­ции и процедуры. Осуществляется связь с сервером функцией CreateOleObject. Приведем пример, в котором в качестве сервера используется Microsoft Word.

Пусть вы хотите создать приложение» квггорое печатало бы вам идентичные письма, адресованные различным адресатам. Это могут быть поздравления с праздниками, приглашения на какие-то мероприятия, письма деловым партнерам и т.п. Вы хотите иметь возможность написать в вашем приложении текст письма, выбрать для него атрибуты шрифта, а затем писать имена адресатов и печатать по-

лучившиеся письма или записывать их в файлы для последующей печати или пе­ресылки по электронной почте. •••

Создайте форму, включающую в себя окно редактирования Memo для ввода текста, окно редактирования Edit для ввода имени адресата, грудПу радиокнопок, определяющих пол адресата, группу радиокнопок, определяющих производимую операцию: запись в файл или печать, диалог FontDialog для выбора шрифта, диа­лог SaveDialog для задания имени сохраняемого файла и две кнопки — Шрифт для выбора шрифта и Выполнить для выполнения заданной операции. Пример работы такого приложения приведен ни рис. 6.8.

Текст приложения может иметь вид:

tinclude "ComObj.hpp" Variant W;

void _fastcall.TForml::Ins(AnsiString S)

{ . W.Exec(Procedure("Font") « Memol->Font->Name

« Memol->Font->Size); if(Memol->Font->Style.Contains(fsBold))

W.Exec(Procedure)"Bold")); : if(Memol->Font->Style.Contains(fsltalic))

W.Exec(Procedure("Italic")); W.Exec(Procedure("Insert") « (S + "\n")); }

//————————————————————————

void _fastcall TForml::ButtonlClick(TObject *Sender) { '

AnsiString s,-

W = CreateOleObject("Word.Basic") ; W.Exec(Procedure("АррЗпоФ1)); W.Exec(Procedure("FileNew") << "Normal"); if(RGSex->ItemIndex ==0)

Ins("Дорогой " + EName->Text + "!"); else Ins("Дорогая " + EName->Text +"!"); for (int i - 0; i <= Meraol->Lines->Count; i++)

Ins(Memol->Lines->Strings[i]); if (RGOp->ItemIndex ==0)

s = "Записать это письмо в файл?"; else s =."Напечатать это письмо?";

if (MessageDlg(s, mtConfirmation, TMsgDlgButtons(), « mbYes . . .

« mbNo, 0) == mrYes) If (RGOp->ItemIndex =='.0)

( . ' " ' ' if(SaveDialogl->Execute())

W.Exec(Procedure("FileSaveAs") « SaveDialogl->FileName); }

else W.Exec(Procedure("FilePrint") ); W.Exec (.Procedure ("FileCloae") « 2);

}

//—-,————————:——————;—————

void _fastcall TForml::BFontClick(TObject *Sender)

{

'if(FontDialogl->Execute() )

Memol->Font->Assign(FontDialogl->Font); ',

} : •

Рассмотрим приведенный код. В приложение необходимо внести директиву препроцессора #include "ComObj.hpp", подключающую файл ComObj.hpp, в кото­ром содержится объявление используемой далее процедуры CreateOleObject. Вво­дится переменная W типа Variant, которая будет являться ссылкой на объект сер­вера. Основная функция приложения ButtonlClick — обработчик щелчка на кноп­ке Выполнить. Ее первый выполняемый оператор

W = CreateOleObject("Word.Basic") ;

создает ссылку на объект, соответствующий Microsoft Word. При выполнении это­го оператора будет запущен Word, если он еще не был запущен к этому моменту. Последующие операторы используют метод Ехес, который выполняет процедуру или функцию OLE. Как лараметр в нее передается конструкция Procedure(S), где S — имя вызываемой процедуры WordBasic. Если в процедуру требуется передать параметры, они передаются операций «. Например, во вспомогательной, функции Ins* заносящей текст в документ Word, вы можете видеть оператор:

W.Exec(Procedure("Font") « Memol->Font->Name

. « Memol->Font->Size);

Этот оператор вызывает процедуру WordBasic Font, устанавливающую шрифт, и передает в нее два параметра: имя шрифта и его размер.

Последовательность вызываемых процедур следующая. Сначала вызывается процедура AppShow, которая делает окно Word видимым, поскольку по умолча­нию запускаемое приложение работает в фоновом режиме. Следующий оператор вызывает процедуру FileNew, которая создает новый документ. Затем следуют операторы, формирующие текст документа с учетом установок шрифта. Эти опера­торы, содержащиеся во вспомогательной функции Ins, обращаются к процедурам Font, Bold, Italic, формирующим атрибуты шрифта, и К процедуре Insert, вклю­чающей текст в документ Word.

После формирования текста следуют операторы, запрашивающие пользовате­ля о завершении операции (это дает ему возможность отказаться от печати или со­хранения файла, если он заметит в письме какие-то ошибки). Заключительные операторы завершают заданную операцию процедурами FileSaveAs или FilePrint и закрывают документ Word процедурой FileClose с параметром 2, означающим, что файл закрывается без запроса о необходимости его сохранения.

Запустите приложение, и вы увидите, что научились управлять таким мощным инструментом, как Microsoft Word. Подробное описание других процедур вы смо­жете найти в справке Word в разделе WordBasic. Одно замечание — если Word от­крыт до запуска вашего приложения, то позаботьтесь о том, чтобы он не был развер­нут на весь экран. Иначе окно Word закроет ваше приложение и его сообщения.

6.4.4 Компоненты — серверы СОМ в C++Builder 5

6.4.4.1 Компоненты — серверы в C++Builder 5

, Взаимодействие с Word, Excel и многими другими распространенными про­граммами, входящими в стандартную установку Word и Microsoft Office, может осуществляться из приложений C++Builder 5 с помощью компонентов, размещен­ных в библиотеке на странице Servers. Эти компоненты отображают множество им­портируемых серверов СОМ. Все они являются потомками своего базового класса TOleServer. В этом классе объявлены абстрактные методы и свойства, позволяю­щие устанавливать связь с сервером. Цоэтому объекты класса TOleServerg нельзя создавать непосредственно. В приложениях используются только потомки этого класса — конкретные серверы СОМ. Они создаются импортом библиотек типов, осуществляемым в среде С+-l-Builder командой Project | Import.

Серверы СОМ — компоненты страницы Servers слабо документированы во встроенной справке C++Builder. Хотелось бы хотя бы частично восполнить этот пробел. Но поскольку в рамках данной книги невозможно рассмотреть подробно все многочисленные серверы страницы Servers, ограничимся только серверами, обеспечивающими связь с Word.

Откройте новое приложение, перенесите на форму компонент WordApplicati-оп и посмотрите в Инспекторе Объектов его свойства. Их очень немного. Кроме обычных для всех компонентов Name и Tag имеется всего 4 свойства (во многих компонентах — серверах их всего 3).

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

WordApplicationl->Connect();

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

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

Свойство ConnectKind определяет, как именно осуществляется соединение с сервером. Это свойство может принимать следующие значения:

ckRunningOrNew

ckNewInstance ckRunninglnstance ckRemote

ckAttachTohiterface

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

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

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

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

По умолчанию значение ConnectKind равна ckRunningOrNew. При этом если в момент соединения имеется выполняющийся сервер (применительно к Word Ap­plication — если Word открыт), то приложение соединится именно с этим выпол­няющимся экземпляром сервера. Если же в этот момент соответствующий сервер не выполняется, то будет создан новый экземпляр сервера (в нашем случае будет осуществлен запуск Word).

Если значение CoimectKind равно ckRunningOrNew, то приложение всегда создает новый экземпляр сервера. Если значение ConnectKind равно ckRunning-Instance, то приложение всегда соединяется с выполняющимся сервером. В этом случае, если выполняющегося сервера нет, будет сгенерировано исключение EOleSysError. Поэтому при ConnectKind = ckRunninglnstance, если нет уверенно­сти, что в момент соединения на компьютере имеется выполняющийся сервер, со­единение надо осуществлять, например, так:

try

{ : WordApplicatiqnl->Connect();

• }

catch (EOleSysError&) < Application->MessageBox( . '

"На компьютере нет выполняющегося в данный момент Word", "Приложение будет закрыто", МВ_ОК + MB_ICONEXCLAMATION); Application->Terminate(); }

Приведенный код перехватывает исключение EOleSysError и выдает пользо­вателю соответствующее сообщение.

Значение ConnectKind *= ckRemote используется, если надо связаться с уда­ленным сервером. В этом случае свойство RemoteMachineName должно указывать компьютер, на котором выполняется удаленный сервер.

Таким образом, итог рассмотрения свойств, обеспечивающих подключение к серверу, можно подвести следующим образом:

• Если вам надо, чтобы ваше приложение работало с каким-то открытым доку­ментом сервера, выполняющимся в момент запуска приложения, следует за­дать ConnectKind — ckRunninglnstance

• Если, наоборот, вам надо, чтобы ваше приложение не испортило случайно ка­кой-то документ в уже выполняющемся сервере, следует задать ConnectKind = ckNewInstance

• Если вам необходимо связаться с удаленным сервером, надо задать Connect­Kind = ckNewInstance и установить соответствующее значение RemoteMachi­neName

• В остальных случаях, вероятно, целесообразно сохранять заданное по умолча­нию значение ekRunningOrNew

Мы не рассмотрели пока значение ConnectKind равное ckAttachToInterface. Для таких серверов, как Word Application, оно не применимо. Его мы рассмотрим несколько позднее.

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

,WordApplicationl->Visible = ttue;

.g?" Разрыв соединения с сервером осуществляется методом Disconnect. Кроме г'того^ таких компонентов СОМ серверов, как WordApplication, имеется свойство AutoQuit. Если установить это свойство в true, то при завершении приложения ав­томатически вызовется метод, завершающий сервер. Это свойство полезно уста-йавливать в true, если вы работаете с новым экземпляром сервера, который созда­ло ваше приложение, и после завершения приложения не требуется, чтобы пользо­ватель мог продолжать работу с сервером. Тогда можно или установить AutoQuit в true, или при завершении приложения выполнить оператор вида:

WordApplieati;onl->Disconnect О ;

Это особенно необходимо, если в процессе работы вашего приложения с серве­ром пользователь не сделал сервер видимым. Если вы не закроете соединение, то после завершения вашего приложения сервер будет по-прежнему невидим, не бу­дет отображен в полосе задач, но в действительности будет выполняться. И когда пользователь решит закрыть Windows, он неожиданно может увидеть какое-то со­общение вашего сервера — невидимки, например, запрос о сохранении файла.