QuickReport通用报表打印程序

原创 2004年07月15日 17:56:00

 

unit unit_QReport_lxr;
{
    模块名:通用报表打印
    作者:尹曙光
    开发日期:2004-07-15
    网址:www.sinoprise.com
    本程序适用于GNU协议
    下面是使用方法:
    procedure TFrm_sbcx_yin.BitBtn_xxxx_dyClick(Sender: TObject);
    var
       qp:TQReport_lxr;
    begin
       qp:=TQReport_lxr.Create(self);
       qp.bb_title.Caption:='设备类别查询';
       if qp.bb_prepare(ADOQuery_xxxx,false)
       then begin
            qp.Prepare;
            qp.Preview;
            qp.hide;
       end;
      qp.free;
    end;
}
interface

uses Windows, SysUtils, Messages, Classes, Graphics, Controls,
  StdCtrls, ExtCtrls, Forms, QuickRpt, QRCtrls, DB, ADODB,Dialogs;

type
  TQReport_lxr = class(TQuickRep)
    theDetailBand: TQRBand;
    TitleBand1: TQRBand;
    bb_title: TQRLabel;
    theColumnHeaderBand: TQRBand;
  private
     function GetSL():TQRShape;
     function GetHL():TQRShape;

  public
    function bb_prepare(objDataSet:TDataSet;haveFirstCol:boolean):boolean;
  end;

var
  QReport_lxr: TQReport_lxr;

implementation

{$R *.DFM}
file://竖线
function TQReport_lxr.GetSL():TQRShape;
begin
  result:=TQRShape.Create(self);
  result.Shape:=qrsVertLine;
  result.Width:=3;
end;
file://横线
function TQReport_lxr.GetHL():TQRShape;
begin
  result:=TQRShape.Create(self);
  result.Shape:=qrsHorLine;
  result.Height:=3;
end;

function TQReport_lxr.bb_prepare(objDataSet:TDataSet;haveFirstCol:boolean):boolean;
file://haveFirstCol:boolean;是否打印dataset中的第一列,true打印,false 不打印
var
     Field_Vertical_space_div_2,Field_Horizontal_space_div_2:integer; file://字段的垂直距离的1/2,字段的水平距离的1/2
     Field_width,Field_height:integer;//字段的宽度,字段的高度
     Columns_count:integer;//每行显示的字段个数
     Current_row,Current_col:integer;//现在输出第几行,列;首行,列为1,
     rp_left,rp_width:integer;//报表的开始左边距,报表的宽度
     aVerticalLinePosition:array of integer;//记录每列的分割线的位置
     hafn:integer;  file://字段输出列的开始序号

     qr:TQRShape;  file://在报表上划线
     la:TQRLabel ; file://字段表签
     te:TQRDBText; file://字段内容

     i:integer;//循环变量

