Search Results for

    Show / Hide Table of Contents

    Создание формы отчета с помощью кода

    Как правило, большинство отчетов вы будете создавать с помощью дизайнера. Тем не менее, в некоторых случаях (например, форма отчета заранее неизвестна) необходимо создавать отчет вручную, с помощью кода.

    Для создания отчета вручную необходимо выполнить следующие шаги:

    • очистить отчет

    • добавить источники данных

    • добавить страницу "Данные"

    • добавить страницу отчета

    • добавить бэнды на страницу

    • настроить свойства бэндов и подключить их к данным

    • добавить объекты на каждый бэнд

    • настроить свойства объектов и подключить их к данным

    Рассмотрим создание простого отчета типа "список". Предполагается, что у нас есть компоненты 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; 
    
    Back to top © 1998-2024 Copyright ООО «Быстрые отчеты»