    ГЛАВА             12 

    • Что такое Quick Reports 

    Quick Reports — это поставляемый с Delphi генератор отчетов, основанный на 
компонентах библиотеки VCL. 

    Создание отчетов 

    В этом разделе вы познакомитесь с каждым из компонентов генератора Quick 
Reports, а также узнаете, как использовать их для создания отчета. 

    Использование генератора отчетов 

    Дэвид Пауэл 

    Quick Reports — это мощный генератор отчетов, позволяющий создавать отчеты 
любой сложности. 32-разрядная версия Quick Reports впервые была включена в 
поставку Delphi 2.0. Версия генератора отчетов, поставляемая с Delphi 3, 
полностью изменена. В этой главе описывается каждый из компонентов Quick 
Reports, а также рассказывается, как создавать отчеты вручную и автоматически. 
    Во всех версиях Delphi 3 содержится проект QRDemo (папка Delphi 
3\Demos\QuickRpt) для демонстрации работы генератора отчетов Quick Reports. 
    Отчет генератора Quick Reports можно создать, выполнив всего три простые операции. 
    1. Переместите компонент TQuickRep в форму. 
    2. Создайте полосы, необходимые для отчета. 
    3. Перенесите визуальные элементы управления генератора Quick Reports на 
эти полосы для отображения информации в отчете. 
    Генератор Quick Reports версии 1 из Delphi 2.0 несовместим с Quick Reports 
версии 2 из заметку   Delphi 3. Если загрузить проект или форму, 
сгенерированную с помощью Delphi 2.0, то произойдет автоматическое 
преобразование, и форма станет совместимой с новой версией Quick Reports. 
    Компоненты генератора Quick Reports 
    Генератор отчетов Quick Reports базируется на наборе обычных элементов 
управления Delphi, которые совместно используются для создания цельного 
отчета. Использо- w 

    294 

    вание компонентов VCL дает генератору Quick Reports преимущество в 
скорости и управлении, делает его более гибким по сравнению с другими 
генераторами отчетов, которые основываются на системах OLE и DDE для связи 
программы с реальными модулями отчета. 
    Существует 18 компонентов генератора отчетов, размещенных на странице 
QReport палитры компонентов. В этой главе не ставится цель дать исчерпывающий 
список компонентов и их свойств. Здесь кратко описываются компоненты и 
указываются лишь некоторые часто используемые их свойства и события. 

    Компонент TQuickRep 

    Компонент TQuickRep — душа и сердце пакета Quick Reports, а также 
стартовая площадка для всех отчетов, генерируемых этим пакетом. Когда 
компонент TQuickRep переносится в форму, он самостоятельно выравнивается по 
размеру формы, что дает возможность выполнить полностраничную компоновку отчета. 

    Свойство Bands 

    С помощью свойства Bands можно определить шесть наиболее общих типов 
разделов отчета в логическом порядке. Bands — это свойство-множество со 
следующими допустимыми элементами: HasColumnHeader, HasDetail, HasPageFooter, 
HasPageHeader, HasSummary и HasTitle. Описание каждого типа строки приведено в 
табл. 12.1. 

    Таблица 12.1. Составляющие свойства Band 

    Значение         Описание 

    rbChild	Дочерняя область (Child band) — полоса, связанная с другой полосой 
и печатаемая после строки, с которой она связана 
    rbColumnHeader	Заголовки столбцов (Column Header band) печатаются сверху 
каждого столбца в отчетах с несколькими столбцами 
    rbDetail	Область данных (Detail band) печатается для каждой записи отчета 
    rbGroupFooter	Примечание группы (Group Footer band) печатается в конце 
группируемых строк (master/detail report — отчет типа "главный/подробный") 
    rbGroupHeader	Заголовок группы (Group Header band) печатается в начале 
группируемых строк (master/detail report) 
    rbOverlay	Свободная область (Overlay band) печатается с левого верхнего 
угла страницы и перекрывает остальные строки страницы 
    rbPageFooter	Нижний колонтитул (Page Footer band) страницы печатается 
внизу каждой страницы 
    rbPageHeader	Верхний колонтитул (Page Header band) печатается вверху 
каждой страницы 
    rbSubDetail	Область детализации (Sub Detail band) используется как область 
для подробностей отчета типа "главный/подробный" 
    rbSummary	Примечание отчета (Summary band) печатается один раз в конце отчета 
    rbTitle	Заголовок отчета (Title band) печатается один раз в начале отчета 

    Во время разработки на каждой из областей появляется надпись, описывающая 
тип области. Это позволяет быстро находить нужную область, когда вы добавляете 
в нее элементы управления. 

    Свойство DataSet 

    Свойство DataSet определяет, из какого набора данных главный отчет будет 
получать значения. Этот набор может быть объектом класса TTable или TQuery. 
Для простых списков обычно приходится работать с одним набором данных, но если 
необходимо создать отчет типа "главный/подробный", то в свойстве DataSet 
компонента TQuickRep следует указать главный набор данных. При этом не имеет 
значения, где находится набор данных: в форме Quick Reports, в другой форме 
или в модуле данных. 

    Свойство Options 

    Свойство Options содержит пять опций для отчета: FirstPageHeader, 
