Шаг 224.
Создание пользовательской библиотеки

    На этом шаге мы рассмотрим создание пользовательской библиотеки.

    В предыдущих шагах мы рассмотрели свойства и методы объектов 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;

    На следующем шаге мы рассмотрим пример использования созданной библиотеки.




Предыдущий шаг Содержание Следующий шаг