«Машины должны работать. Люди должны думать»
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. Внедрение и связывание объектов