LastPageFooter, TwoPassReport, MultiThreaded и Compression. Установка опций 
FirstPageHeader и LastPageFooter определяет, что верхний и нижний колонтитулы 
печатаются только на первой и последней страницах отчета соответственно. 
Установка опции 

    Глава 12. Использование генератора отчетов                              295 

    Multi-Threaded приводит к тому, что отчет печатается в фоновом режиме, так 
что приложение может продолжать свою работу, как обычно, не дожидаясь 
окончания создания отчета. Если установить опцию TwoPassReport, то компонент 
TQRExpr сможет содержать выражения для вычисления значений, которые базируются 
на других неизвестных до конца отчета значениях. Например, при создании отчета 
о продажах процент от общей продажи для региона вычисляется на основе 
суммарной продажи по всей стране, а значение этой суммарной продажи 
неизвестно, пока не будет просчитан весь отчет. Вдвухпрохрдных отчетах 
генератор позволяет обойти это ограничение, генерируя сначала весь отчет и 
откладывая вычисление выражений, которые не могут быть определены при первом 
проходе, на второй проход. При установленной опции Compression отчет 
сохраняется в сжатом формате. В этом случае отчет будет занимать меньше памяти 
в программе, но дольше выполняться, т.е. происходит "обмен" скорости 
выполнения программы на ее объем. 

    Свойство Page 

    С помощью свойства Page можно полностью контролировать размер бумаги, 
полей, ориентацию страницы и т.д. Генератор отчетов запрашивает у системы все 
действующие параметры для выбранного принтера. 

    Свойство PrinterSettings 

    С помощью свойства PrinterSettings можно задать необходимое количество 
копий при печати, установить, будет ли применяться режим двусторонней печати, 
а также указать (если эта возможность поддерживается принтером), какой лоток 
используется для печати. 

    Свойство ReportTitle 

    Свойство ReportTitle используется компонентом TQRSysData для отображения 
заголовка отчета в строке заголовка. 

    Свойство ShowProgress 

    Свойство ShowProgress используется для отображения диалогового окна, 
предоставляющего информацию о состоянии процесса подготовки и печати отчета. 
Для прекращения генерации отчета можно воспользоваться кнопкой Cancel. 

    Событие OnNeedData 

    Событие OnNeedData используется для генерации отчета по набору данных, не 
поддерживаемого системой BDE. Это событие происходит в том случае, если Quick 
Reports нужны данные для следующей "записи". Если ваше приложение не связано с 
набором данных BDE, то необходимо определить текст для компонентов TQRLabel в 
отчете. Событие OnNeedData имеет логический параметр MoreData, который должен 
устанавливаться равным False, когда отчет выполнен. 

    Компонент TQRSubDetail 

    Компонент TQRSubDetail используется для отображения детальных записей в 
отчете типа "главный/подробный" (master/detail). Тремя главными свойствами 
этого компонента являются Bands, DataSet и Master. 

    Свойство Bands 

    Это свойство-множество с составляющими HasFooter и HasHeader. Данные 
значения предоставляют возможность немедленно создать примечание и заголовок 
группы соответственно. 

    Свойство DataSet 

    Свойство DataSet указывает, из какого набора данных компоненты 
определенной строки должны получать предназначенную для них информацию. Это 
свойство нужно устанавливать так, чтобы оно указывало на подробный набор 
данных связи "главный/подробный". 

    Свойство Master 

    Свойство Master должно указывать на строку, которая связана с основными 
данными. Обычно таким является компонент TQuickRep или первый из компонентов TQRSubDetail. 

    Компонент TQRBand 

    После TQuickRep компонент TQRBand, пожалуй, второй по важности компонент 
пакета Quick Reports. Каждый отчет содержит компоненты TQRBand того или иного 
типа. Если области добавляются к отчету с помощью свойства Bands компонента 
TQuickReport, то в действительности создаются компоненты TQRBand. Одни области 
печатаются автоматически, другие — на каждой странице, а третьи — лишь один раз. 

    296                                     Часть III. Работа с базами данных 


    Свойство BandType 

    Свойство BandType используется для обозначения типа области отчета, 
которая является компонентом TQRBand. Тип области определяет, в каком месте 
область разместится в окончательном отчете. В табл. 12.1 приводился список 
возможных констант типов областей с описанием. 

    Свойство ForceNewCoIumn 

    Это свойство используется для того, чтобы генератор отчетов создавал новый 
столбец перед печатью области. 

    Свойство ForceNewPage 

    Установка этого свойства приводит к тому, что генератор отчетов начинает 
новую страницу перед печатью области. В простом ленточном отчете установка 
значения True для этого свойства заставляет генератор печатать одну область на 
каждой странице. В отчете "главный/подробный" установка этого свойства для 
области детализации используется, чтобы каждая главная запись отчета 
начиналась с новой страницы и все ее подчиненные записи содержались на той же странице. 

    Свойство LinkBand 

    Когда печатается строка, генератор отчетов проверяет свободную область на 
