📄 dy_qreport.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 + -