Создание и открытие документа Word

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

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

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

 

WordApplication1.Connect;

 

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

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

Свойство ConnectKind определяет, как именно осуществляется соединение с сервером. Значения этого свойства приведены в табл. 3.

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

 


Таблица 3

Значения свойства ConnectKind

ckRunningOrNew Подсоединиться к выполняющемуся серверу или создать новый экземпляр сервера
ckNewInstance Всегда создавать новый экземпляр сервера
ckRunningInstance Только подсоединиться к выполняющемуся серверу
ckRemote Подсоединиться к удаленному серверу. Эта опция должна сочетаться с заданием свойства RemoteMachineName
ckAttachToInterface Не подсоединяться к серверу. Вместо этого приложение обеспечивает интерфейс методом ConnectTo. Опция не может использоваться совместно с установкой в свойства AutoConnect

 

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

 

Uses ComObj;

. . .

procedure TForm1.Button1Click(Sender: TObject);

begin

 

try

WordApplication1.Connect;

except

On EOleSysError do

begin

Application.MessageBox('На компьютере нет выполняющего в данный момент Word',

'Приложение будет закрыто', MB_OK+MB_ICONEXCLAMATION);

Application.Terminate;

end;

end;

end;

 

Приведенный код перехватывает исключение EOleSysError и выдает пользо­вателю соответствующее сообщение. Только не забудьте вставить в приложение приведенный выше оператор uses, подключающий модуль comobj, в котором объ­явлено исключение EOleSysError. Автоматически этот модуль не подключится.

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

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

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

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

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

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

Мы не рассмотрели пока значение ConnectKind равное ckAttachToInterface. Для таких серверов, как WordApplication, оно не применимо.

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

 

WordApplication1.Visible:=true;

 

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

 

WordApplication1.Disconnect;

 

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