

| стрелялки |
| спорт |
| драки |
| стратегии |
| гонки |
| логические |
| азартные |
| аркады |
| эротические |
| фильмы онлайн |
| Сотрудничество с Microsoft Office |
|
Перед изложением материала, посвященного работе с программами из состава пакета Microsoft® Office, а точнее о применении технологии автоматизации (OLE-automation), реализованной в приложениях офиса, приведу несколько оговорок относительно предлагаемой далее информации. Во-первых, я предполагаю, что вы уже ознакомились с технологией COM, поэтому в этой главе вполне сознательно пропускается довольно серьезный пласт информации о самой технологии автоматизации, представляющей собой логическое развитие COM. Считайте, что это черный ящик, тем более что такое утверждение полностью соответствует концепции автоматизации. На первых порах нам достаточно знать, что приложение, предоставляющее свои программируемые объекты, называется сервером автоматизации (automation server). В нашем случае в роли серверов будут выступать программы Microsoft® Word и Microsoft® Excel. В свою очередь приложение, получающее в свое распоряжение объекты автоматизации, именуют контроллером автоматизации (automation controller). Разработке этих контроллеров мы и посвятим основную часть данной главы. В отличие от своего сурового родственника COM-сервера (допускающего обращение к методам COM-объектов только через указатели на интерфейс), более доброжелательная технология автоматизации разрешает программисту вызывать методы по их именам. Благодаря этой чудесной особенности OLE-automation может использоваться даже в языках программирования, не умеющих работать с указателями. Во-вторых, контроллер автоматизации способен распоряжаться объектами сервера независимо от языка, применяемого для разработки этих компонентов, поскольку для управления своими программируемыми объектами сервер автоматизации предоставляет контроллеру некий интерфейс, построенный на основе IDispatch. По сути, объект автоматизации - это обычный COM-объект, в котором реализован этот интерфейс. Посредством интерфейса IDispatch программист получает доступ к макроязыку Microsoft® Office. В-третьих, синтаксис описываемых свойств и методов является чем-то вроде моего перевода с языка Basic for application на Object Pascal и никоим образом не претендует на академичность. Например, мы привыкли, что в Delphi перед названием класса ставится символ «T» (TObject, TForm, TEdit). По аналогии с этим соглашением в этой главе при описании свойств и методов перед названием объекта из состава Office будет ставиться префикс «I» (IAppli-cation, ITable, IFont и т. д.). Это сделано для того, чтобы вы не путали объекты Microsoft® Office с классами библиотеки VCL. Кроме того, символ «I» (Interface) будет напоминать о том, что мы работаем с интерфейсом объекта. И еще одно примечание, касающееся специфики передачи значений параметров в процедуры и функции Basic. В методах Basic for application различают обязательные (required) и необязательные (optional) параметры. Обязательные параметры, как и в языке Pascal, всегда должны присутствовать при вызове метода. А вот работа с необязательными аргументами для программиста в среде Delphi несколько необычна. Предположим, что существует некая гипотетическая функция InsertFile(), предназначенная для вставки файла в документ Office: function InsertFile(FileName : string; [Range : Variant; ConfirmConversions, Link : Boolean; Attachment : Variant]): Variant; В этом методе первый параметр, указывающий имя вставляемого файла, является обязательным, а остальные четыре - необязательные. Если программист к ним не обратился, им будут присвоены значения по умолчанию. В простейшей ситуации вызов данного метода ничем не отличается от привычного нам вызова метода в среде Delphi: InsertFile('C:\File.txt'); //передается только обязательный параметр Но если мы хотим передать какие-то данные в необязательные параметры, то сталкиваемся с непривычным синтаксисом: InsertFile(FileName:= 'C:\File.txt', ConfirmConversions :=False, Link:=True); ОПри обращении к необязательному параметру метода сначала указывается имя параметра, а затем присваивается соответствующее значение. Например: DemoFunction(Param1:=True); |
