針對大量報表需求,利用動態建立元件技術,讀取 TDBGrid 的欄位標題、寬度、字型、對齊等屬性,在 TQuickRep 上自動建立對應的 TQRLabel (標題)、TQRDBText (資料)、TQRShape (格線),並封裝為 TGridPrint 類別,對外提供設定總標題、欄寬、標題列高、資料列高等介面供使用者自訂。
struct NEWFIELDTYPE {
AnsiString sTitle; // 欄位標題
int iWidth; // 欄寬
TQRLabel *pLabel; // 標題標籤
TQRDBText *pDBText; // 資料文字
TQRShape *pShapeTitle; // 標題列分隔線
TQRShape *pShapeData; // 資料列分隔線
};
class TGridPrint {
public:
TGridPrint(TQuickRep *pSrcQuickRep, TDBGrid *pSrcDBGrid,
TQRBand *SrcTitleBand1, TQRBand *SrcColumnHeaderBand1,
TQRBand *SrcDetailBand1);
~TGridPrint();
void DoPreview(); // 列印預覽
void SetPrntTitle(AnsiString sTitle); // 設定總標題
void SetColumnsWidth(int *ColumnsWidth);// 設定各欄寬度
void SetHeadRectHeight(int iHeight); // 設定標題列高
void SetDetailRectHeight(int iHeight); // 設定資料列高
private:
TDBGrid *pDBGrid; TDataSet *pDataSet; TQuickRep *pQuickRep;
TQRBand *TitleBand1, *ColumnHeaderBand1, *DetailBand1;
TQRLabel *pTitleLabel;
TQRShape *pHeadRect, *pDetailRect;
int iHeadRectHeight, iDetailRectHeight, _iTotalWidth, _iIntClearance, _iFieldCount;
NEWFIELDTYPE _arrayFieldType[40]; // 支援最多 40 欄位
void AutoAdjustColumnsWidth(); // 自動調整欄寬
};
DataSet。AutoAdjustColumnsWidth)。TQRShape)。依序釋放所有動態建立的元件 (Label, DBText, Shape)。
#include "GridPrint.h"
#include "RepRst.h" // 包含 TQuickRep 的表單
TFrmRepRst *pFrmRepRst = new TFrmRepRst(NULL);
TGridPrint *pGridPrint = new TGridPrint(
pFrmRepRst->QuickRep1, DBGrid1,
pFrmRepRst->TitleBand1, pFrmRepRst->ColumnHeaderBand1, pFrmRepRst->DetailBand1);
pGridPrint->DoPreview();
delete pGridPrint; delete pFrmRepRst;