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里面使用QUICK REPORT 打印的种种问题

1.使用针式打印机连续打印,走纸的文件解决, 设计的时候:quick report选择cusomter paper,打印的时候,选择打印机纸张大小为实际一致的纸张,如果没有那么自定义纸张单位换算:  ...
  • liuhualiang
  • liuhualiang
  • 2004年08月02日 11:21
  • 2646

Quickreport万能打印程序

作程序经常使用报表打印,使用delphi编程最长用的是使用quickreport做报表打印,rave是在delphi7中才出现的,我用quickreport做了一个万能打印程序,由于时间紧迫,没有时间...
  • newsunet
  • newsunet
  • 2004年07月14日 16:07
  • 2016

深入QuickReport一

报表是数据库应用程序的基本组成部分之一,完整的数据库应用程序总要提供报表功能。与传统的数据库应用程序设计工具相比,C++ Builder中提供了QuickReport组件,使C++ Builder的数...
  • zang141588761
  • zang141588761
  • 2016年08月23日 10:26
  • 1051

用 Delphi 实现报表的横向分组打印

    Delphi 内置的 QuickReport 报表系统为我们快速制作报表提供了有力的支持。对于一些简单的报表,包括纵向分组多表头报表,我们几乎不用写一句代码,就可以方便地完成报表的制作。但是对...
  • zhangking
  • zhangking
  • 2003年09月23日 01:29
  • 2526

FastReport与QuickReport的优缺对比

FastReport(FR)与QuickReport(QR)的优缺对比从我FR与QR的使用感受来看,现在各自的主要优缺点例出,给朋友们参考:1>QR优点,FR的缺点A、很方便的制作中国式报表,即主数据...
  • baronyang
  • baronyang
  • 2006年04月05日 17:49
  • 2752

QuickReport Delphi7完全解决方案

前言      本人很不喜欢QuickReport,因为其有太多问题,也太不灵活。但在开发过程中,还是无法避免接触到这种问题,特别是历史遗留下来的控件,几乎是不可能把那么多的报表去换成其他报表控件的。...
  • fbysss
  • fbysss
  • 2004年10月28日 16:34
  • 6677

Delphi报表控件QuickReport VS FastReport对比

从Delphi中加入报表控件之后到最新的Delphi7之前,QuickReport一直是Delphi附带的报表控件,抛却商业的利益不谈,QuickReport能够长期占领Delphi的报表控件也在一定...
  • stefan520
  • stefan520
  • 2014年04月08日 09:52
  • 731

基于WEB的J2EE报表解决方案

1. JReporthttp://www.jinfonet.com/ 2. StyleReporthttp://www.inetsoft.com/inetsoft/index.html 3. Form...
  • dotyboy
  • dotyboy
  • 2006年11月24日 23:52
  • 1808

C++ builder XE8下安装QuickReport

我原来一直用的是C++Builder 6 ,因为只是写一些数据库应用,所以就没有换高版本的IDE,最近心血来潮,想升级一下自己的开发工具,于是乎下载安装了 RAD Studio XE8,由于不会用Fa...
  • red7799
  • red7799
  • 2016年02月29日 22:38
  • 592

delphi quickreport 打印时报 stackoverflow问题处理

问题截图如下: 经检查,发生这种情况的原因是: 1、代码中队quick report报表设置了以下的属性: fmKindProductCard.qrRepareSmallCard...
  • jzt_designer
  • jzt_designer
  • 2016年12月09日 17:58
  • 454
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QuickReport通用报表打印程序
举报原因:
原因补充:

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