События

 До сих пор мы рассматривали скрипты с единственной главной процедурой, которая выполняется при старте отчета. В главной процедуре можно выполнить какие-либо начальные установки, инициализировать переменные. Но для полного контроля над процессом формирования отчета этого недостаточно. Чтобы максимально гибко управлять отчетом, каждый объект отчета имеет несколько событий, которым можно назначить обработчик – процедуру из скрипта. Например, можно в обработчике, привязанном к дата-бэнду, выполнять фильтрацию записей, т.е. скрывать или показывать бэнд в зависимости от каких-либо условий.

 

 Рассмотрим процесс формирования отчета и события, которые при этом генерируются, на примере простого отчета, содержащего одну страницу, один бэнд "Данные 1 уровня" и два объекта "Текст" на бэнде:

 

clip0179

 

 В самом начале отчета, как уже говорилось, вызывается главная процедура скрипта. После этого начинается собственно процесс построения отчета. В начале отчета вызывается событие OnStartReport объекта "Отчет". Перед формированием страницы вызывается событие страницы OnBeforePrint. Это событие вызывается один раз для каждой страницы шаблона отчета (не путать со страницами готового отчета!). В нашем случае, сколько бы ни было страниц в готовом отчете – событие вызовется один раз, т.к. шаблон отчета состоит из одной страницы.

 

 Далее начинается печать дата-бэндов. Происходит это следующим образом:

1. вызывается событие бэнда OnBeforePrint;

2. вызываются события OnBeforePrint всех объектов, лежащих на бэнде;

3. все объекты заполняются данными (в нашем случае – значениями полей БД Company и Addr1), после этого вызываются события OnAfterData всех объектов;

4. происходит позиционирование объектов на бэнде (если среди них есть растягиваемые объекты) и подсчет высоты бэнда и его растягивание (если бэнд растягиваемый);

5. вызывается событие бэнда OnAfterCalcHeight;

6. если бэнд не помещается на свободном месте страницы, формируется новая страница;

7. бэнд и все его объекты выводятся на страницу готового отчета;

8. вызывается событие OnAfterPrint всех объектов бэнда;

9. вызывается событие OnAfterPrint самого бэнда.

 

 Печать бэндов происходит до тех пор, пока есть данные в источнике, подключенном к бэнду. После этого формирование отчета в нашем случае завершается и вызываются события OnAfterPrint страницы отчета и наконец – событие OnStopReport объекта "Отчет".

 

 Таким образом, используя события разных объектов, можно контролировать практически каждый момент формирования отчета. Ключ к правильному использованию событий – полное понимание процесса печати бэндов, изложенного выше в девяти пунктах. Так, большинство действий можно выполнить, используя только событие бэнда OnBeforePrint – любые изменения, внесенные в объект, будут тут же отображены. Но в этом событии невозможно анализировать, на какой странице будет напечатан бэнд, если он растягиваемый – ведь подсчет высоты бэнда будет выполнен в пункте 4. Это можно сделать с помощью событий OnAfterCalcHeight в пункте 5 или OnAfterPrint в пункте 8, но в последнем случае бэнд уже будет напечатан и действия над объектами ничего не дадут. Одним словом, вы должны четко представлять, в какой момент времени вызывается каждое из событий и использовать те, которые соответствуют поставленной задаче.