текущей странице, чтобы убедиться, что на ней достаточно места для печати 
области. Свойство LinkBand используется, чтобы заставить Quick Reports 
разместить связанную область на той же самой странице, что и текущая область. 
Если места на текущей странице для печати текущей и связанной областей 
недостаточно, генератор отчетов начинает новую страницу. Области разрешается 
связывать цепочкой (область 1 может быть связана с областью 2, которая связана 
с областью 3, и т.д.). 

    Совет 

    Области связываются в порядке возрастания. Другими словами, если область 1 
печатается перед областью 2, вы мс)жете связать область 1 с областью 2. 
Связывание же области 2 с областью 1 не даст нужного результата, поскольку 
область 1 будет отпечатана до того, как область 2 будет вычислена. 

    Событие BeforePrint 

    Событие BeforePrint выполняется перед печатью строки генератором отчетов. 
Логический параметр PrintBand передается этому событию и используется для 
определения, должна ли печататься область. Параметр PrintBand равен True по 
умолчанию и должен быть установлен равным False для подавления печати области. 
Это событие часто используется в отчетах типа "главный/подробный", где вы 
желаете подавить печать подробной области, если нет соответствующих записей 
для основной записи. 

    Г Совет 1 

    Код, назначенный для выполнения при возникновении события BeforePrint для 
области, не будет вызван в0 ВР®^ разработки, если пользователь щелкнет правой 
кнопкой на компоненте отчета и выберет команду Preview в контекстном меню. 
Событие BeforePrint не будет вызвано во время выполнения, если вызван метод 
Preview компонента отчета, — вы будете видеть строки, как при предварительном 
просмотре во время разработки, которых вы, возможно, не увидите при 
действительном предварительном просмотре или печати отчета во время выполнения. 

    Компонент TQRChildBand 

    Компонент TQRChildBand используется для создания области, которая связана 
с другой областью. Это очень похоже на связь между детальной и поддетальной 
областью, но без формальностей связи "главный/подробный". Дочерняя область 
может быть создана путем переноса TQRChildBand в отчет или установки свойства 
НазСЬ1Ыдля строки равным True. 
    Дочерние области используются в ситуациях, когда необходимо печатать 
Memo-информацию в области подробностей, за которой следует другая информация. 
Если установить свойство AutoStrech компонента QRDBText равным True, он 
расширится, перекрывая другие элементы управления. Решение проблемы состоит в 
том, чтобы отображать Memo-информацию в области подробностей, а другую 
информацию — в дочерней области, которая присоединяется к детальной строке. 
Это позволяет расширять Memo-информацию по мере необходимости^без, перекрытия 
последующей информации.         ~ 

    Свойство ParentBand 

    Свойство ParentBand используется для связи дочерней области с ее 
родительской областью. Дочерняя область может быть связана с любым типом 
области генератора отчетов (даже с другой дочерней областью). 

    Глава 12. Использование генератора отчетов                              297 


    Компонент TQRGroup 

    Компонент TQRGroup используется для группирования в пределах отчета. 
Группирование главным образом применяется для отчетов "главный/подробный", но 
может быть эффективным и в простых ленточных отчетах. 

    Свойство Expression 

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

    copy(fieldname,1,1) 


    Свойство Master 

    Это свойство используется для указания, откуда компонент TQRGroup должен 
получать данные. Обычно оно связано с компонентом TQuickRep, на который было перенесено. 

    Компонент TQRLabel 

    Компонент TQRLabel — это новый компонент для генератора отчетов Quick 
Reports 2.0, который используется для отображения статического текста в 
отчетах, точно так, как если бы вы использовали компонент TLabel для 
отображения статического текстового значения в форме. Когда я говорю здесь 
"статические значения", я не имею в виду, что эти текстовые значения нельзя 
изменять; просто они не изменяются часто или не берутся из набора данных. 

    Компонент TQRDBText 

    Компонент TQRDBText •— это элемент управления данными, который 
используется для отображения значений текстового поля, числового поля, поля 
даты и Memo-поля. Этот компонент связан с набором данных и полем данных, 
подобно любому другому элементу управления данными, с помощью свойств DataSet 
и DataField соответственно. 

    Свойство AutoStretch 

    AutoStretch— это логическое свойство, которое указывает, нужно ли 
"растягивать" элемент управления TQRDBText вертикально по размеру содержимого 
Memo-поля. Если элемент управления TQRDBText связан с Memoполем и значение 
свойства AutoStretch равно False, то метка (содержимое Memo-поля) будет 
урезана по размеру элемента управления TQRDBText. Если же значение свойства 
равно True, элемент управления будет отображать все Memo-поле, прерываясь при 
необходимости во время перехода на другой лист. 

    Совет 

    Свойство AutoStretch вызывает изменение размера компонента TQRDBText по 
вертикали (даже если он перекрывает другой компонент Quick Reports). Если 
нужно отобразить Memo-информацию, за которой следует другая информация записи 
в той же области детализации, следует напечатать Memo-поле в области 
детализации, а остальную информацию — в дочерней области. 

    Компонент TQRExpr 

    Компонент TQRExpr позволяет выполнять всевозможные вычисления в отчетах — 
