В предыдущих главах мы рассмотрели свойства и методы объектов
Application приложений Word и Excel. На основе этих методов были рас-
смотрены фрагменты приложений, позволяющих создавать и работать с до-
кументами Word и Excel, но в больших приложениях работать с объектами
Application непосредственно в модулях форм не всегда удобно. Как правило,
это связано с тем, что в приложении приходится вставлять и использовать
код обработки ошибок или использовать несколько операторов обращения
к объектам. Все это приводит к увеличению исходного текста модуля фор-
мы, что затрудняет написание сложных приложений. Решать эту проблему
можно несколькими способами. Одним из таких способов является разра-
ботка и использование пользовательской библиотеки. Рассмотрим создание и
использование такой библиотеки для работы приложений с документами
Word.
Для создания модуля используем команду File > New главного меню Delphi,
в результате выполнения которой откроется диалоговое окно выбора типа
создаваемого объекта (рис. 17.1).
В этом окне выбираем тип создаваемого объекта Unit, в результате чего бу-
дет создан файл с расширением PAS, представляющий собой пользователь-
ский модуль. В этом модуле пока нет ни одной функции и процедуры
(рис. 17.2). Модуль состоит из заголовка и секций interface и implementation.
Рис. 17.1. Диалоговое окно выбора типа создаваемого объекта
Рис. 17.2. Структура пользовательского модуля
Секция interface должна содержать описания заголовков процедур и функ-
ций модуля, а также переменные, которые будут доступны из других моду-
лей. Секция implementation содержит переменные, которые не будут дос-
тупны для других модулей, и полные тексты процедур и функций.
Создадим модуль, который будет содержать необходимые функции для ра-
боты с документами Word. Заголовок этого модуля представляет собой ком-
бинацию слов "unit MSWORD", где первое является зарезервированным
словом, обозначающим заголовок, а второе соответствует имени блока, ко-
торое должно совпадать с именем файла. После зарезервированного слова
interface перечисляются определения типов, констант и переменных, кото-
рые могут быть доступны для других модулей, там же перечисляются и за-
головки функций. Следующий исходный текст является фрагментом моду-
ля, в который входят заголовок и секция interface. Создадим в модуле не-
сколько функций для работы с MS Word и опишем заголовки этих функций
в секции interface создаваемого модуля.
Заголовок и секция interface создаваемого модуля
unit MSWORD;
interface
var CreatedWord:boolean;
Function CreateWord:boolean;
Function VisibleWord(visible:boolean):boolean;
Function AddDoc(file_:string):variant;
Function CloseDoc(document:variant):boolean;
Function CloseDocEx(document:variant;saved_:boolean):boolean;
Function CloseWord:boolean;
Function OpenDoc(file_:string):variant;
Function CopyTextDocToClipboard(doc_:variant):boolean;
Function ImportTextFromDoc(doc_:variant):string;
Из имен функций понятно, что они предназначены для создания объекта
Word.Application, визуализации окна приложения Word, создания, открытия
и закрытия документа, а также для работы с текстовыми модулями.
Рассмотрим секцию implementation и функции, представленные в ней.
В начале секции перечисляются библиотеки функций и процедур, исполь-
зуемых в создаваемом модуле, затем следует описание типов, констант и
переменных, после которых идет описание процедур и функций модуля.
Секция implementation модуля
implementation
uses Windows,Sysutils,ComObj;
var W:variant;
Особо следует отметить ссылку на библиотеку ComObj и переменную
Wrvariant. Мы используем функцию CreateOleObject из этой библиотеки,
создающую ссылку на объект Application и сохраняющую его в перемен-
ной W. Это реализуется в функции CreateWord, которая в случае удачного
выполнения возвращает значение True.
Получение ссылки на объект Application
Function CreateWord:boolean;
begin
CreateWord:=True;
CreatedWord:=True;
try
W:=CreateOleObject('Word.Application1);
except
CreateWord:=False;
CreatedWord:=False;
end;
End;
После удачного выполнения функции переменная CreatedWord будет со-
держать значение True, а переменная W — ссылку на объект Application,
после чего можно переходить к выполнению других функций.
Рассмотрим следующие функции для работы с MS Word, например функ-
цию для визуализации окна Word.
Визуализация окна приложения Word
Function VisibleWord(Visible:boolean):boolean;
begin
VisibleWord:=True;
try
W.Visible:= Visible;
except
VisibleWord:=False;
end;
End;
Данная функция, используя свойство Visible объекта Application, позволяет
скрыть или отобразить окно приложения Word. В случае успешного выпол-
нения она возвращает значение True, при возникновении исключительной
ситуации ошибка обрабатывается и функция возвращает значение False.
Для создания нового документа или открытия существующего документа,
сохраненного в файле, используем функции, возвращающие ссылку на соз-
данный или открытый документ.
Создание документа
Function AddDoc(file_:string):variant;
Var Docs_:variant;
begin
AddDoc:=null;
try
Docs_:=W.Documents;
AddDoc:=Docs_.Add(file_);
except
AddDoc:=null;
end;
End;
В представленной функции переменная Docs_:variant используется для дос-
тупа к коллекции документов. После того как в нее была записана ссылка
на коллекцию Documents, мы имеем возможность обращаться к свойствам
коллекции через эту переменную.
Для открытия документа, созданного ранее и сохраненного в файле, ис-
пользуем следующую функцию.
Открытие существующего документа
Function OpenDoc(file_:string):variant;
Var Docs_:variant;
begin
OpenDoc:=True;
try
Docs_:=W.Documents;
OpenDoc:=Docs_.Open(file_);
except
OpenDoc:=null;
end;
End;
Эта функция возвращает ссылку на элемент коллекции документов, т. е. на
документ. Используя эту ссылку, мы получаем доступ к самому документу.
Следующая функция, используя ссылку на документ, копирует его содер-
жимое в буфер обмена.
Копирование содержимого документа в буфер обмена
Function CopyTextDocToClipboard(doc_:variant):boolean;
begin
CopyTextDocToClipboard:=True;
try
doc_.Range.Select;
W.Selection.Copy;
except
CopyTextDocToClipboard:=False;
end;
End;
Для того чтобы выполнить обратное действие и вставить текст из буфера
обмена в документ, нужна другая функция, использующая метод Paste, ко-
торый вставляет информацию из буфера обмена в документ. Примеры ис-
ходного текста, реализующего обмен информации с буфером обмена, мож-
но найти в приложениях на сопроводительном компакт-диске книги.
Обмен информации непосредственно между документом и приложением
Delphi можно организовать, воспользовавшись другим способом, реализо-
ванным в следующей функции (эта функция возвращает строку текста, им-
портированную из документа Word).
Импорт текста из документа Word
Function ImportTextFromDoc(doc_:variant):string;
begin
ImportTextFromDoc:='';
try
ImportTextFromDoc:=doc_.Range.Text;
except
ImportTextFromDoc:='';
end;
End;
После окончания работы с документом необходимо его закрыть, а также
закрыть приложение Word. Используем для этого следующие функции.
Функцию закрытия документа можно реализовать двумя способами: за-
крыть документ, если он был до этого сохранен (первый вариант), или со-
хранить документ в момент его закрытия; закрыть документ без сохранения
(второй вариант).
Закрытие документа
Function CloseDoc(document:variant):boolean;
begin
CloseDoc:=True;
try
document.Close;
except
CloseDoc:=False;
end;
End;
Function CloseDocEx(document:variant;saved_:boolean):boolean;
begin
CloseDocEx:=True ;
try
document. Close (saved__) ;
except
CloseDocEx:=False;
end;
End;
После закрытия документов закрываем приложение Word и освобождаем
память компьютера. Для освобождения памяти компьютера используем
оператор:
W:=UnAssigned;
Закрытие приложения Word
Function CloseWord:boolean;
begin
CloseWord:=True;
try
W.Quit;
W:=UnAssigned;
except
CloseWord:=False;
end;
End;
Используя перечисленные функции, которые собраны в модуле, сформиру-
ем простой документ на основе шаблона — текст на почтовом конверте.
Следующая процедура формирует этот документ.
Создание документа на основе шаблона
procedure TForm1.ButtonlClick(Sender: TObject);
begin
// Создаем новый документ по шаблону
document:=AddDoc(ExtractFileDir(Application.ExeName)+
'\Шаблон конверта.dot');
messagebox(handle,'Шаблон почтового конверта создан!','Внимание!',О);
// Подставляем адрес
FindAllAndPasteTextDoc(document,'###индекс&','350049');
FindAllAndPasteTextDoc(document, '###адрес&',
'Краснодар, ул. Севастопольская, д. 3, кв. 123');
FindAllAndPasteTextDoc(document,'###получатель&',
'Иванов Иван Иванович');
// Обратный адрес
FindAllAndPasteTextDoc(document,'###обратный индекс&','198005');
FindAllAndPasteTextDoc(document,'###обратный адрес&',
'Санкт-Петербург, Измайловский пр., д. 29, кв. 111');
FindAllAndPasteTextDoc(document,'###отправитель&',
' Петрова Светлана Ивановна');
end;
Мы создали, а затем и использовали в своем приложении библиотеку про-
цедур и функций, позволяющую работать с документами Word. Аналогич-
ным образом создается библиотека для работы с рабочими книгами Excel.
Исходные тексты этих библиотек представлены в приложении на сопрово-
дительном компакт-диске книги. Их можно легко модифицировать и ис-
пользовать под свои задачи. Далее рассмотрим создание динамической биб-
лиотеки DLL на базе созданного модуля. |