Форма печати объекта предназначена для вывода на печать некоторой, определяемой разработчиком информации. Для создания форм печати используется базовая форма печати (суперкласс), компоненты библиотеки 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.