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

отредактировано 21:22 Раздел: FastReport 2.xx VCL
Возможно ли создать отчет полностью во время выполнения программы, т.к. количество столбцов, их тип и источник данных для них могут меняться во время работы программы.

Комментарии

  • отредактировано 21:22
    Вот здесь кусок кода приводили:
    http://www.fastreports.net/ru/forum/index.php?showtopic=380

  • kotkot
    отредактировано 21:22
    Вот пример одной процедуры (frReport и frDBDataSet должны быть на форме или в принципе можно тоже руками создать):

    procedure TForm1.InitReport( ADataset: TDataset);
    var
    frPage: TfrPage;
    frTitleBand, frHeaderBand, frDataBand: TfrBandView;
    frView: TfrView;
    i: Integer;
    CurrLeft, CurrWidth: Integer;
    begin
    frDBDataSet.DataSet := ADataset;

    // Create Page
    frReport.Pages.Clear;
    frReport.Pages.Add;
    frPage := frReport.Pages[0];

    with frPage do begin
    ChangePaper( pgSize, pgWidth, pgHeight, pgBin, TPrinterOrientation( poLandscape ));
    frPage.pgMargins.Left := 20;
    frPage.pgMargins.Right := 20;
    frPage.pgMargins.Top := 20;
    frPage.pgMargins.Bottom := 20;
    if poLandscape = poLandscape then
    frPage.pgMargins.Top := 50
    else
    frPage.pgMargins.Left := 50;
    end;
    CurrLeft := frPage.pgMargins.Left;

    // Create ReportTitle Band ===================================================
    frTitleBand := TfrBandView.Create;
    frTitleBand.SetBounds( 0, 20, 0, 70); // Top and Height in Pixels
    frTitleBand.BandType := btReportTitle;
    frPage.Objects.Add( frTitleBand);

    // Create Memo
    frView := TfrMemoView.Create;
    frView.SetBounds( 20, 50, 200, 30);
    frView.BandAlign := baWidth;
    frView.Prop := frtaLeft;
    frView.Prop := 2;
    frView.Prop := 20;
    FrView.Memo.Add( edReportTitle.Text);
    frPage.Objects.Add( frView);

    // Create MasterHeader Band ==================================================
    frHeaderBand := TfrBandView.Create;
    frHeaderBand.SetBounds( 0, 110, 0, 17); // Top and Height in Pixels
    frHeaderBand.BandType := btMasterHeader;
    frHeaderBand.Prop := True;
    frPage.Objects.Add( frHeaderBand);

    // Create MasterData Band ===
    frDataBand := TfrBandView.Create;
    frDataBand.SetBounds( 0, 130+17, 0, 20); // Top and Height in Pixels
    frDataBand.BandType := btMasterData;
    frDataBand.DataSet := 'frDBDataSet';
    frPage.Objects.Add( frDataBand);

    CurrLeft := frPage.pgMargins.Left;

    // Create Data Fields ========================================================
    for i:=0 to frDBDataSet.Dataset.Fields.Count-1 do begin
    CurrWidth := 7 * frDBDataSet.Dataset.Fields.DisplayWidth; // besser: Canvas.TextWidth
    if CurrWidth > frPage.Prop -frPage.pgMargins.Left -frPage.pgMargins.Right then
    CurrWidth := frPage.Prop -frPage.pgMargins.Left -frPage.pgMargins.Right;

    if CurrLeft + CurrWidth + frPage.pgMargins.Right > frPage.Prop then begin
    frReport.Pages.Add;
    frPage := frReport.Pages[frReport.Pages.Count-1];
    with frPage do begin
    ChangePaper( pgSize, pgWidth, pgHeight, pgBin, TPrinterOrientation(poLandscape));
    frPage.pgMargins.Left := 20;
    frPage.pgMargins.Right := 20;
    frPage.pgMargins.Top := 20;
    frPage.pgMargins.Bottom := 20;
    if poLandscape = poLandscape then
    frPage.pgMargins.Top := 50
    else
    frPage.pgMargins.Left := 50;
    end;

    CurrLeft := frPage.pgMargins.Left;

    // Create MasterHeader Band ===
    frHeaderBand := TfrBandView.Create;
    frHeaderBand.SetBounds( 0, 110, 0, 17); // Top and Height in Pixels
    frHeaderBand.BandType := btMasterHeader;
    frHeaderBand.Prop := True;
    frPage.Objects.Add( frHeaderBand);

    // Create MasterData Band ===
    frDataBand := TfrBandView.Create;
    frDataBand.SetBounds( 0, 130+17, 0, 20); // Top and Height in Pixels
    frDataBand.BandType := btMasterData;
    frDataBand.DataSet := 'frDBDataSet';
    frPage.Objects.Add( frDataBand);
    end;

    // Field-Caption
    frView := TfrMemoView.Create;
    frView.SetBounds( CurrLeft, 110, CurrWidth, 17);
    FrView.Memo.Add( frDBDataSet.Dataset.Fields.DisplayLabel);

    FrView.Prop := 15;
    FrView.Prop := clNavy;
    FrView.Prop := clWhite;
    FrView.Prop := 2; // fsBold;
    frPage.Objects.Add( frView);

    // Field-Data
    frView := TfrMemoView.Create;
    frView.SetBounds( CurrLeft, 130+17, CurrWidth, 20);
    FrView.Memo.Add('.FieldName + '"]');
    FrView.Prop := 15;

    frPage.Objects.Add( frView);

    CurrLeft := CurrLeft + CurrWidth;
    end;

    end;

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.