На этом шаге мы рассмотрим создание пользовательской библиотеки.
В предыдущих шагах мы рассмотрели свойства и методы объектов Application приложений Word и Excel. На основе этих методов были рассмотрены фрагменты приложений, позволяющих создавать и работать с документами Word и Excel, но в больших приложениях работать с объектами Application непосредственно в модулях форм не всегда удобно. Как правило, это связано с тем, что в приложении приходится вставлять и использовать код обработки ошибок или использовать несколько операторов обращения к объектам. Все это приводит к увеличению исходного текста модуля формы, что затрудняет написание сложных приложений. Решать эту проблему можно несколькими способами. Одним из таких способов является разработка и использование пользовательской библиотеки. Рассмотрим создание и использование такой библиотеки для работы приложений с документами Word.
Для создания модуля используем команду File | New | Unit главного меню Delphi (рисунок 1).
Рис.1. Создание модуля
В результате будет создан файл с расширением PAS, представляющий собой пользовательский модуль. В этом модуле пока нет ни одной функции и процедуры (рисунок 2). Модуль состоит из заголовка и секций interface и implementation.
Рис.2. Структура пользовательского модуля
Секция interface должна содержать описания заголовков процедур и функций модуля, а также переменные, которые будут доступны из других модулей. Секция implementation содержит переменные, которые не будут доступны для других модулей, и полные тексты процедур и функций.
Создадим модуль, который будет содержать необходимые функции для работы с документами Word. Заголовок этого модуля представляет собой комбинацию слов unit MSWORD, где первое является зарезервированным словом, обозначающим заголовок, а второе соответствует имени блока, которое должно совпадать с именем файла. После зарезервированного слова interface перечисляются определения типов, констант и переменных, которые могут быть доступны для других модулей, там же перечисляются и заголовки функций. Следующий исходный текст является фрагментом модуля, в который входят заголовок и секция interface. Создадим в модуле несколько функций для работы с MS Word и опишем заголовки этих функций в секции interface создаваемого модуля.
interface var CreatedWord:boolean; Function CreateWord:boolean; Function VisibleWord (visible:boolean):boolean; Function AddDoc(name:string):variant; Function CloseDoc(document:variant):boolean; Function CloseDocEx(document:variant;saved: boolean):boolean; Function CloseWord:boolean; Function OpenDoc(name:string):variant; Function CopyTextDocToClipboard(doc:variant) :boolean; Function ImportTextFromDoc(doc:variant):string;
Из имен функций понятно, что они предназначены для создания объекта Word.Application, визуализации окна приложения Word, создания, открытия и закрытия документа, а также для работы с текстовыми модулями.
Рассмотрим секцию implementation и функции, представленные в ней. В начале секции перечисляются библиотеки функций и процедур, используемых в создаваемом модуле, затем следует описание типов, констант и переменных, после которых идет описание процедур и функций модуля.
uses Windows,SysUtils,ComObj, Variants; var W:variant;
Особо следует отметить ссылку на библиотеку ComObj и переменную W:variant. Мы используем функцию CreateOleObject из этой библиотеки, создающую ссылку на объект Application и сохраняющую его в переменной W. Это реализуется в функции CreateWord, которая в случае удачного выполнения возвращает значение True.
Function CreateWord:boolean; //Получение ссылки на объект Application begin CreateWord:=True; CreatedWord:=True; try W:=CreateOleObject('Word.Application'); except CreateWord:=False; CreatedWord:=False; end; End;
После удачного выполнения функции переменная CreatedWord будет содержать значение True, а переменная W - ссылку на объект Application, после чего можно переходить к выполнению других функций.
Рассмотрим следующие функции для работы с MS Word, например функцию для визуализации окна Word.
Function VisibleWord(Visible:boolean):boolean; //Визуализация окна приложения Word begin VisibleWord:=True; try W.Visible:= Visible; except VisibleWord:=False; end; End;
Данная функция, используя свойство Visible объекта Application, позволяет скрыть или отобразить окно приложения Word. В случае успешного выполнения она возвращает значение True, при возникновении исключительной ситуации ошибка обрабатывается и функция возвращает значение False.
Для создания нового документа или открытия существующего документа, сохраненного в файле, используем функции, возвращающие ссылку на созданный или открытый документ.
Function AddDoc(name:string):variant; //Создание документа var Docs:variant; begin AddDoc:=null; try Docs:=W.Documents; AddDoc:=Docs.Add(name); except AddDoc:=null; end; End;
В представленной функции переменная Docs:variant используется для доступа к коллекции документов. После того как в нее была записана ссылка на коллекцию Documents, мы имеем возможность обращаться к свойствам коллекции через эту переменную.
Для открытия документа, созданного ранее и сохраненного в файле, используем следующую функцию.
Function OpenDoc(name:string):variant; //Открытие существующего документа var Docs:variant; begin OpenDoc:=True; try Docs:=W.Documents; OpenDoc:=Docs.Open(name); 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),
Function ImportTextFromDoc(doc:variant):string; //Импорт текста из документа Word 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;
Function CloseWord:boolean; //Закрытие приложения Word begin CloseWord:=True; try W.Quit; W:=UnAssigned; except CloseWord:=False; end; End;
На следующем шаге мы рассмотрим пример использования созданной библиотеки.