begin

    file://数据集是否打开
    if  (objDataSet.Fields.Count<=0)then
    begin
         messagedlg('请您先做查询,再打印报表!',mtInformation,[mbyes],0);
         result:=false;
         exit;
    end;
    file://设置初始值
    Field_Vertical_space_div_2   :=5;                      file://字段的垂直距离的1/2
    Field_Horizontal_space_div_2 :=5;                      file://字段的水平距离的1/2
    Field_width                  :=100;                     file://字段的宽度
    Field_height                 :=17;                      file://字段的高度
    rp_width                     :=theDetailBand.Width;     file://报表的宽度
    rp_left                      :=0;                       file://报表的开始左边距
    Columns_count:=rp_width div (Field_width+Field_Horizontal_space_div_2*2);//每行显示的字段个数
    SetLength(aVerticalLinePosition,Columns_count+1);
    file://本页的记录集
    DataSet:=objDataSet;

    file://注意:是否放弃objDataSet中的第一列
    if haveFirstCol
    then hafn:=0
    else hafn:=1;

    file://输出字段表头
          file://上边的横线
    qr:=GetHL;
    qr.Parent:=theColumnHeaderBand;
    qr.Top:=0;
    qr.Left:=rp_left;
    qr.Width:=rp_width;

    aVerticalLinePosition[0]:=rp_left;

    Current_row:=1;//现在输出第几行,首行为1
    Current_col:=1;
    for i:=hafn  to objDataSet.FieldCount-1 do
    begin
        theColumnHeaderBand.Height:=current_row*(Field_height+Field_Vertical_space_div_2*2);
        file://计算字段表头的高度
        la:=TQRLabel.Create(self);
        la.Parent:=theColumnHeaderBand;
        la.Caption:=objDataSet.Fields[i].FieldName;
        la.Width:=Field_width;
        la.Height:=Field_height;
        la.Left:=(2*Current_col-1)*Field_Horizontal_space_div_2+(Current_col-1)*Field_width;
        la.Top:=Current_row*Field_Vertical_space_div_2+(Current_row-1)*Field_height;


        file://计算竖线的位置
        aVerticalLinePosition[Current_col]:=Current_col*(Field_width+Current_col*2);

        if Current_col=Columns_count
        then begin
          Current_col:=1;
          Current_row:=Current_row+1;
        end
        else  Current_col:=Current_col+1;
    end;

    file://修改最后一列的位置
    aVerticalLinePosition[high(aVerticalLinePosition)]:=rp_width;
    file://在表头上划竖线
    for i:=low(aVerticalLinePosition)  to high(aVerticalLinePosition)  do
    begin
        qr:=GetSL;
        qr.Parent:=theColumnHeaderBand;
        qr.Top:=0;
        qr.Left:=aVerticalLinePosition[i];
        qr.Height := theColumnHeaderBand.Height;
    end;
    file://报表部分上边的横线
    qr:=GetHL;
    qr.Parent:=theDetailBand;
    qr.Top:=0;
    qr.Left:=rp_left;
    qr.Width:=rp_width;

    Current_col:=1;
    Current_row:=1;

    for i:=hafn  to objDataSet.FieldCount-1 do
    begin
        file://计算内容部分的高度
        theDetailBand.Height:=current_row*(Field_height+Field_Vertical_space_div_2*2);
        te:=TQRDBText.Create(self);
        te.DataSet:=objDataSet;
        te.Parent:=theDetailBand;
        te.DataField:=objDataSet.Fields[i].FieldName;
        te.Width:=Field_width;
        te.Height:=Field_height;
        te.Left:=(2*Current_col-1)*Field_Horizontal_space_div_2+(Current_col-1)*Field_width;
        te.Top:=Current_row*Field_Vertical_space_div_2+(Current_row-1)*Field_height;
        te.AutoStretch:=true;
        if Current_col=Columns_count
        then begin
          Current_col:=1;
          Current_row:=Current_row+1;
        end
        else  Current_col:=Current_col+1;
     end;

      file://在内容部分上划竖线
    for i:=low(aVerticalLinePosition)  to high(aVerticalLinePosition)  do
    begin
        qr:=GetSL;
        qr.Parent:=theDetailBand;
        qr.Top:=0;
        qr.Left:=aVerticalLinePosition[i];
        qr.Height := theDetailBand.Height;
    end;
   qr:=GetHL;
   qr.Parent:=theDetailBand;
   qr.Top:= theDetailBand.Height;
   qr.Left:=rp_left;
   qr.Width:=rp_width;
   result:=true;
  end;
end.

本文原名:quickreport万能打印程序,此为修改版,主要增加了报表上的表格显示,程序 也进行了优化(www.sinoprise.com).

 

delphi开发学习五:QuickReoprt报表控件使用实例

报表是数据库应用程序设计中非常重要的一部分,数据库应用程序通常都要生成报表,并且打印出来。      在Delphi7.0中,默认情况下没有直接使用的QuickReport组件,使用时需先进行手工安装...
  • u011846249
  • u011846249
  • 2015年08月20日 21:46
  • 2357

DELPHI 7.0软件 自带有报表 Quick Report组件(TQRShape等所有组件 说明)

DELPHI7.0软件自带有报表Quick Report组件,但是默认的情况下,工具栏中是没有的,需要手动添加,步骤:   component->install packages->add->\bo...
  • u011704389
  • u011704389
  • 2014年02月26日 15:41
  • 1517

使用 MFC 编写打印程序

使用 MFC 编写打印程序 作者:戎亚新 南京航空航天大学仿真与控制实验室 下载源代码 摘要   本文首先介绍了利用MFC提供的文档视图框架来实现一个打印程序,实现打印预览,...
  • ccx_john
  • ccx_john
  • 2013年11月08日 23:49
  • 2500

通用报表合并程序自动汇总结构相同的多个表

  • 2010年07月29日 10:55
  • 167KB
  • 下载

OPC通用报表软件(General_reports)

OPC通用报表使用说明书 一、报表简介 OPC通用报表软件(General_reports)是为解决工业生产需要,而组态软件自带的报表功能不足或者需要工程师编写大量的脚本语言才能实现报表这一背景而开发...
  • opc_report
  • opc_report
  • 2015年05月26日 17:22
  • 1114

通用报表合并汇总v3.0

  • 2005年12月02日 10:36
  • 298KB
  • 下载

通用报表解决方案:SQL Server Reporting Services是什么

SQL Server Reporting Services是什么?     SQL Server Reporting Services(SSRS),微软企业级报表平台,和SQL Server Int...
  • moon66sun
  • moon66sun
  • 2012年03月28日 16:46
  • 1013

通用报表与查询软件

  • 2006年03月16日 00:00
  • 3.59MB
  • 下载

通用报表合并

  • 2005年12月02日 10:36
  • 193KB
  • 下载

通用报表汇总系统1.0

  • 2005年12月02日 10:36
  • 26KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QuickReport通用报表打印程序
举报原因:
原因补充:

(最多只允许输入30个字)