544______________________________________________Глава 9

требуется установить в true только HasHeader. В появившейся полосе Group Hea-
der поместите метку QRLabel с заголовком раздела, а в самой полосе детализации
поместите компонент QRDBText — метку, связанную с данными. В ней, как и в
других компонентах, связанных с данными, надо задать набор данных DataSet и
его поле DataField, которое должно отображаться. В данном случае DataSet =
TDep и DataField = Dep.

Можете опять осуществить предварительный просмотр отчета и убедиться,
что первый раздел отчета печатается правильно.

Во втором разделе — СПИСОЧНЫЙ СОСТАВ ОТДЕЛОВ нам надо организовать
два вложенных цикла печати: внешний по отделам и внутренний по сотрудникам
очередного отдела. Для внешнего цикла повторяете все операции, которые делали
для предыдущего раздела: переносите в отчет компонент QRSubDetail, связываете
его с таблицей TDep, устанавливаете в true подсвойство HasHeader свойства
Bands. На полосе заголовка раздела помещаете метку QRLabel с заголовком
«СПИСОЧНЫЙ СОСТАВ ОТДЕЛОВ». На полосе детализации размещаете метку
QRLabel с текстом «СОТРУДНИКИ ОТДЕЛА» и рядом с ней — метку QRDBText, на-'
строив ее на поле Dep таблицы TDep.

Теперь нам надо организовать вложенный цикл, чтобы для каждого отдела
пробегать по относящимся к нему записям таблицы Pers. Для задания таких вло-
женных циклов в компоненте QRSubDetail предусмотрено свойство Master. Оно
определяет головную полосу для данной полосы. Это аналогично тому, как задает-
ся головная таблица для вспомогательной. Свойство Master позволяет организовы-
вать внутренние циклы печати для каждого напечатанного значения головной по-
лосы. Свойство PrintBefore определяет в этом случае, печатаются ли значения
внутреннего цикла до (при PrintBefore == true) или после печати очередного значе-
ния внешнего цикла.

Чтобы все это реализовать, поместите в отчет еще один к компонент QRSubDetail
и свяжите его с таблицей TPers. Его свойство Master установите в QRSubDetail2 —
имя второй полосы QRSubDetail, являющейся головной во втором разделе. На эту но-
вую полосу поместите метку QRDBText, настроив ее на поле Fam таблицы TPers.

Запустите предварительный просмотр отчета и убедитесь, что все работает как
надо.

Теперь третий раздел отчета «ЛИЧНЫЕ ДЕЛА» не представит для вас сложно-
сти. В нем точно так же надо организовать внешний цикл печати по отделам и
внутренний — по сотрудникам отдела. В этом втором цикле для отображения фо-
тографий надо использовать компонент QRDBImage, а для печати характери-
стик — компонент QRMemo. Оба эти компонента должны быть настроены на соот-
ветствующие поля таблицы TPers. Осталось выполнить одно требование задания —
каждый подраздел раздела «ЛИЧНЫЕ ДЕЛА», относящийся к новому подразделению,
должен начинаться с новой страницы. Это можно сделать, воспользовавшись свой-
ством полосы детализации ForceNewPage — форсировать переход на новую страни-
цу. В полосе внешнего цикла установите это свойство в true. Тогда по окончании
каждого внешнего цикла будет осуществляться переход на новую страницу.

Ваш отчет готов. Теперь хорошо бы сделать для него управляющую форму. Этот
процесс описан в разделе 4.8.3. Сводится он к следующим операциям. Разработан-
ную вами форму отчета делаете невидимой, пользуясь свойством Visible. Добавляе-
те в приложение новую форму, делая ее главной. На этой главной форме предусмат-
риваете с помощью кнопок или меню две команды: Предварительный просмотр и Пе-
чать. В команде Предварительный просмотр выполняете метод Preview для компо-
нента QuickRep формы отчета, а в команде Печать — метод Print для того же компо-
нента QuickRep. На этом разработка приложения для печати отчета закончена. Мо-
жете запускать свое приложение в эксплуатацию. С его помощью в любой момент
можно распечатать полный отчет о текущем состоянии базы данных.