Drkb online - створення звітів за допомогою quickreport 3 (стаття)

procedure TForm1.Button1Click (Sender: TObject);
begin
QuickRep1.Preview;
end;

procedure TForm1.Button1Click (Sender: TObject);
begin
QuickRep1.Print;
end;

В даний момент слід зробити кілька зауважень. У даній тестовій програмі компонент TQuickRep розташований на головній формі і, як ви бачите це виглядає не зовсім добре. У реальній програмі ви ніколи не будете показувати форму містить TQuickRep. Замість цього ви розмітити його на іншій формі.
Для того, що б зробити цей приклад схожим на даний додаток, зробимо ще кілька кроків:

procedure TForm2.Button1Click (Sender: TObject);
begin
Form1.QuickRep1.Preview;
end;

procedure TForm1.QRCompositeReport1AddReports (
Sender: TObject);
begin
QRCompositeReport1.Reports.Add (RepNewCust.Report);
QRCompositeReport1.Reports.Add (RepOrderSummary.Report);
QRCompositeReport1.Reports.Add (RepStockReorder.Report);
end;

(Якщо ви не гидуєте використанням оператора with в вашому коді, то ви можете написати так
with QRCompositeReport1.Reports do
begin
.
end;

Для використання фільтрів Text або CSV даних чином, використовуйте той же самий виклик ExportToFilter але тільки вкажіть відповідний фільтр як TQRAsciiExportFilter або TQRCommaSeparatedFilter.

Інспектор об'єктів показує, використовується дана секція чи ні, і ви можете додати або видалити будь-яку секцію просто встановивши відповідне властивість. Секції створені з використанням даного шляхом мають імена, що описують їх призначення: DetailBand1, PageHeaderBand1 і т.д. Властивість BandType встановлюється автоматично.
Хоча і можливе додавання секцій вручну і установці BandType в rbSubDetail або rbGroupHeader, але це не рекомендується. Дані секції призначені для використання тільки з секціями TQRSubDetail і TQRGroup. Використання їх де-небудь ще може дати непередбачуваний результат.
Ви також можете додати секції шляхом вибору компоненти TQRBand з палітри і розміщення їх в звіті. Зауважимо, що в цьому випадку ви повинні самі потурбуватися про встановлення властивості BandType, і ви також повинні дати секції відповідне ім'я. Властивість Bands контейнера TQuickRep перетворюється автоматично для відображення секцій доданих до звіту даними шляхом.
Тут список простих секцій, які ви можете додати до звіту:
Band type Purpose
Page Header Перша секція, зазвичай друкується на кожній сторінці. Друк на першій сторінці визначається властивістю Options.FirstPageHeader. Значення за замовчуванням: друкувати на першій сторінці.
Title Секція title - перша секція, яка друкується в звіті (після заголовка першої сторінки, якщо є). Часто використовується для друку титульного аркуша звіту, критеріїв вибору даних, Дати і часу створення і т.д.
Column Header Секція заголовків, друкується вгорі регулярного звіту, на кожній сторінці. Після заголовка сторінки (і після Title на першій сторінці). У багато стовпчики звіті. друкується для кожної колонки. Часто використовується для друку найменувань полів.
Detail Секція для друку кожного запису (рядка) вашого набору даних. Це звичайно найбільш важлива секція в звіті і яка займає основне місце у вашому звіті. Ви повинні помістити data-aware друковані компоненти, такі як TQRDBText на цю секцію.
Summary Після друку всіх секцій detail, ви можете віддрукувати сумарні підсумки в даній секції.
Page Footer Остання секція на кожній сторінці. Друк на останній сторінці визначається властивістю Options.LastPageFooter.

Як тільки ви додаєте нові секції в звіт, ви бачите як вони позиціонуються в порядку дійсної друку. Ви бачите, що секція Page Header поміщається вгору, наступна за нею секція Title, column header і так далі.

Тип кожної секції друкується маленькими літерами в лівому нижньому кутку. Це дозволяє вам ідентифікувати їх в звіті. Даний текст не потрапляє в фінальний звіт.
Секції з'являються в звіті компоненти TQuickRep показуються в тому порядку, в якому вони будуть при друку. Це допомагає зрозуміти як це буде надруковано. Найбільш часте використання секцій показано на Figure 10, але це стає досить складним, коли ви починаєте друкувати суб-секції і групіровавать.
розміри секцій
Секції отримують їх горизонтальний розмір від компоненти TQuickRep. Їх властивості Size.Width використовуються тільки як read only; Спроба запису в них інших значень ігнорується. Для одно-колоночного звіту, ширина всіх секцій встановлюється рівною ширині сторінки мінус ліва і права кордону. У багатоколонкові звіті, ширина секції (Column Header, Detail, Sub Detail, Group Header and Group Footer) підлаштовується під доступну ширину окремої колонки
Проте ви можете змінювати вертикальний розмір секції. Виберіть секцію і змініть розмір за допомогою мишки або за допомогою зміни властивості Size.Height.
Включення і вимикання секцій
Іноді ви не бажаєте заборонити друк тієї чи іншої секції. Це може бути зроблено або в design time або в run time, установкою властивості TQRBand.Enabled в False.
Під час генерації звіту ви також можете тимчасово заборонити друк секції в обробнику події BeforePrint. Даний обробник має параметр PrintBand, який ви можете встановити в False для заборони друку секції - але тільки на один раз. Дана властивість дуже зручно для організації простої фільтрації:

procedure TrepCusList.RepDetailBeforePrint
(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
PrintBand: = CustTableTotalSales> 3000000;
end;


Примітка: Коли PrintBand встановлюється в False для detail секції, значення для даного запису не включаються до розрахунку агрегатних TQRExr функцій, наприклад функція SUM. Така поведінка відрізняється між версіями QuickReport 2 і QuickReport 3.
Якщо ви вимкнете секцію Page Footer, наслідком буде поява порожнього простору внизу кожної сторінки - секція Detail не використовує дане простір, QuickReport не перевіряє розмір сторінки кожен раз. Так що якщо ви зміните властивість Enabled секції Page Footer, то викличте метод ResetPageFooterSize для оновлення інформації.

// use QRPrntr to get TQRPreviewInterface

TQRCustomPreviewInterface = class (TQRPreviewInterface)
public
function Show (AQRPrinter. TQRPrinter)
. TWinControl; override;
function ShowModal (AQRPrinter. TQRPrinter)
. TWinControl; override;
end;

function TQRCustomPreviewInterface.Show (
AQRPrinter: TQRPrinter): TWinControl;
var
frm. TCustPreview;
begin
frm: = TCustPreview.Create (Application, AQRPrinter);
frm.Show;
Result: = frm;
end;

function TQRCustomPreviewInterface.ShowModal (
AQRPrinter: TQRPrinter): TWinControl;
var
frm. TCustPreview;
begin
frm: = TCustPreview.Create (Application, AQRPrinter);
frm.ShowModal;
Result: = frm;
end;

# 123; $ WARNINGS OFF # 125;
TCustPreview = class (TForm)
QRPreview1: TQRPreview;
procedure CustPreviewClose (Sender: TObject;
var Action: TCloseAction);
private

fQRPrinter. TQRPrinter;
public

constructor Create (AOwner. TComponent;
AQRPrinter. TQRPrinter); virtual;
end;
# 123; $ WARNINGS ON # 125;

constructor TCustPreview.Create (AOwner: TComponent;
AQRPrinter: TQRPrinter);
begin
inherited Create (AOwner);
fQRPrinter: = AQRPrinter;
QRPreview1.QRPrinter: = AQRPrinter;
end;

procedure TCustPreview.CustPreviewClose (Sender: TObject;
var Action: TCloseAction);
begin
fQRPrinter.ClosePreview (Self);
Action: = caFree;
end;

Примітка від Vit: Публікується зі скороченнями