字段名、字段数不确定时,用 FastReport 动态生成报表
放置有效地Table和DataSource,frxReport 和 frxDBDataSet,不需要再报表设计器内放置任何控件,直接由代码生成报表。
但如果是交叉表,FastReport 也提供另外一种解决方案 TfrxCrossView 进行列表
以下是全代码生成报表的简单例子。
TfrxDataPage * DataPage;
TfrxReportPage * Page;
TfrxBand * Band;
TfrxMasterData * DataBand;
TfrxMemoView * Memo;
// 清除原报表内容
frxReport1->Clear();
// 设置 Report 的 DataSet
frxReport1->DataSets->Add(frxDBDataset1);
// 添加 Report 的 Data 页
DataPage = new TfrxDataPage(frxReport1);
// 增加报表显示内容
Page = new TfrxReportPage(frxReport1);
Page->CreateUniqueName();
// 设置 Fields 的默认尺寸
Page->SetDefaults();
// 页面方向
Page->Orientation = poLandscape;
// 页面边距
Page->TopMargin = 20;
Page->LeftMargin = 20;
Page->TopMargin = 20;
Page->BottomMargin = 20;
// 创建报表 Title Band
Band = new TfrxReportTitle(Page);
Band->CreateUniqueName();
Band->Top = 0;
Band->Height = 20;
// 创建显示 Field 的 Memo
Memo = new TfrxMemoView(Band);
Memo->CreateUniqueName();
Memo->Text = "Hello FastReport!";
Memo->Height = 20;
// 风格
Memo->Align = baWidth;
// 创建 DataBand
DataBand = new TfrxMasterData(Page);
DataBand->CreateUniqueName();
DataBand->DataSet = frxDBDataset1;
DataBand->Top = 100;
DataBand->Height = 20;
// 将 Memo 添加到 DataBand 上
Memo = new TfrxMemoView(DataBand);
Memo->CreateUniqueName();
// 连接数据
Memo->DataSet = frxDBDataset1;
// 显示 username 字段
Memo->DataField = "username";
Memo->SetBounds(0, 0, 100, 20);
// memo 带边框
Memo->Frame->Typ << ftLeft << ftRight << ftTop << ftBottom;
// 风格
Memo->HAlign = haRight;
// 报表显示
frxReport1->ShowReport(true);