Поставим задачу: создание документа
"Платежное поручение", - и определим, какие функции для этого
необходимы. Сам по себе документ "Платежное поручение" является
табличным, т.е. в определенную таблицу вписаны значения некоторых текстовых и
числовых переменных. К тому же этот документ не является многострочным. Можно
найти еще массу примеров таких документов, поэтому технология подготовки
"Платежного поручения" подойдет к большому количеству аналогичных
документов.
Одним из способов, который можно применить
для подготовки простых документов, является заполнение шаблона. Шаблон
представляет собой некоторый документ, часть которого выполнена в виде таблицы,
определенные ячейки которой заполнены наборами символов (словами). Обозначим
эти слова как переменные, вместо которых будут подставляться реальные значения
из программы в момент формирования документа. Способ с использованием
переменных удобен тем, что он позволяет легко изменить документ, не изменяя
программу формирования. Так как мы используем шаблон (подготовленный в виде
документа Word), то для работы с ним необходима функция открытия ранее
созданного документа. Функции поиска текста и перевода курсора в начало
документа необходима для поиска слов-переменных для дальнейшей замены их
реальными данными. Также может быть необходима функция задания шрифта и вывода
на печать готового документа.
Определим функцию
открытия ранее созданного документа OpenDoc. Для этого используем метод Open
коллекции Documents, которая нами уже использовалась в функции создания нового
документа. Функция Open, кроме обязательного аргумента (имени файла), может
иметь ряд дополнительных аргументов, которые определяют режим открытия. Она
возвращает ссылку на объект типа Document, но в нашем случае будем использовать
только обязательный аргумент.
Code:
Function OpenDoc (file_:string):boolean;
Var Doc_:variant;
begin
OpenDoc:=true;
try
Doc_:=W.Documents;
Doc_.Open(file_);
except
OpenDoc:=false;
end;
End;
Фрагмент из двух операторов
Code:
Doc_:=W.Documents;
Doc_.Open(file_);
можно заменить одним
W.Documents.Open(file_);
Для перевода
курсора в начало документа используем свойства End и Start объекта W.Selection.
Эту функцию необходимо использовать каждый раз перед началом поиска текста,
чтобы поиск осуществлялся с начала документа. Свойства End и Start объекта
Selection можно использовать и для выделения диапазона текста, при этом в Start
записывается номер начального символа фрагмента в тексте, а в End - номер конечного.
В данном случае необходимо в оба поля записать нули.
Code:
Function StartOfDoc:boolean;
begin
StartOfDoc:=true;
try
W.Selection.End:=0;
W.Selection.Start:=0;
except
StartOfDoc:=false;
end;
End;
Функция поиска (FindTextDoc)
фрагмента текста состоит из трех операторов. Первый и второй задают направление
поиска (от начала к концу) и фрагмент для поиска, соответственно. Третий
оператор выполняет поиск и возвращает результат. Функция возвращает True, если
поиск удачный, и False - если нет. Во всех трех операторах используем поля и
методы объекта Selection.
Code:
Function FindTextDoc (text_:string):boolean;
begin
FindTextDoc:=true;
Try
W.Selection.Find.Forward:=true;
W.Selection.Find.Text:=text_;
FindTextDoc := W.Selection.Find.Execute;
except
FindTextDoc:=false;
end;
End;
Функция FindTextDoc находит и
выделяет фрагмент текста в документе. Для того, чтобы вставить новый текст
вместо выделенного, создадим еще одну функцию. PasteTextDoc состоит из двух
операторов, удаления выделенного фрагмента и вставки нового текста с положения
курсора. Оба эти оператора используют объект Selection объекта W. Действие этой
функции отличается от SetTextToDoc тем, что она вставляет изменения вместо
выделенного фрагмента текста.
Code:
Function PasteTextDoc (text_:string):boolean;
begin
PasteTextDoc:=true;
Try
W.Selection.Delete;
W.Selection.InsertAfter (text_);
except
PasteTextDoc:=false;
end;
End;
Но более удобной
была бы функция, которая одновременно подставляла бы новый текст на место
найденного фрагмента. Создадим такую функцию.
Code:
Function FindAndPasteTextDoc
(findtext_,pastetext_:string): boolean;
begin
FindAndPasteTextDoc:=true;
try
W.Selection.Find.Forward:=true;
W.Selection.Find.Text:= findtext_;
if W.Selection.Find.Execute thenbegin
W.Selection.Delete;
W.Selection.InsertAfter (pastetext_);
endelse
FindAndPasteTextDoc:=false;
except
FindAndPasteTextDoc:=false;
end;
End;
И последнее,
печать документа. В данной части рассмотрим только процедуру активизации
диалогового окна печати. Этот диалог активизируется через метод Show объекта
Dialogs(wdDialogFilePrint).Show. С помощью объекта Dialogs можно вызвать
практически любое диалоговое окно Word'а, но об этих возможностях поговорим
позже.
Функция будет
выглядеть следующим образом:
Code:
Function PrintDialogWord:boolean;
Const wdDialogFilePrint=88;
begin
PrintDialogWord:=true;
try
W.Dialogs.Item(wdDialogFilePrint).Show;
except
PrintDialogWord:=false;
end;
End;
Имея необходимый набор функций,
можно приступать к написанию программы (процедуры) создания простого документа
Word средствами Delphi. Как говорилось ранее, для формирования документа нам
необходим шаблон - текст в формате Word (файл с расширением doc, rtf). Создадим
вручную этот файл и разместим его, например, на диске C: "C:\Шаблон
платежного поручения.doc".
Общий алгоритм
формирования документа таков:
1.
Открываем шаблон, используя функцию открытия ранее созданного
документа.
1.
Ищем слова-переменные и подставляем вместо них реальные
значения, например, из базы данных.
1.
Сохраняем документ под новым именем.
1.
Печатаем документ, если это необходимо.
1.
Закрываем документ.
Документ готов, и с ним можно работать как
обычно, копировать, переименовывать и др.
Описанный выше
алгоритм реализуем в виде небольшой программы. Для этого создаем новый проект и
переписываем все функции (также и ранее созданные в первой части статьи) в
модуль формы. Создаем на форме кнопку и в процедуру обработки ее нажатия пишем
следующий программный код.
Code:
procedure TForm1.Button2Click(Sender: TObject);
begin
if CreateWord thenbegin
VisibleWord(true);
If OpenDoc('c:\Шаблонплатежногопоручения.rtf') thenbegin
messagebox(0,'Переходим к заполнению шаблона','Шаблон открыт',0);
Данная процедура сформирует
документ и откроет окно диалога печати.
Мы сформировали простой документ, но
обычно сложные документы содержат таблицы, графики, рисунки и другие
компоненты. Все эти компоненты также можно создавать и настраивать из внешних
программ, используя объекты и коллекции объекта Application.