Создание формы отчета с помощью кода
Как правило, большинство отчетов вы будете создавать с помощью дизайнера. Тем не менее, в некоторых случаях (например, форма отчета заранее неизвестна) необходимо создавать отчет вручную, с помощью кода.
Для создания отчета вручную необходимо выполнить следующие шаги:
очистить отчет
добавить источники данных
добавить страницу "Данные"
добавить страницу отчета
добавить бэнды на страницу
настроить свойства бэндов и подключить их к данным
добавить объекты на каждый бэнд
настроить свойства объектов и подключить их к данным
Рассмотрим создание простого отчета типа "список". Предполагается, что у нас есть компоненты frxReport1: TfrxReport и frxDBDataSet1: TfrxDBDataSet (последний подключен к данным из DBDEMOS, таблица Customer.db). Наш отчет будет содержать одну страницу с бэндами report title и master data. На бэнде report title будет объект с текстом "Hello FastReport!", а на master data - объект со ссылкой на поле "CustNo".
Pascal:
var
DataPage: TfrxDataPage;
Page: TfrxReportPage;
Band: TfrxBand;
DataBand: TfrxMasterData;
Memo: TfrxMemoView;
{ очищаем отчет }
frxReport1.Clear;
{ добавляем источник данных в список доступных для отчета }
frxReport1.DataSets.Add(frxDBDataSet1);
{ добавляем страницу "Данные" }
DataPage := TfrxDataPage.Create(frxReport1);
{ добавляем страницу }
Page := TfrxReportPage.Create(frxReport1);
{ создаем уникальное имя }
Page.CreateUniqueName;
{ устанавливаем размеры полей, бумаги и ориентацию по умолчанию }
Page.SetDefaults;
{ меняем ориентацию бумаги }
Page.Orientation := poLandscape;
{ добавляем report title }
Band := TfrxReportTitle.Create(Page);
Band.CreateUniqueName;
{ для бэнда достаточно установить координату Top и высоту }
{ обе координаты - в пикселах }
Band.Top := 0;
Band.Height := 20;
{ добавляем объект на report title }
Memo := TfrxMemoView.Create(Band);
Memo.CreateUniqueName;
Memo.Text := 'Hello FastReport!';
Memo.Height := 20;
{ этот объект будет растянут на ширину бэнда }
Memo.Align := baWidth;
{ добавляем master data }
DataBand := TfrxMasterData.Create(Page);
DataBand.CreateUniqueName;
DataBand.DataSet := frxDBDataSet1;
{ координата Top не должна пересекать ранее добавленный бэнд! }
DataBand.Top := 100;
DataBand.Height := 20;
{ добавляем объект на master data }
Memo := TfrxMemoView.Create(DataBand);
Memo.CreateUniqueName;
{ подключаем к данным }
Memo.DataSet := frxDBDataSet1;
Memo.DataField := 'CustNo';
Memo.SetBounds(0, 0, 100, 20);
{ выравниваем текст по правому краю объекта }
Memo.HAlign := haRight;
{ показываем отчет }
frxReport1.ShowReport;
C++:
TfrxDataPage * DataPage;
TfrxReportPage * Page;
TfrxBand * Band;
TfrxMasterData * DataBand;
TfrxMemoView * Memo;
// очищаем отчет
frxReport1->Clear();
// добавляем источник данных в список доступных для отчета
frxReport1->DataSets->Add(frxDBDataset1);
// добавляем страницу "Данные"
DataPage = new TfrxDataPage(frxReport1);
// добавляем страницу
Page = new TfrxReportPage(frxReport1);
// создаем уникальное имя
Page->CreateUniqueName();
// устанавливаем размеры полей, бумаги и ориентацию по умолчанию
Page->SetDefaults();
// меняем ориентацию бумаги
Page->Orientation = poLandscape;
// добавляем report title
Band = new TfrxReportTitle(Page);
Band->CreateUniqueName();
// для бэнда достаточно установить координату Top и высоту
// обе координаты - в пикселах
Band->Top = 0;
Band->Height = 20;
// добавляем объект на report title
Memo = new TfrxMemoView(Band);
Memo->CreateUniqueName();
Memo->Text = "Hello FastReport!";
Memo->Height = 20;
// этот объект будет растянут на ширину бэнда
Memo->Align = baWidth;
// добавляем master data
DataBand = new TfrxMasterData(Page);
DataBand->CreateUniqueName();
DataBand->DataSet = frxDBDataset1;
// координата Top не должна пересекать ранее добавленный бэнд!
DataBand->Top = 100;
DataBand->Height = 20;
// добавляем объект на master data
Memo = new TfrxMemoView(DataBand);
Memo->CreateUniqueName();
// подключаем к данным
Memo->DataSet = frxDBDataset1;
Memo->DataField = "CustNo";
Memo->SetBounds(0, 0, 100, 20);
// выравниваем текст по правому краю объекта
Memo->HAlign = haRight;
// показываем отчет
frxReport1->ShowReport(true);
Поясним некоторые моменты.
Все источники данных, которые будут использованы в отчете, необходимо добавить в список источников данных. В нашем случае это делается с помощью строки frxReport1.DataSets.Add(frxDBDataSet1). Если этого не сделать, отчет работать не будет.
Страница "Данные" в отчете должна присутствовать для того, чтобы можно было создавать внутренние источники данных в отчете.
Вызов Page.SetDefaults не обязателен - в этом случае страница будет иметь формат А4 и поля по 0мм. SetDefaults устанавливает поля по 10мм, и берет размер и ориентацию страницы, которую имеет принтер по умолчанию.
Добавляя бэнды на страницу, вы должны следить, чтобы они не пересекались друг с другом. Для этого достаточно установить соответствующие координаты Top и Height. Координаты Left и Width менять смысла не имеет – горизонтальный бэнд всегда имеет ширину страницы, на которой он расположен (это не так, если речь идет о вертикальном бэнде – в этом случае надо устанавливать свойства Left и Width, а свойства Top и Height не менять). Кроме того, следует помнить, что порядок расположения бэндов на странице имеет значение. Всегда располагайте бэнды таким образом, как вы это сделали бы в дизайнере.
Координаты и размеры объектов задаются в пикселах. Т.к. свойства Left, Top, Width, Height всех объектов имеют тип Extended, вы можете указывать нецелочисленные значения. Для перевода пикселов в сантиметры и дюймы определены следующие константы:
fr01cm = 3.77953; // 96 / 25.4
fr1cm = 37.7953;
fr01in = 9.6;
fr1in = 96;
Например, задать высоту бэнда, равную 5мм, можно так:
Band.Height := fr01cm * 5;
Band.Height := fr1cm * 0.5;