Пятница, 17.05.2024, 14:19
Главная Регистрация RSS
Приветствую Вас, Гость
Главная » Delphi и Microsoft Office » Подключение в приложение и активизация серверов СОМ. Часть 5
08:24

Подключение в приложение и активизация серверов СОМ. Часть 5

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

WordApplicationl.Disconnect;

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

procedure TForm41.FormCreate(Sender: TObject); 
begin
WordApplicationl.ConnectKind := ckNewInstance;
WordApplicationl.AutoQuit := true;
WordApplicationl.Visible := true; // если надо сделать видимым
end;

Если вы не используете компонент сервера, а создаете объект сервера программно, все это может быть организовано следующим образом:

uses ..., WordXP, OleServer; 
...
var WordApplicationl: TWordApplication;
procedure TForml.FormCreate(Sender: TObject);
begin
WordApplicationl := TWordApplication.Create (self);
WordApplicationl.ConnectKind := ckNewInstance;
WordApplicationl.AutoQuit := true;
WordApplicationl.Visible:=true; // если надо сделать видимым
end;

procedure TForml.FormDestroy(Sender: TObject);
begin
WordApplicationl.Free;
end;

В этом примере в обработчике события формы OnCreate создается объект сервера WordApplicationl. Его свойство ConnectKind задается равным ckNewInstance, что обеспечивает создание нового экземпляра Word, гарантируя неприкосновенность того экземпляра Word, который может быть уже открыт на компьютере и в котором идет работа с каким-то документом. Этот оператор должен быть первым из операторов, обращающихся к свойствам или методам сервера. Дело в том, что первый же такой оператор устанавливает соединение с программой Word. И если в этом операторе не задается требуемое значение ConnectKind, то соединение будет осуществлено при значении ckRunningОrNew, принятом по умолчанию. После этого уже будет поздно задавать иное значение ConnectKind.

Свойство AutoQuit в приведенном коде устанавливается в true, что обеспечивает автоматическое закрытие Word при завершении приложения. Далее можно было бы осуществить связь с созданным экземпляром Word оператором:

WordApplicationl.Connect; 

Но это излишне, так как связь устанавливается автоматически при обращении к любому свойству или методу сервера. А в данном примере это обращение уже было.

В заключение в приведенном примере свойство сервера Visible задается равным true. Это надо делать, если по условиям задачи пользователь должен видеть окно Word. Если же работа с Word должна проводиться «за кадром», этот оператор не нужен.

В обработчике события формы OnDestroy освобождается память, выделенная под объект сервера. Если бы не было ранее задано значение true для свойства AutoQuit, то при закрытии формы надо было бы выполнить оператор

WordApplicationl.Disconnect; 
закрывающий использованный экземпляр Word, если, конечно, его надо закрывать.

Аналогично включается в приложение сервер Excel класса TExcelApplication. Пусть вы хотите обеспечить соединение сервера с новым экземпляром Excel в момент запуска приложения и обеспечить автоматическое завершение Excel при завершении приложения. Если вы реализуете это с помощью компонента-сервера Excel, вы должны перенести на форму со страницы библиотеки Servers компонент ExcelApplication. Можете не задавать никаких его свойств, а в обработчик события OnCreate формы поместить операторы:

procedure TForml.FormCreate(Sender: TObject); 
begin
// Обеспечивается подключение к новому экземпляру Excel
ExcelApplicationl.ConnectKind := ckNewInstance;
ExcelApplicationl.AutoQuit := true;
// если надо сделать видимым
ExcelApplicationl.Visible[LOCALE_USER_DEFAULT] := true;
end;

Первые операторы, задающие свойства ConnectKind и AutoQuit, не отличаются ни по виду, ни по смыслу задаваемых свойств от рассмотренного для сервера Word. А последний оператор, делающий видимым окно Excel, отличается наличием аргумента, передаваемого в Visible. Дело в том, что свойство Visible объявлено следующим образом:

property Visible[lcid: Integer]: WordBool; 

Аргумент lcid — это идентификатор локализации LCID. Его значение всегда заключается в квадратные скобки. Вообще говоря, для большинства версий Windows можно задавать LCID = 0. Но, пожалуй, надежнее задавать этот идентификатор равным LOCALE_SYSTEM_DEFAULT или LOCALE__USER_DEFAULT — идентификатором локализации системы или текущего пользователя. Очень многие свойства и методы серверов Excel, реализованных в Delphi, требуют задания LCID. Так что если вы видите среди параметров или аргументов метода lcid, следует задать его равным одной из указанных констант.

Вариант программного создания сервера без использования компонента выглядит так:

uses ..., OleServer, ExcelXP; 
...
var ExcelApplicationl: TExcelApplication;
procedure TForml.FormCreate(Sender: TObject);
begin
// Создание объекта
ExcelApplicationl := TExcelApplication.Create(Self);
// Обеспечивается подключение к новому экземпляру Excel
ExcelApplicationl.ConnectKind := ckNewInstance;
ExcelApplicationl.AutoQuit := true;
// если надо сделать видимым
ExcelApplicationl.Visible[LOCALE_USER_DEFAULT] := true;
end;
Категория: Delphi и Microsoft Office | Просмотров: 1485 | Добавил: PeKpyT | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]