от простых до самых сложных. Этот компонент претерпел изменения с предыдущей 
версии Quick Reports и сейчас является универсальным, гибким и мощным 
средством. Свойство Expression — это ключ ко всему компоненту. Если вы 
щелкнете на значении для свойства Expression, то увидите кнопку с многоточием 
(...), которая открывает окно построителя выражений Expression builder (рис. 
12.1). Построитель выражений предназначен для создания выражения, 
используемого в отчете. 

    Свойство ResetAfterPrint 

    Это логическое свойство, которое указывает, должно ли значение компонента 
TQRExpr преобразовываться в стандартное каждый раз, когда оно отпечатано. Если 
вы создаете отчет "главный/подробный", в котором с помощью компонента TQRExpr 
создается некоторого вида вычисляемый итог, вам может понадобиться в 
определенных ситуациях восстанавливать значения. 

    298                                     Часть III. Работа с базами данных 


    Компонент TQRSysData 

    Компонент TQRSysData используется для отображения информации об отчете и 
операционной системе внутри отчета при его печати. 

    Рис. 12.1. Построитель выражений 

    Свойство Data 

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

    Таблица 12.2. Значения свойства Data 

    Значение	Описание 

    qrsDate	Текущая дата 
    qrsDateTime	Текущие дата и время 
    qrsDetail Count	Количество записей в отчете 
    qrsDetaiINo	Номер записи 
    qrsPageNumber	Номер страницы 
    qrsReportTitle	Значение свойства ReportTitle компонента TQuickRep 
    qrsTime	Текущее время 

    Компонент TQRMemo 

    Компонент TQRMemo позволяет выводить в отчете Memo-информацию, не 
связанную-с-данными. Этот компонент ведет себя так же, как обычный элемент 
TMemo, а информация может быть добавлена к нему через свойство Lines. He 
существует Memo-элемента управления, связанного с данными, а для 
Мето^под^й.^азд^данных используется компонент 

    TQRDBText. 

    Глава 12. Использование генератора отчетов                              299 

    Компонент TQRRichText 

    Компонент TQRRichText позволяет отображать в отчете RTF-файлы (Rich Text 
Format— формат обмена текстовыми документами фирмы Microsoft). Компонент 
TQRRichEdit имеет свойство ParentRichEdit, которое позволяет связывать 
компонент TQRRichEdit с другим компонентом TRichEdit. При этом компонент 
TQRRichEdit будет отражать Memo-RTF-информацию другого компонента. 

    Компонент TQ^DBRichText 

    Компонент TQRDBRichText —это версия компонента TQRRichEdit для данных. 

    Компонент TQRShape 

    Компонент TQRShape используется для вычерчивания простых фигур в отчете. 
Фигура определяется свойством Shape. В табл. 12.3 приводятся значения свойства Shape. 

    Значение	Описание 

    qrsCircle	Окружность 
    qrsHorline	Горизонтальная линия 
    qrsRectangle	Прямоугольник 
    qrsRightAndLeft	Вертикальные линии справа и слева 
    qrsTopAndBotton	Горизонтальные линии вверху и внизу 
    qrsVertLine	Вертикальная линия 


    Компонент TQRImage 

    Компонент TQRImage позволяет отображать статические графические 
изображения в отчете. Его можно использовать для добавления в отчет 
оцифрованных печатных бланков или логотипа. 

    Компонент TQRDBImage 

    Компонент TQRDBImage— это элемент управления для работы с данными, который 
позволяет добавлять в отчет графику из базы данных. Компонент используется так 
же, как и обычный элемент управления TDBImage. 

    Компонент TQRCompositeReport 

    Компонент TQRCompositeReport предоставляет возможность объединить 
несколько отчетов. С его помощью можно создать один большой отчет, в котором 
содержится много условных разделов, не требующий программного включения и 
выключения печати специальных строк. Можно просто создать условные разделы как 
отдельные отчеты, а затем добавить разделы, которые нужно напечатать в 
составном отчете. Отчеты добавляются к компоненту TQRCompositeReport через 
событие OnAddReports. В событии OnAddReports отчеты добавляются к свойству 
Reports, как описано ниже. 

    Procedure TForml.QRCompositeReportlAddReports(Sender: Tobject); 
    begin 
    with Sender as TQRCompositeReport do begin 
    // QuickReport2, QuickReport3 и QuickReport4 — компоненты TQuickRep. 
    Reports.Add(QuickReport2) ; 
    Reports.Add(QuickReport3) ; 
    Reports.Add(QuickReport4); 
    end; 
    end; 


    300                                     Часть III. Работа с базами данных 


    Компонент TQRPreview 

    Компонент TQRPreview — позволяет создать свой собственный экран 
предварительного просмотра вместо стандартного просмотра Quick Reports. Более 
подробно создание формы Custom Preview описано в разделе "Средства 
предварительного просмотра" этой главы. 

    Компонент TQRChart 

    Компонент TQRChart — это специализированный компонент TChart генератора 
