Библиотека программиста

«Очень важно не прерывать вопросов. Любопытство имеет свое право на существование»

Альберт Эйнштейн

Главная страница > Технология COM > 60. Разработка клиентских приложений для MS Office как контролеров автоматизации

60. Разработка клиентских приложений для MS Office как контролеров автоматизации

Клиентское приложение для любой из программ MS Office как контролер автоматизации создается достаточно просто. В качестве примера рассмотрим приложение, которое просто запускает MS Word и прекращает работу с ним. Для разработки такого приложения надо:

1. Создать обычный проект, добавить на форму две кнопки и подключить к главному модулю проекта модули ComObj и ActiveX.

2. В требуемом месте запустить копию сервера MS Word или подключиться к уже имеющейся, если таковая есть.

3. Выполнить необходимые действия с использованием объектов MS Word.

4. Закрыть приложение MS Word.

Вот пример текста главного модуля проекта Main.pas (проект WordAppAuto):

unit Main;

{Иллюстрация запуска и остановки приложения MS Word как сервера автоматизации.

В качестве базового варианта взят пример из книги "Delphi 6 и технология COM"

Любопытный факт: если запустить Word с помощью этого приложения, а затем

"вручную" воспользоваться Word для открытия и редактирования какого-нибудь

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

с предложением сохранить изменения в документе.

Код блокирования кнопок запуска и остановки Word добавлен для того, чтобы

избежать ошибок.

Для компиляции проекта надо подключить модули ComObj и ActiveX.

}

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ComObj, ActiveX, StdCtrls;

type

TMainForm = class(TForm)

StartWordButton: TButton;

StopWordButton: TButton;

procedure StartWordButtonClick(Sender: TObject);

procedure StopWordButtonClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

public

ServerIsRunning : boolean;

AppProgID : string;

App : variant;

end;

var

MainForm: TMainForm;

implementation

{$R *.dfm}

Procedure TMainForm.StartWordButtonClick(Sender: TObject);

var

unk : IUnknown;

Res : HResult;

Begin

AppProgID:='Word.Application';

ServerIsRunning:=false;

{пытаемся получить ссылку на запущенный экземпляр сервера.

Возможные возвращаемые GetActiveObject значения см. в Windows.pas}

Res:=GetActiveObject(ProgIDToClassID(AppProgID),nil,unk);

if Res=MK_E_UNAVAILABLE then {запускаем собственный экземпляр сервера}

App:=CreateOleObject(AppProgID)

else

begin {получаем ссылку на сервер}

App:=GetActiveOLEObject(AppProgID);

ServerIsRunning:=true;

end;

App.Visible:=true; {делаем Word видимым просто для контроля.

Если Word не делать видимым, то он запущен, естественно, будет, но в строке

статуса не появится}

StartWordButton.Enabled:=false;

StopWordButton.Enabled:=true;

{открываем какой-нибудь файл}

App.Documents.Open('D:\Workdir\Lit_All.doc',

EmptyParam,EmptyParam,EmptyParam,

EmptyParam,EmptyParam,EmptyParam,

EmptyParam,EmptyParam,EmptyParam);

End;

Procedure TMainForm.StopWordButtonClick(Sender: TObject);

Begin

{закрываем текущий активный документ}

App.ActiveDocument.Close; {документ можно закрыть и с помощью метода

App.Documents.Item(1).Close, где 1 - порядковый номер открытого документа}

{если сервер был запущен нами, то нам его и останавливать. Если этого

не сделать, то прекратить его работу можно будет только с помощью

менеджера задач }

if not ServerIsRunning then App.Quit;

App:=UnAssigned;

StartWordButton.Enabled:=true;

StopWordButton.Enabled:=false;

End;

Procedure TMainForm.FormCreate(Sender: TObject);

Begin

StopWordButton.Enabled:=false;

End;

END.

Как найти информацию по объектам, предоставляемым серверами MS Office?

Во-первых, это документация MSDN, а именно раздел Office Developer Documentation. Конкретные примеры программирования (на языке VBA – Visual Basic for Application) проще всего искать в файлах, соответствующих маске vba*.chm. Например, файл vbawd10.chm содержит справочную информацию по объектам сервера MS Word, а vbaxl9.chm – по MS Excel. Кстати, библиотеку типов серверов приложений MS Office можно импортировать из файлов *.olb. Например, библиотека типов Microsoft Word 2000 находится в файле MSWord9.olb.

Во-вторых, можно использовать такой сервис приложений MS Office, как запись макросов. Например, чтобы воспользоваться этим средством в MS Word, надо проделать такие операции:

1. Запустить на выполнение MS Word и включить запись макроса – Сервис/Макрос/Начать запись. В появившемся диалоговом окне можно изменить имя макроса и сферу его применения

2. Выполнить «вручную» те операции, которые необходимо запрограммировать. При этом возможно с помощью кнопок панели управления макроса приостановить или отменить запись

3. После завершения всех операций остановить запись и открыть текст макроса, например, с помощью команды Сервис/Макрос/Редактор Visual Basic. Сгенерированный текст макроса можно использовать как шаблон для записи текста программы.

Вот пример макроса с именем МойМакрос, сгенерированного при выполнении таких операций: создание нового документа, сохранение его под именем MyDoc.doc, ввод строки текста "Any text" и закрытие документа.

Sub МойМакрос ()

'

' МойМакрос Макрос

' Макрос записан 04.11.03 Victor

'

Documents.Add Template:= _

"C:\WINDOWS\Application Data\Microsoft\Шаблоны\Normal.dot",
NewTemplate:=False, DocumentType:=0

Application.Keyboard (1058)

Application.Keyboard (1033)

ChangeFileOpenDirectory "C:\Мои документы\"

ActiveDocument.SaveAs FileName:="MyDoc.doc", FileFormat:=wdFormatDocument,

LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword

:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False,

SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:=

False

Selection.TypeText Text:="Any text"

Selection.TypeParagraph

ActiveDocument.Close

End Sub

Результат «трансляции» этого макроса на язык Object Pascal выглядит так:

App.Documents.Add('C:\WINDOWS\Application Data\Microsoft\Шаблоны\Normal.dot',

False,0);

App.ChangeFileOpenDirectory('C:\Мои документы\');

App.ActiveDocument.SaveAs('MyDoc.doc',0,false,'',True,'', False, False, False,

False, False);

App.Selection.TypeText('Any text');

App.Selection.TypeParagraph;

App.ActiveDocument.Close;





<< Предыдущая статья
«59. Разработка клиентских приложений для MS Office»
Следующая статья >>
61. Внедрение и связывание объектов