⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dy_qreport.pas

📁 很好地delphi书籍源码
💻 PAS
字号:
unit Dy_QReport;

interface
uses
  QuickRpt,
  QRCTRLS,
  dbgrids,
  db;

const MaxNum=40;

type
 TagFieldType=record
 sTitle: String ; //字段标题名称
 iWidth: integer ; //表格单元的宽度
 pLabel: TQRLabel; //字段标题控件
 pDBText:TQRDBText; //显示的数据控件
 pShapeTitle,pShapeData: TQRShape; //字段标题和数据的表格分隔条
 end;

 FieldPointer=^TagFieldType;

 TGridPrint=class
 public
 constructor create(pSrcQuickRep:TQuickRep; pSrcDBGrid:TDBGrid ;
                    SrcTitleBand1:TQRBand ;SrcColumnHeaderBand1: TQRBand;
                    SrcDetailBand1:TQRBand;Title:string);
 //destructor Destroy;
 procedure DoPreview;
 private
 GridNum    : Integer;
 pDBGrid    : TDBGrid  ;      //将要显示的DBGrid
 pDataSet   : TDataSet ;      //DBGrid对应数据集
 pQuickRep  : TQuickRep ;     //报表控件
 TitleBand1 : TQRBand  ;      //报表的总标题栏
 ColumnHeaderBand1 :TQRBand ; //报表的字段标题栏
 DetailBand1:       TQRBand ;       //报表的数据栏
 pTitleLabel:       TQRLabel; //总标题控件
 pHeadRect  :       TQRShape;
 pDetailRect:       TQRShape; //整个字段标题栏、数据栏的表格矩形控件
 iHeadRectHeight,iDetailRectHeight:integer ; //对应表格矩形框的高度,它们宽度相同
 _iTotalWidth  : integer;      //整个表格的总宽度
 _iIntClearance: integer;   //表格内部数据列到左表格的距离
 _iFieldCount  : integer;   //将要打印的字段数目
 _arrayFieldType :array[1..MaxNum] of FieldPointer; //支持到40个字段的打印
 end;

implementation

Constructor TGridPrint.create( pSrcQuickRep:TQuickRep; pSrcDBGrid:TDBGrid ;
                     SrcTitleBand1:TQRBand ;SrcColumnHeaderBand1: TQRBand;
                     SrcDetailBand1:TQRBand;Title:string);
