Глава 6. Создание форм печати объектов


Основные сведения

Форма печати объекта предназначена для вывода на печать некоторой, определяемой разработчиком информации. Для создания форм печати используется базовая форма печати (суперкласс), компоненты библиотеки Quick Report 2.0 (рекомендуется версия 2.0К) и процедуры БД для извлечения необходимых данных.

Все формы печати объединяются в библиотеке DLL, создаваемой и сопровождаемой в виде отдельного Delphi-DLL-проекта (проект, как правило, находится в каталоге \SYSTEM\PrnForms\prnforms.dpr). Результирующая DLL также имеет название prnforms.dll и для использования EXE-модулем ONTARIO1 должна находиться с ним в одном каталоге. Объединение форм в едином Delphi-DLL-проекте вызвано накладными расходами при генерации кода DLL, включающего в себя повторяющиеся объемные фрагменты VCL.

Некоторая избыточность и повторяемость кода в интерфейсной DLL-процедуре печати формы объясняется историческими причинами невозможности экспорта из DLL классы в Delphi 2 (только процедуры и функции).

Создание новой формы печати

Для создания новой формы печати необходимо в проекте prnforms создать новую форму, наследуемую от BasePrint. Далее форма наполняется элементами Quick Report и процедурами БД извлечения данных. На заключительном этапе необходимо объявить интерфейсную процедуру, по имени которой EXE-модуль будет инициализировать саму печать. Вот пример интерфейса для формы печати приходной накладной (InInvPrt.pas):

interface
. . .
procedure InInvPrint( hAppHandle: THandle; Database: TDatabase; DBOInfo: TDBOInfo );
. . .
implementation
. . .
// экспортируемая процедура печати данной формы
procedure InInvPrint( hAppHandle: THandle; Database: TDatabase; DBOInfo: TDBOInfo );
var
  frmPrint: TfrmDBOInInvPrint;
begin
  try
    Application.Handle := hAppHandle;
    frmPrint := TfrmDBOInInvPrint.Create( Application );
    if ( frmPrint.InitDatabase( Database ) ) then begin
      frmPrint.InitDataEnvironment( DBOInfo );
      frmPrint.qrReport.Preview;
    end;
  finally
    frmPrint.Free;
  end;
end;

В других формах печати должно измениться лишь название интерфейсной процедуры и класса формы печати, тело же ее необходимо оставлять без изменений.

Когда форма для объекта первоначально создается, то в Delphi-EXE-проекте ONTARIO1, в файле определения соответствующего
класса объекта БД (DBO?????.pas) необходимо переопределить виртуальный метод Print следующим образом (пример для того же класса объекта):

procedure TDBOInInv.Print;
begin
  PrintProcName := 'InInvPrint';
  inherited Print;
end;

На этом разработка формы в пределах Delphi-EXE-проекта ONTARIO1 завершается и все дальнейшие изменения уже созданной формы вносятся только в DLL. При необходимости версии DLL заменяются без перекомпиляции основного исполняемого файла простым обновлением файла
библиотеки в каталоге приложения.

Ограничения

При использовании механизма динамически загружаемой DLL в сочетании с библиотекой QuickReport при печати под управлением Windows 95 может происходить зависание клиентского приложения. Эта ошибка документирована в списке фирмы-разработчика QuickReport. Чтобы избежать подобных проблем необходимо осуществлять работу с БД и печать в сети только на протоколе TCP/IP.


Содержание Глоссарий Предыдущая Следующая