«Если отладка - процесс удаления ошибок, то программирование должно быть процессом их внесения»
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. Внедрение и связывание объектов