Свойства и методы сервера Word

 

Теперь посмотрим, что собой представляет сервер. Любой сервер СОМ — это объект, имеющий множество свойств, методов и реагирующий на какие-то события. В этом отношении он ничем не отличается от любого объекта Delphi. Многие из свойств сервера СОМ в свою очередь являются объектами со сво­ими методами и свойствами. Описание сервера СОМ, как правило, можно найти в его встроенной справке. Например, чтобы разобраться в Word как в объекте, надо посмотреть встроенную в него справку. Для этого следует выполнить в Word команду ? | Вызов справки и в открывшейся справке на странице Содержание вы­брать раздел Справка по Visual Basic (для версий, младше Word 97, раздел назван WordBasic Reference). Изложение в справке ведется на основе языка Visual Basic, a для младших версий Word — на подмножестве этого языка WordBasic.

Обращение к свойствам объекта WordApplication, инкапсулирующего объект Application (этот объект является самим выполняющимся экземпляром Word), производится так же, как к свойствам любого объекта Delphi. Например, в Application имеется свойство Options – опции, являющееся в свою очередь объектом со множеством свойств. Среди этих свойств есть CheckSpellingAsYouType и CheckGrammarAsYouType — булевы свойства, указывающие, должен ли Word автома­тически проверять синтаксис и грамматику и отмечать в тексте ошибки. Такая проверка замедляет работу Word. Если вы хотите отключить в сервере эти автома­тические проверки, введите в приложение операторы:

 

WordApplication1.Options.CheckSpellingAsYouType:=False;

WordApplication1.Options.CheckGrammarAsYouType:=False;

 

Тем самым вы отключите автоматические проверки, тем более, что в случае, если Word невидим и работает «за кадром», то эти проверки совершенно бессмыс­ленны.

Среди множества свойств Application следует отметить свойство ActiveDocument — активный документ. Практически всегда при работе с сервером Word вам приходится иметь дело со свойством Documents. Это свойство представляет собой собрание всех документов, открытых в Word в данный момент. Каждый документ представлен в этом собра­нии как объект Document, имеющий в свою очередь собственные свойства и мето­ды. Общее число открытых документов определяется свойством Count собрания документов Documents. Это свойство только для чтения часто приходится проверять, чтобы узнать, есть ли в Word хотя бы один открытый документ. Например, если в вашем приложении предусмотрены действия ASave, APrint и Apreview, обеспечивающие сохранение, печать и предварительный просмотр документа, то их, очевидно, надо делать доступными, если ни одного документа в Word нет.

Создание нового документа Document и включение его в Documents осуществляется методом Add объекта Documents. В этот метод можно передать два аргумента Template и NewTemplate. Аргумент Template указывает шаблон, который используется при создании документа. Если этот аргумент не указан, то документ на основе шаблона Обычный (Normal). Аргумент NewTemplate булева типа определяет, открывается ли документ. По умолчанию NewTemplate=false, т.е. открывается обычный документ.

При вызове из Delphi любого метода сервера СОМ аргументы (кроме аргумента типа Text) передаются только как объекты типа OleVariant. Если какие-то аргументы не являются обязательными, то все равно они должны фигурировать в вызове метода. Только вместо их значений может быть указана EmptyParam – переменная типа OleVariant, используемая вместо необязательных параметров. Эта переменная объявлена в модуле System.


Таким образом, если вы хотите создать новый документ на основе обычного шаблона, вы можете написать следующий оператор:

 

WordApplication1.Documents.Add(EmptyParam, EmptyParam);

 

Но если вы хотите создать документ на основе своего шаблона C:\MyTemplate\My.dot, то код будет сложнее:

 

Var

NewTemplate: OleVariant;

. . .

Template:= ‘C:\MyTemplate\My.dot’;

WordApplication1.Documents.Add(Template, NewTemplate);

 

А если требуется создать документ как новый шаблон на основе обычного шаблона, то код будет таким:

 

Var

NewTemplate: OleVariant;

. . .

NewTemplate:= true;

WordApplication1.Documents.Add(EmptyParam, NewTemplate);

 

