Применение объекта Engine

 Мы уже упоминали, что объект Engine представляет собой движок отчета, управляющий построением отчета. Используя свойства и методы движка, можно управлять процессом размещения бэндов на странице. Для начала – немного теории.

 

 На рисунке ниже представлено изображение страницы отчета и название свойств, которые возвращают то или иное измерение страницы.

_img257

 

 Страница имеет физические размеры PaperWidth, PaperHeight. Эти размеры соответствуют одноименным свойствам страницы, что видны в инспекторе объектов при выборе страницы. Так, страница формата А4 имеет размеры 210х297мм.

 

 Параметры PageWidth, PageHeight определяют размер области печати, которая почти всегда меньше физических размеров страницы. Размер обрасти печати определяют поля страницы, которые задаются свойствами страницы отчета LeftMargin, TopMargin, RightMargin, BottomMargin. Размер области печати в пикселах возвращают свойства Engine.PageWidth, Engine.PageHeight.

 

 Наконец, параметр FreeSpace определяет высоту свободного места на странице. Если на странице есть бэнд "Подвал страницы" (Page Footer), его высота учитывается при вычислении FreeSpace. Этот параметр в пикселах возвращает функция Engine.FreeSpace. Следует учесть, что после вывода очередного бэнда свободное место на странице уменьшается, что учитывается при вычислении FreeSpace.

 

 Как происходит формирование страниц готового отчета? Ядро FastReport выводит бэнды на страницу до тех пор, пока на ней остается свободное место, достаточное для вывода бэнда. Когда свободного места не остается, печатается бэнд "Подвал страницы" (если он есть) и формируется новая пустая страница. Как уже говорилось, после вывода очередного бэнда высота свободного места уменьшается. Кроме того, вывод очередного бэнда начинается с текущей позиции, которая определяется координатами по оси X и Y. Эта позиция возвращается в свойствах Engine.CurX, Engine.CurY. После печати очередного бэнда позиция CurY автоматически увеличивается на высоту напечатанного бэнда. После формирования новой страницы позиция CurY = 0. Позиция CurX изменяется при печати многоколоночных отчетов.

 

 Свойства Engine.CurX, Engine.CurY доступны не только для чтения, но и для записи. Это значит, что можно смещать бэнды вручную, используя одно из подходящих событий. Например, имея отчет следующего вида:

 

clip0187

 

можно напечатать его таким образом:

 

_img259

 

 

Это результат работы скрипта, назначенного событию OnBeforePrint  бэнда:

 

PascalScript:

 

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);

begin

 Engine.CurX := Engine.CurX + 5;

end;

 

C++ Script:

 

void MasterData1OnBeforePrint(TfrxComponent Sender)

{

 Engine.CurX = Engine.CurX + 5;

}

 

 Манипуляция свойством CurY позволяет, например, напечатать бэнды внахлест:

 

_img260

 

Соответствующий скрипт:

 

PascalScript:

 

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);

begin

 Engine.CurY := Engine.CurY - 15;

end;

 

C++ Script:

 

void MasterData1OnBeforePrint(TfrxComponent Sender)

{

 Engine.CurY = Engine.CurY - 15;

}

 

 Метод Engine.NewPage позволяет вставлять разрыв страницы в нужном месте отчета. При этом печать продолжается с новой страницы. Так, в нашем примере, можно вставить разрыв после печати второй записи:

 

PascalScript:

 

procedure MasterData1OnAfterPrint(Sender: TfrxComponent);

begin

if <Line> = 2 then

   Engine.NewPage;

end;

 

C++ Script:

 

void MasterData1OnAfterPrint(TfrxComponent Sender)

{

if (<Line> == 2)

   Engine.NewPage();

}

 

 Обратите внимание – теперь мы делаем это в событии OnAfterPrint, т.е. после того, как бэнд уже напечатан. Служебная переменная Line, напомним, возвращает порядковый номер записи.

 

 Метод Engine.NewColumn вставляет разрыв колонки в многоколоночном отчете. После последней колонки этот метод формирует новую страницу.