отчетов, позволяющий внедрять в отчет диаграммы. Этот компонент прекрасно 
работает в строке TQRGroup, в котором можно графически отображать итоговую 
информацию для последующих детальных записей.~"-" ~—•±L"—'——"———""""'—

    Создание отчетов 

    Delphi предоставляет два простых средства создания отчетов — Quick Report 
Wizard (Мастер отчетов) и Report Templates (Шаблоны отчетов). В этом разделе 
рассказывается, как генерировать отчеты с их помощью. 

    Мастер Quick Report 

    Quick Report Wizard размещен во вкладке Business хранилища объектов. С его 
помощью можно быстро и просто создать простой ленточный отчет. На рис. 12.2 
показана вкладка Business диалогового окна New Item, содержащая Quick Report. 

    Рис. 12.2. Вкладка Business хранилища объектов Создадим простой отчет с 
помощью мастера отчетов на основе таблицы поставщиков в DBDemos. 

    1. Создайте приложение в Delphi. 
    2. Выберите команду File^New из главного меню Delphi, и откроется окно 
хранилища объектов. 
    3. Выберите вкладку Business, щелкните на пиктограмме QuickReport Wizard и 
на кнопке ОК. 
    4. Выберите псевдоним DBDemos и таблицу VENDORS. DB, а затем щелкните на 
кнопке Next. 
    5. Щелкните на кнопке » для включения всех полей в отчет, а затем на 
кнопке Next. 
    6. Укажите текст заголовка отчета UD3 QuickReport Wizard Example и 
щелкните на кнопке Finish. Вы возвратитесь в среду IDE Delphi. 
    7. Выберите компонент Table во вновь созданной форме Quick Reports и 
измените значение его свойства Active в окне Object Inspector на True. 
    8. Щелкните правой кнопкой на форме Quick Reports и выберите команду 
Preview в контекстном меню. Вы должны получить отчет, подобный показанному на 
рис. 12.3. 

    Глава 12. Использование генератора отчетов                              301 

    Мастер отчетов автоматически размещает компонент ТТаЫе в форме, которую он 
создает. Вы могди_бы_удалить этот компонент и указать в свойстве DataSet 
компонента TQuickRep таблицу или запрос в DataModule или другую форму. Если 
это сделать, то нужно будет так изменить свойство Expression для компонента 
TQRExpr, который создан мастером отчетов, чтобы оно указывало на один и тот же 
набор данных. 
    
    Рис. 12.3. Отчет о поставщиках, созданный мастером отчетов 


    Шаблоны отчетов 

    Подобно мастеру отчетов, шаблоны отчетов хранятся в Object Repository. Во 
вкладке Forms содержится три шаблона Quick Reports. На рис. 12.4 показано 
диалоговое окно New Item с шаблонами отчетов во вкладке Forms. Использование 
шаблонов отчетов требует несколько больших усилий, чем использование мастера 
отчетов, но такой выбор предоставляет больше гибкости. В этом разделе 
рассказывается, как создавать отчет с использованием шаблонов QuickReport 
Labels и QuickReport Master/Detail. 


    Рис. 12.4. Вкладка Forms хранилища объектов 


    302                                             Часть III. Работа с базами данных 


    Шаблон ленточного отчета 

    Шаблон ленточного отчета (List Template) создает стандартный отчет в форме 
списка, идентичного тому, который создается с помощью мастера отчетов (за 
исключением автоматически генерируемого элемента управления текстом для 
каждого поля). В большинстве случаев быстрее и проще использовать для этих 
видов отчетов мастера отчетов. 

    Шаблон почтовых этикеток 

    С помощью шаблона Labels создается отчет для печати этикеток (labels). 
Отчет содержит только область детализации, которая имеет ширину и высоту, 
установленную для конкретного бланка размера стандартной'трё^столо"ц6 вой" 
форЯьГ^Для бланков различных размеров нужно задать свойства ширины и высоты 
области детализации, а также свойство Page компонента TQuickRep —для установки 
размера страницы и числа столбцов на странице. 
    Примером использования этого шаблона может служить создание отчета 
этикеток по таблице поставщиков DBDemos. В таблице поставщиков содержится 
список компаний. Создадим бланк, в котором содержатся название компании, 
адрес, город, почтовый индекс и имя представителя для каждой записи в базе 
данных. В этом отчете будут содержаться только компании США и, если имеется 
имя представителя, будет сделана пометка "Attn:". 
    1. Создайте пр.иложен.не.в.Ое^рЫ-..-_^ 
    2. Перенесите компоненты ТТаЫе, TDataSource, TDBGrid и два компонента 
TButton в форму. 
    3. Установите свойство DatabaseName компонента TTable равным DBDemos, 
свойство TableName — равным CUSTOMER.DB, а свойство Active —True. 
    4. Установите свойство DataSet компонента TDataSource равным Tablel, а 
свойство DataSource компонента TDBGrid—DataSourcel, и появятся данный в сетке. 
    5. Установите свойство Caption первого компонента TButton равным Preview, 
а другого компонента TButton— Print. 
    6. Выберите команду File^New из главного меню Delphi. Тем самым вы 
откроете окно New Item. Выберите вкладку Forms, а затем — QuickReports Labels. 
    7. На форме Quick Reports установите свойство MasterTable компонента 
равным DBDemos, свойство TableName — равным CUSTOMER. DB, а свойство Active — True. 
    8. Перенесите семь компонентов TQRDBText в область детализации. 
    9. Установите свойство DataSet для каждого из семи компонентов TQRDBText 
равным MasterTable. Свойство DataField установите так, чтобы поле Company было 
в первой строке, Contact — во второй, Addr2 — в четвертой, a City, State и Zip 
— в пятой строке. 
    10. Для печати записей заказчиков только США добавьте следующий код к 
событию BeforePrint области детализации: 

    PrintBand := MasterTable['Country'] = 'US',

    11. Чтобы добавить линию примечания для представителя добавьте следующий 
код к событию компонента TQRDBText, который связан с полем Contact: 

    if Value о '' then 
    Value := 'Attn: ' + Value; 

    12. Вручную добавьте запятую после поля City. Это можно сделать, добавив 
следующий код для события OnPrint компонента TQRDBText, который связан с полем City: 

    Value := Value +', '; 

    13. В событии OnClick для кнопки Preview добавьте следующее: 

    QRListForm.Report.Preview; 

    14. В событии OnClick для кнопки Print добавьте следующее: 

    QRListForm.Report.Print; 

    15. Добавьте Unit2 для раздела USES Unitl. 

    В листинге 12.1 содержится полный код для формы Quick Reports. Если это 
приложение запущено и вы щелкнете на кнопке Preview, результат будет таким, 
как на рис. 12.5. Весь проект содержится на дополнительно распространяемой 
дискете в папке UDELPHI3\CHP12\LABELPRT. 

    Глава 12. Использование генератора отчетов                              303 


    Листинг 12.1. \UDELPHi3\CHPl2\LABELPRT. Пример печати бланка генератором отчетов 

    { Шаблон Labels QuickReport. } 
    unit Unit2; 
    interface 
    uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
Qrctrls, quickrpt, DB, DBTables, ExtCtrls; 
    type 
    TQRListForm = class(TForm) 
    Report: TQuickRep; 
    MasterTable: TTable; 
    DetailBandl: TQRBand 
    QRDBTextl  TQRDBText 
    QRDBText2  TQRDBText 
    QRDBTextS  TQRDBText 
    QRDBText4  TQRDBText 
    QRDBTextS  TQRDBText 
    QRDBText6  TQRDBText 
    QRDBText?  TQRDBText 
    procedure QRDBText3Print(sender: TObject; var Value: String); 
    procedure DetailBandlBeforePrint (Sender: TQRCustoinBand; 
    var PrintBand: Boolean) ; 
    procedure QRDBText6Print(sender: TObject; var Value: Stringsprivate 
    { Private declarations } public 
    ( Public declarations } end; 
    var QRListForm : TQRListForm; 
    implementation ($R * .DFM} 
    procedure TQRListForm.QRDBText3Print(sender: TObject; var Value: Stringsbegin 
    Value := Value +',' ; 
    end; 
    procedure TQRListForm.DetailBandlBeforePrint 
    (Sender:  TQRCustomBand; var PrintBand: Boolean) ; 
    begin 
    // Печатаем только заказчиков США. 
    PrintBand := MasterTable['Country'] = 'US'; 
    end; 
    procedure TQRListForm.QRDBText6Print(sender: TObject; 
    var Value: String); 
    begin 
    // Если это контактное имя, добавим 'Attn:' в начало. 
    if Value о '' then 
    Value := 'Attn:  ' + Value; 
    end; 
    end. 


    304                                     Часть III. Работа с базами данных 


    Kauai r)i'»e Shoppe Kirk Enterprises Attn Erica Norman Attn Rudolph Clans 
4-976 Sugarloaf Hwy 42 Aqua Lane Suite 103 Карав Kaual. HI 84766-1234 Houston, 
TX 77079	Blue Glass Happiness Atln Christine Taylor 6345 W. Shore LaneSanta 
Monica, CA 90410 
    Blue Jack Aqua Center George Bean & Co. Attn Ernest Barratt Attn Bill 
Wyere 23-738 Paddington Lane »73 Kins Salmon Way Suite 310 Walpahu, HI 9Э776 
Lugot. NC 29078	Divers of Venice Attn Sim one Green 220 Elm StreetVenice, FL 39224 
    Ocean Paradise Professional Dr»erE, Ltd. Attn Paul Gardner Attn ShIrteyM 
afters PO Box 8745 4734MelindaSt.	Larry^ Di\ing School Attn Isabelle Neece 
3562 NW Bruce Street 
    Kallua-Kona, HI 94756 Hoowr, AL 32145	Milveukle, OR Э6277 
    The Depth Charge Dtvsrs olBlie-green Atln Sam Witherspoon Atln Nancy Bean 
15243 Undemeler F»y. 634 Complex A\e.	Vashon Ventures АПп Susan Smith 743 
Keyhole Court 
    Marathon. FL 35003 Pelham, AL 32145	Honolulu, HI 92856	•••'.•
    Blue Sports OoM Coast Supply Attn Theresa Kunec Atln Elalne Falls 
20312lhA\e.Box746 223Д Houston Place	Ocean Ad\entures Attn Paul Still POBox466Klhei	":.'& 
    eirihaldi. OR 91187 Mobile, AL 30696	Maul, HI Э5736 
    Makai SCUBA Club San Pablo Dl\e Center Atln Donna Siaus Attn Patricia 

    Рис. 12.5. Почтовые этикетки, полученные с помощью Quick Reports 


    Шаблон "главный/подробный" генератора Quick Reports 

    Шаблон "главный/подробный" предназначен для создания отчета Quick Reports 
с областями Column, Detail, Sub-Detail и Page Footer, которые связаны с 
отчетом в форме "главный/подробный". На форме отчета появятся два компонента 
ТТаЫе с именами MasterTable и DetailTable по умолчанию, которые будут связаны 
с соответствующими областями. 
    Например, создайте отчет по таблицам DBDemos Vendors и Parts. В таблице 
Vendors содержится список уникальных кодов поставщиков, а в таблице Parts — 
уникальные номера частей и связанных с ними коды поставщиков. Создайте отчет, 
в котором содержится список поставщиков со всеми изделиями, которые они 
производят. Если поставщик в таблице Vendors не имеет элементов в таблице 
Parts, то не включайте поставщика в отчет. Кроме того, если поставщик отмечен 
как предпочтительный в таблице Vendors, не выводите этот статус в отчете. 
    1. Создайте приложение в Delphi. 
    2. Выберите команду File^New из главного меню Delphi, чтобы открыть окно 
хранилища объектов. Выберите вкладку Forms, а затем форму QuickReports Master/Detail. 
    3. Выберите команду File^New Data Module из главного меню Delphi, чтобы 
создать модуль данных. Выберите вкладку Forms, а затем форму QuickReports Master/Detail. 
    4. В модуль данных перенесите два компонента ТТаЫе и два компонента 
TDataSource. Имя первого компонента— MasterTable, а имя второго компонента— 
DetailTable. Имя первого компонента TDataSource — MasterSource, а имя второго 
— DetailSource. Установите свойство DataSet компонента TDataSource равным 
соответствующему свойству компонента TTable. Установите свойство DatabaseName 
компонента TTable равным DBDemos. Установите свойство TableName компонента 
MasterTable равным VENDORS, а свойство Active— True. Для DetailTable 
установите свойство TableName равным PARTS, свойство 
MasterSource—MasterSource, свойство IndexName —VenderNo, свойство MasterFields 
—VenderNo, а свойство Active — True. 
    5. В главную форму приложения (первая форма), перенесите два компонента 
TDBGrid и два компонента TButton. Добавьте модуль данных Unit3 в раздел USES. 
Установите другой компонент TButton равным Print. Установите свойство 
DataSource первого компонента TDBGrid равным MasterSource, а другого 
компонента— DetailSource. Вы должны увидеть данные в сетке. 

    Глава 12. Использование генератора отчетов                              305 

    6. В форме Quick Reports удалите два компонента ТТаЫе, которые будут 
автоматически добавлены в форму. Установите свойство DataSet компонента 
TQuickRep равным MasterTable, а свойство DataSet поддетальной строки— равным 
DetailTable. Создайте заголовок группы, добавив элемент HasHeader к свойству 
Bands области детализации. 
    7. В область заголовка столбцов добавьте три компонента TQRLabel для 
компонентов VendorNo, Vendor и Status. 
    8. В область детализации добавьте семь компонентов TQRDBText для 
компонентов VendorNo, VendorName, Addressi, City, State, Zip и необходимые 
поля соответственно. Установите свойство ForceNewPage равным True, чтобы 
обеспечить вывод только одного поставщика на каждую страницу отчета. Если вы 
хотите видеть их все сразу, оставьте значение по умолчанию (False). 
    9. В область заголовка группы добавьте три компонента TQRLabel для PartNo, 
Description и Cost. 
    10. В область детализации добавьте три компонента TQRDBText для полей 
PartNo, Description и Cost. 
    11. Чтобы не печатать поставщиков, не связанных с изделиями, добавьте 
следующий код к событию компонента ВеforePrint области детализации: 
    PrintBand := DataModule3.DetailTable.RecordCount > 0; 
    12. Если поставщик приоритетный, выдать текст "Preferred", если нет— 
"Standard". По умолчанию текст для этих полей — True и False, поскольку это 
логические поля. Чтобы сделать изменения, добавьте следующий код к событию 
OnPrint компонента TQRDBText, связанного с предпочтительным полем: 

    if Value = 'True' then 
    Value := 'Preferred'; 
    else 
    Value := 'Standard',

    13. Для форматирования значений в поле Cost в денежные значения вместо 
значений с плавающей запятой добавьте след>ТощйУ1(ОдТсоЙ1тию OnPrint 
компонента TQRDBText, связанного с полем Cost: 

    FmtStr(Value, '%m', [StrToFloat(Value)]); 

    14. К событию OnClick для кнопки Preview главной формы добавьте следующий код: 

    QRListForm.Report.Preview; 

    15. К событию OnClick для кнопки Print главной формы добавьте следующий код: 

    QRListForm.Report.Print; 

    16. Добавьте Unit2 (форма Quick Reports) в раздел USES модуля Uniti 
(главная форма). 
    В листинге 12.2 содержится полный код для формы Quick Reports. Если это 
приложение запущено и вы щелкнете на кнопке Preview, результат будет таким, 
как на рис. 12.6. Весь проект расположен на дополнительно распространяемой 
дискете в папке UDELPHI3\CHP12\MDRPT. 

    Листинг 12.2. \UDELPHl3\CHPl2\MDPRT. Пример создания отчета "главный/подробный" 

    { Шаблон "главный/подробный". } 
    unit Unit2; 
    interface 
    uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Qrctrls, 
    quickrpt, DB, DBTables, ExtCtrls; 
    type 
    TQRListForm = class(TForm) 
    Report: TQuickRep; 
    DetailBandl: TQRBand; 
    PageFooterBandl: TQRBand; 
    TitleBandl: TQRBand; 
    ColumnHeaderBandl: TQRBand; 
    QRSysDatal: TQRSysData 


    306                                     Часть III. Работа с базами данных 


    QRSysData2: TQRSysData 
    QRSubDetaill: TQRSubDetail 
    QRDBTextl  TQRDBText 
    QRDBText2  TQRDBText 
    QRDBText3  TQRDBText 
    QRDBText4  TQRDBText 
    QRDBText5  TQRDBText 
    QRDBText6  TQRDBText 
    QRDBText?  TQRDBText 
    QRDBTextS  TQRDBText 
    QRDBText9  TQRDBText 
    QRDBText10: TQRDBText; 
    QRDBTextll: TQRDBText; 
    QRLabell  TQRLabel; 
    QRLabel2  TQRLabel; 
    QRLabel3  TQRLabel; 
    GroupHeaderBandl: TQRBand; 
    QRLabel4  TQRLabel ; 
    QRLabelS  TQRLabel; 
    QRLabel6  TQRLabel; 
    procedure QRDBText3Print(sender: TObject; var Value: Strings
    procedure DetailBandlBeforePrint(Sender: TQRCustomBand; 
    var PrintBand: Boolean) ; 
    procedure QRDBText6Print(sender: TObject; var Value: Strings
    private 
    { Private declarations } 
    public 
    { Public declarations ) 
    end; 
    var 
    QRListForm : TQRListForm; 
    implementation 
    {$R * .DFM) 
    procedure TQRListForm.QRDBText3Print(sender: TObject; var Value: Strings
    begin 
    // Если клиент приоритетный, печатаем "Preferred", иначе — "Standard". 
    if Value = 'True' then 
    Value := 'Preferred' 
    else 
    Value := 'Standard'; 
    end; 
    procedure TQRListForm.DetailBandlBeforePrint(Sender: TQRCustomBand; var PrintBand: 
    Boolean) ; 
    begin 
    // Печатаем строки, только если есть записи в подробной таблице. 
    PrintBand := DataModule3.DetailTable.RecordCount > 0; 
    end; 
    procedure TQRListForm.QRDBText6Print(sender: TObject; 
    var Value: String); 
    begin 
    FmtStr(Value, '%m', [StrToFloat(Value)]); 
    end; 
    end. 


    Глава 12. Использование генератора отчетов                              307 


    Рис. 12.6. Пример отчета "главный/подробный" 


    Средства предварительного просмотра 

    Пользовательский предварительный просмотр легко создается в Delphi с 
помощью компонента TQRPreview. Создание пользовательского предварительного 
просмотра предусматривает выполнение следующих действий. 
    1. Создать форму и перенести в нее компонент TQRPreview. 
    2. Добавить кнопки и элементы меню в форму, которая будет использоваться 
для перемещения по отчету, печати и отображения отчета. 
    3. Добавить следующий код к обработчику события OnPreview для всех 
отчетов, которые будут использовать пользовательский предварительный просмотр: 
    PrevForm.QRPreviewl.QRPrinter := TQRPrinter(Sender); 
    Здесь PrevForm— имя формы пользовательского предварительного просмотра, a 
QRPreviewl — имя компонента TQRPreview. 
    Третий шаг является ключевым в достижении работоспособности 
пользовательского предварительного просмотра. Он назначает объект Printer 
пользовательского предварительного просмотра для объекта Printer отчета. 
Полный пример пользовательского предварительного просмотра содержится на 
дополниПРИтаЯЯ тельно распространяемой дискете в папке \UDELPHI3\CHP12\CUSTVIEW. 

    Резюме 

    Средство Quick Reports — это мощный генератор отчетов. В этой главе 
рассматривались элементы управления генератора отчетов и было создано три 
различных отчета, простой ленточный, "главный/подробный" и отчет почтовых 
этикеток. Вы узнали, что Quick Reports предоставляет возможность полного 
контроля над позиционированием полей, условной печатью строк и даже значениями 
полей во время выполнения. Встроенный мастер отчетов и шаблоны отчетов 
помогают быстро создать профессиональные отчеты, не выходя из Delphi. 

    308                                     Часть III. Работа с базами данных