Ошибки при вызове WORD

 

Теперь рассмотрим проблемы, которые встречаются при работе с WORD.

1. Если установить WORD и попытаться сразу связаться с ним через Ole, то ничего не получится, дело в том, что при первом запуске WORD программа предлагает напечатать тестовую страницу, при этом никак не сообщив об этом Ole клиенту. Из-за чего в работе вашей программы может происходить сбой. И исправлению эта ошибка не подлежит, данная неприятность - дело рук компании MICROSOFT, создавшей WORD, и пока она эту проблему решать не собирается, как видно из WORD XP.

2. Ещё может быть ситуация, когда открываемый WORD файл уже занят другим приложением или копией вашего, тогда WORD предлагает использовать режим только для чтения, а по освобождению ресурса предлагает переход в возможность редактирования. Это тоже влияет на работу клиентской программы, поскольку требует от пользователя согласия на изменение режимов.

3. Файл, который вы открываете, просто не существует. Эту проблему вам придётся решать средствами языка разработки. WORD подобные сервисы не предоставляет.

4. На используемой машине не хватает памяти. Ответ на этот вопрос смотрите в пункте 3.

 

3.5. Создание отчётов в WORD (различные подходы)

 

Существует несколько подходов создания нестандартных отчётов в WORD, используя OLE технологии, рассмотрим их по порядку:

 

1. Это стандартный подход. Клиент делает запрос, сервер выполняет, клиент делает следующий запрос и так далее, пока задача не будет решена.

2. Можно использовать встроенный в WORD язык VBA, написать необходимые макросы на Visual Basic Script и внедрить их в текущий документ, тогда останется только вызывать их и всё. За счёт этого можно реально выиграть во времени, но волею случая этот метод в основном используется в компьютерных вирусах, за счёт чего относится к вирусным технологиям и из-за этого некоторые антивирусы могут определять вашу программу как инфицированную WORD вирусом. Поэтому данный метод так и не получил распространения среди Ole программ.

3. Третий метод - самый важный, а заключается он в сочетании первых двух, таким образом, демонстрируя взаимное дополнение подходов.

Для воплощения любого из 3-х подходов необходимы ещё дополнительные действия. Если требуется записывать/читать с определённой позиции в тексте или необходимо работать с таблицей, то надо расставить закладки в нужных позициях документа. Это лучше всего сделать в шаблонном документе вручную. Потом надо будет найти эти закладки в тексте и перейти к ним. Для начала, напишем процедуру поиска закладки и перехода к ней.

 

procedure TForm1.Find(Sender: TObject);

var

What : OLEVariant;

Which : OLEVariant;

Count : OLEVariant;

Name : OLEVariant;

Template:OleVariant;

Rmark:OLEVariant;

begin

Template:='C:\3.doc';

WordApplication1.Documents.Add(Template,EmptyParam);

What:='Example';

WordApplication1.Visible:=true;

What := wdGoToBookmark;

Which := unAssigned;

Count := unAssigned;

Name := 'Example';

WordApplication1.Selection.GoTo_(What, Which, Count, Name);

end;

 

Теперь закладку мы нашли, запишем в то место что-нибудь:

 

Procedure Word.insert;

begin

WordApplication1.Selection.InsertAfter('Привет');

WordApplication1.Selection.Font.Bold:=2;

WordApplication1.Selection.Font.italic:=1;

end;

 

Великолепно, кроме простой записи мы получили и доступ к конфигурации текста и можем писать текст с любыми атрибутами, этого более чем достаточно для реализации программ любой степени сложности!

Теперь напишем процедуру перехода к следующей ячейке таблицы, считаем, что на первую мы перешли по закладке!

 

procedure Word.NextCell;

begin

WordApplication1.Run('NextCell');

end;

 

Таким же образом запускаются макросы WORD, только вместо NextCell надо вставить имя макроса, который хотим запустить. Важно не забывать, что через Ole можно вызывать только "свободные макросы" то есть без параметров!!! (VIRUS TECHNOLOGIES NOT FOR GAME)