var  i,PreLeft:integer;
begin
  pQuickRep := pSrcQuickRep; //根据传入参数设置私有变量
  pDBGrid :=   pSrcDBGrid;
  pDataSet :=  pDBGrid.DataSource.DataSet;
  pQuickRep.DataSet := pDataSet;
  GridNum:=pDBGrid.FieldCount;   //设置表格总列数
  if(GridNum > MaxNum) then
    GridNum:=MaxNum;
  TitleBand1 := SrcTitleBand1;
  ColumnHeaderBand1 := SrcColumnHeaderBand1;
  DetailBand1:= SrcDetailBand1;
  pTitleLabel := TQRLabel.Create(pQuickRep); //生成并设置总标题标签的属性
  pTitleLabel.Parent := TitleBand1;
  pTitleLabel.Caption := Title;
  pTitleLabel.Font.Name:='宋体';
  pTitleLabel.Font.Size:=20;
  pTitleLabel.Left:=(TitleBand1.Width - pTitleLabel.Width)div 2;
  _iTotalWidth:=0; //计算出表格各列单元宽度和整个表格的总宽度

  for i:=1 to GridNum do
  begin
    if pDBGrid.Columns.Items[i-1].Visible=false then continue;
    new(_arrayFieldType[i]);
    _arrayFieldType[i]^.iWidth:= pDBGrid.Columns.Items[i-1].Width;
    _iTotalWidth:=_iTotalWidth+ _arrayFieldType[i]^.iWidth;
  end ;

  PreLeft := (TitleBand1.Width-_iTotalWidth) div 2; //使整个表格居中
  pHeadRect:=TQRShape.Create(pQuickRep); //生成并设置字段标题栏的矩形框
  pHeadRect.Parent:=ColumnHeaderBand1;
  pHeadRect.Left := PreLeft;
  pHeadRect.Top := 0;
  pHeadRect.Width := _iTotalWidth;
  pHeadRect.Height:= pHeadRect.Parent.Height;
  pDetailRect:=TQRShape.Create(pSrcQuickRep); //生成设置数据行的矩形框
  pDetailRect.Parent:= DetailBand1;
  pDetailRect.Left := PreLeft;
  pDetailRect.Top := -1; //
  pDetailRect.Width := _iTotalWidth;
  pDetailRect.Height:= pDetailRect.Parent.Height+ 1; // 1
  _iIntClearance:=3;

  for i:=1 to GridNum do //动态生成各字段
  begin //该字段的固定标题栏
     if pDBGrid.Columns.Items[i-1].Visible=false then continue;
     _arrayFieldType[i]^.pLabel:=TQRLabel.Create(pQuickRep); //标题控件
     _arrayFieldType[i]^.pLabel.Parent:= ColumnHeaderBand1;
     //字段标题名称
     _arrayFieldType[i]^.pLabel.Caption:=pDBGrid.Columns.Items[i-1].Title.Caption;
  //字段标题的字体
     _arrayFieldType[i]^.pLabel.Font:= pDBGrid.Columns.Items[i-1].Title.Font;
     _arrayFieldType[i]^.pLabel.Alignment:=
                           pDBGrid.Columns.Items[i-1].Title.Alignment; //对齐方式
     _arrayFieldType[i]^.pLabel.Left := PreLeft+_iIntClearance;
     _arrayFieldType[i]^.pLabel.Width :=
                              _arrayFieldType[i]^.iWidth-2*_iIntClearance;
     _arrayFieldType[i]^.pLabel.Height:= _arrayFieldType[i]^.pLabel.Font.Height;
     _arrayFieldType[i]^.pLabel.Top:=pHeadRect.Top+(pHeadRect.Height+
                                   _arrayFieldType[i]^.pLabel.Height) div 2;
     _arrayFieldType[i]^.pShapeTitle:=
                              TQRShape.Create(pQuickRep);//该字段右边的分隔竖条
     _arrayFieldType[i]^.pShapeTitle.Parent:= ColumnHeaderBand1;
     _arrayFieldType[i]^.pShapeTitle.Left:=PreLeft + _arrayFieldType[i]^.iWidth;
     _arrayFieldType[i]^.pShapeTitle.Top := 0;
     _arrayFieldType[i]^.pShapeTitle.Width:= 1;
     if( i = GridNum) then //最后一列的分隔竖条宽度为0
         _arrayFieldType[i]^.pShapeTitle.Width:= 0;
     _arrayFieldType[i]^.pShapeTitle.Height:=
                                _arrayFieldType[i]^.pShapeTitle.Parent.Height;
  //显示的数据栏
     _arrayFieldType[i]^.pDBText:=
                             TQRDBText.Create(pQuickRep);//该字段对应的文本控件
     _arrayFieldType[i]^.pDBText.Parent:=DetailBand1;
     _arrayFieldType[i]^.pDBText.DataSet := pDataSet; //数据集
     _arrayFieldType[i]^.pDBText.DataField :=
                                 pDBGrid.Columns.Items[i-1].FieldName; //字段名
     _arrayFieldType[i]^.pDBText.Font := pDBGrid.Columns.Items[i-1].Font; //字体
     _arrayFieldType[i]^.pDBText.Alignment:=
                                pDBGrid.Columns.Items[i-1].Alignment; //对齐方式
     _arrayFieldType[i]^.pDBText.Left := PreLeft+_iIntClearance;
     _arrayFieldType[i]^.pDBText.Width :=
                                     _arrayFieldType[i]^.iWidth-2*_iIntClearance;
     _arrayFieldType[i]^.pDBText.Height:= _arrayFieldType[i]^.pDBText.Font.Height;
     _arrayFieldType[i]^.pDBText.Top:=pDetailRect.Top+(pDetailRect.Height+
                                    _arrayFieldType[i]^.pDBText.Height) div 2 -3;
     _arrayFieldType[i]^.pShapeData:=
                             TQRShape.Create(pQuickRep); //该数据右边的分隔竖条
     _arrayFieldType[i]^.pShapeData.Parent:= DetailBand1;
     _arrayFieldType[i]^.pShapeData.Left := PreLeft+_arrayFieldType[i]^.iWidth;
     _arrayFieldType[i]^.pShapeData.Top := 0;
    _arrayFieldType[i]^.pShapeData.Width:= 1;
    if( i=GridNum ) then//最后一列的分隔竖条宽度为0
       _arrayFieldType[i]^.pShapeData.Width:= 0;
    _arrayFieldType[i]^.pShapeData.Height:=
                                    _arrayFieldType[i]^.pShapeData.Parent.Height;
    PreLeft:=_arrayFieldType[i]^.pShapeTitle.Left; //下列字段的左位置
  end
end ;

procedure TGridPrint.DoPreview;
begin
 pQuickRep.preview();
end ;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -