«Машины должны работать. Люди должны думать»
59. Разработка клиентских приложений для MS Office
Есть три основных способа создания клиентских приложений MS Office:
1. Генерация интерфейсного модуля для сервера путем импорта библиотеки типов
2. Включение в проект требуемого сервера как компонента Delphi, например, WordApplication
3. Использование требуемого приложения MS Office как сервера автоматизации. В этом случае клиентское приложение называют контроллером автоматизации.
В чем разница между этими способами? В первых двух случаях при разработке клиентского приложения используется раннее связывание, что обеспечивает разработчику более комфортные условия, так как корректность вызовов методов сервера проверяется еще на этапе компиляции и, соответственно, облегчается отладка приложения. Достоинством третьего способа является его универсальность и языковая независимость, так как контролер автоматизации может быть реализован практически на любом из ныне распространенных языков программирования.
Рассмотрим эти три способа на простом примере создания нового файла с помощью MS Word и записи в него абзаца, состоящего из одной строки.
Использование MS Word путем импорта библиотеки типов.
Замечание. В случае использования Delphi 6 и MS Office XP импортировать библиотеку типов (Microsoft Word 10 Object Library) из файла MSWord.olb не удается: выводится сообщение «Ошибка загрузки библиотеки». Приведенный ниже пример относится к использованию Delphi 6 и MS Office 2000. |
Создадим обычное приложение, далее с помощью команды Project | Import Type Library вызовем диалог по импорту библиотеки типов. В появившемся диалоговом окне в списке библиотек типов надо выбрать Microsoft Word Object Library и с помощью кнопки Create Unit создать файл с библиотекой типов, приняв предлагаемое по умолчанию имя файла Word_TLB.pas (проект WordAppTlb).
С учетом добавления кнопки текст модуля проекта может выглядить таким образом:
unit Main;
{Использование сервера Word путем импорта библиотеки типов}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Word_Tlb, StdCtrls;
type
TMainForm = class(TForm)
RunButton: TButton;
procedure RunButtonClick(Sender: TObject);
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
Procedure TMainForm.RunButtonClick(Sender: TObject);
var
FName,TmpName,NewTmp,DocType,Visible,VFalse,VTrue,
VNull,VSNull : OleVariant;
Err : integer;
App : _Application; {интерфейс}
Begin
App:=CoWordApplication.Create; {запуск сервера MSWord и получение первого
интерфейса}
////////// готовим требуемые параметры
TmpName:='C:\WINDOWS\Application Data\Microsoft\Шаблоны\Normal.dot';
NewTmp:=false; DocType:=0; Visible:=true;
////////// создаем новый документ
App.Documents.Add(TmpName,NewTmp,DocType,Visible);
////////// изменяем каталог для последующего сохранения файла
App.ChangeFileOpenDirectory('C:\Мои документы\');{параметр этого метода
типа string, в связи с чем не можно обойтись без типа OleVariant}
////////// изменяем каталог для последующего сохранения файла
FName:='MyDoc.doc'; VFalse:=false; VNull:=0; VSNull:=''; VTrue:=true;
App.ActiveDocument.SaveAs(FName,VNull,VFalse,VSNull,VTrue,VSNull,
VFalse,VFalse,VFalse,VFalse,VFalse);
App.Selection.TypeText(OleVariant('Any text from Project with TLB'));
App.Selection.TypeParagraph;
App.ActiveDocument.Close(VTrue,VNull,VNull);
App.Quit(VTrue,VNull,VNull); {если этого не сделать, то Word не завершится}
End;
END.
Как видно из текста (единственной) процедуры, основное неудобство состоит в необходимости описания достаточно большого числа переменных типа OleVariant, так как параметры многих методов сервера Word описаны как параметры переменные. Неудобно также то, что справочной информации по методам в Delphi Help нет, а доступны лишь оперативные подсказки по именам и типам параметров.
Использование MS Word путем включения в проект компонента Delphi.
Замечание. Как и в случае импорта библиотеки типов, рассмотренном в предыдущем разделе, для MS Office XP описываемый подход не работает. Приведенный ниже пример относится к использованию Delphi 6 и MS Office 2000. |
Для реализации этого способа надо создать обычное приложение и добавить в него компонент TWordApplication (страница Servers палитры компонент).
С учетом добавления кнопки текст модуля может выглядить таким образом:
unit Main;
{Использование сервера MS Word как компонента Delphi TWordApplication}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleServer, Word2000;
type
TMainForm = class(TForm)
App: TWordApplication;
CreateDocButton: TButton;
procedure CreateDocButtonClick(Sender: TObject);
end;
var MainForm: TMainForm;
implementation
{$R *.dfm}
Procedure TMainForm.CreateDocButtonClick(Sender: TObject);
var
FName,TmpName,NewTmp,DocType,Visible,VFalse,VTrue,
VNull,VSNull : OleVariant;
Begin
TmpName:='C:\WINDOWS\Application Data\Microsoft\Шаблоны\Normal.dot';
NewTmp:=false; DocType:=0; Visible:=true;
App.Documents.Add(TmpName,NewTmp,DocType,Visible);
App.ChangeFileOpenDirectory('C:\Мои документы\');
FName:='MyDoc.doc'; VFalse:=false; VNull:=0; VSNull:=''; VTrue:=true;
App.ActiveDocument.SaveAs(FName,VNull,VFalse,VSNull,VTrue,VSNull,
VFalse,VFalse,VFalse,VFalse,VFalse);
App.Selection.TypeText(OleVariant('Any text'));
App.Selection.TypeParagraph;
App.ActiveDocument.Close(VTrue,VNull,VNull);
End;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
App.Quit;
end;
END.
Как видно из текста программы, использование сервера Word посредством включения в проект компонента очень похоже на предыдущий способ. В модуле Word2000.pas тип TWordApplication описан как класс, производный от TOleServer:
TWordApplication = class(TOleServer)
Таким образом, от программиста просто скрывается за оболочкой TWordApplication явное получение интерфейса.
Запуск сервера Word производится автоматически в момент запуска приложения, если, конечно, Word в это время не запущен. Закрывать Word надо самостоятельно, например, в методе FormClose. Однако, если Word был запущен не приложением, то метод App.Quit все равно будет пытаться завершить работу Word.
К достоинствам этого способа можно отнести тот факт, что в модуле Word2000.pas определены константы, по именам которых можно догадаться о назначении отдельных параметров методов и значениях свойств.
«58. Разработка активных форм ActiveForm»
60. Разработка клиентских приложений для MS Office как контролеров автоматизации