没做过报表,越详细越好!
我想把dbgrid1 里的内容,预览,打印出来. 要求能实际一个ID一页,不管一个ID有几条数据.
A4纸张,能纵打,模打,设置纸张格式.有想关代码的给一份,谢谢!

解决方案 »

  1.   

    FastReport、ReportMachine 可实现,易学易用
      

  2.   

    可以使用EhGrid第三方控件,直接支持打印!
      

  3.   

    DELPHI7.0软件自带有报表Quick Report组件,但是默认的情况下,工具栏中是没有的,需要手动添加,步骤:component->install packages->add->\borland\bin\dclqrt70.bpl
     
    一、组件功能简介 上面的两个图是QuickReport组件页的中所有组件,在BCB6中提供给我们使用的不会少于上面的23个的。 下表是按上图中组件的位置先后,对各控件的使用功能逐一做了简单的介绍: 1)QuickRep 
    带有坐标,作为其他报表控件(如TQRBand)的容器,通过它的Band属性可以自动添加各种类型的TQRBand 
    重要属性 (Properties) 
    使用说明 DataSet 连结数据来源,一般是ADO/BDE连接组件的名字 Page 
      
    纸张的设置,可展开 BottomMargin 
    10.0mm 
    报表下边界尺寸 Columns 

    报表分栏数,默认为1栏 ColumnSpace 
    0.0mm 
    报表栏与栏间隔尺寸,Columns值大于1时有效 LeftMargin 
    10.0mm 
    报表左边界尺寸 Length 
    210.0mm 
    报表长度尺寸,与PaperSize设置相关 Orientation 
    poPortrait 
    poLandscape 
    报表方向 打印方向,有下面两个值:直印 poPortrait、横印poLandscape PaperSize 
    A4 
    报表打印纸张大小 RightMargin 
    10.0mm 
    报表右边界尺寸 Ruler 
    true 
    报表标尺显示 TopMargin 
    10.0mm 
    报表上边界尺寸 Width 
    297.0mm 
    报表宽度尺寸,与PaperSize设置相关 PrinterSetting 
      
      Copies 

    报表复制份数 Duplex 
    false 
    报表双重打印 FirstPage 

    报表打印起始页 LastPage 

    报表打印终止页 OutPutBin 
    Auto 
    报表输出种类 ReportTitle 
      
    报表预览打印标题 Units 
    mm 
    报表设计阶段显示标尺单位 2)QRSubDetail 
    建立一个主/明细(master/detail) 报表,连接明细文件的组件 3)QRStringsBand 
    可建立一读取 TStrings 中项次值的组件。在这个组件里有一个Items属性,若Items一个值(一行空、一回车行)都没有,那他上面的组件将不会起作用。当String List Editor中有几行,该组件上的内容就重复几次。若只有一行内容时,她与一个DetailBand是一样的;而多行时,也是差不多的,即先重复该区段内的可视组件几次(几行就几次),然后下一个再重复。比如三行,那就是第一个数据来三行,然后第二个数据来三行,再然后,直到最后 4)QRBand 
    用来确定在报表的不同位置应该显示什么内容,它上面可以放控件 5)QRChildBand 
    在报表中基础子项条列组件。他有一个ParentBand属性,你必须把他与其它band连接起来,只有这样在她里面布置的组件才有效。说直接就是已经有了一个Band而你还需要一个这样的组件,那就用她吧 6)QRGroup 
    在报表中对资料做逻辑上分组的组件。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作 7)QRLabel 
    打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel 。 Caption的内容就打印出来的内容;AutoStretch是布尔型变量,当标签标题在设定范围内不能打印时,该属性将起作用,若为true,报表将继续打印没有打印完的文本,其它需要打印的文本将依次向后移动,反之,则超出部分不被打印 8)QRDBText 
    在报表中具有显示连结资料来源的文字功能的组件 9)QRExpr 
    在报表中具有显示陈述句或计算表示式值的组件 10)QRSysData 
    在报表中具有显示系统信息的组件 11)QRMemo 
    在报表中显示备注文字的组件 12)QRExprMemo 
    在报表中是TQRExpr 和 TQRMemo 的混合组件 13)QRRichText 
    在报表中具有显示区域文字功能的组件 14)QRDBRichText 
    在报表具有显示连结资料来源的区域文字功能的组件 15)QRShape 
    在报表中处理几何图形的组件,如方形、圆角方形、椭圆 16)QRImage 
    在报表中显示静态的图片,包括(BMP,WMF,ICON) 17)QRDBImage 
    在报表中显示从数据库接收的图片 18)QRCompositeReport 
    在报表中连结有关与无关的报表组件 ,用于创建混合报表的组件,可以把两个或两个以上的报表连接在一起,组成一个报表 19)QRPreview 
    在执行阶段建立自订预览报表组件 20)QRTextFilter 
    将报表内容输出于ASCII text 文件 21)QRCSVFilter 
    将报表内容输出于CSV文件 22)QRHTMLFilter 
    将报表内容输出于HTML文件 23)QRChart 
    可以在报表上应用的图表工具二、组件关系表 下图说明了与QuickReport相关组件之间的连接与关系: ┌ADOTable<=| ┌QRChilderBand┐ DataBase<=ADO<=│ |<=====QuickRep<=====├QRBand │<===可视化组件 └ADOQuery<=| └QRStringBand ┘ 数据库 ADO引擎 报表容器组件 Band区段(容器) 可视化控件(显示) 注意:可视化组件必须布置在相应的TQRBand区段上,否则将得不到要显示的内容。BDE引擎与这个差不多,他与ADO只是与库联接方式不一样,对QuickReport没有什么影响。 有时有些朋友不小心把可视化组件放在窗体上了,而没有直接放在TQuickRep组件中的各Band区段上,当把这些组件移到想要放置的区段时,发现这些组件不能用,所以你要切记:一定要把组件放在固定的区段上,并且在区段之间也是不能移动的。我们从Object TreeView中可以看到这些组件与TQuickRep是同一层,当然他不可能为TQuickRep工作了,只有他成为TQuickRep中的某一个区段(某个Band)的下一层时,才能正常工作。并且一定要放在一个区段中,不要误认为放在TQuickRep上就行,如果你直接放在TQuickRep上,你的报表中将得不到什么L 三、最大容器TQuickRep QuickReport中组织层次是特别严格的,TQuickRep是报表组件中必须有的,并且所有Band组件都必须放在她的上面,如果说每个Band区段都是一个小容器的话,那她就是一个最大的容器。想用好QuickReport,TQuickRep绝对不能只看作是一个类似Form的容器,如何用好她对我们用好QuickReport会起到关键性作用。 1)主要属性: DataSet是TDataSet数据集类型变量,用来设置报表使用的数据集组件对象,在主/明细报表中是主报表的数据集。若我们的报表要用到数据库,她必须指定数据库连接工具的名称,否则你的程序将看不到数据库中的数据。当然,在数据库的连接组件中也一定要把Active设为true,让不你只能在程序运行中动态的把数据库打开,而在程序设计阶段将看不到什么L RecordCount 是数据集组件对象中记录的数量; RecordNumber是当前正在打印/显示的记录的索引(第一条记录的索引是0);RecordCount、RecordNumber两个属性只有打开数据集对象之后,它们才可以访问。 若报表组件成功地从数据集组件对象中提取数据,并生成报表,则Available的属性值为true。 State属性是报表状态信息,它是枚举型变量,可以有以下的取值: qrAvailable:报表资源已准备好,可以预览或打印; qrPrepare:正在生成报表; qrPreview:正在预览报表; qrPrint:正在打印报表; qrEdit:正在编辑报表。 Description是TStrings类型属性,它可以用来保存程序员对报表的简单描述。主要是起提示作用。 Page属性是TQuickRep组件中最重要属性,它是TQRPage类型变量,用来设置报表的页面属性。报表组件为她提供了特殊的编辑器,使用组件的快捷菜单Report settings就可以打开Page的属性编辑器窗口。在报表页面属性对话框上可以设置页面的尺寸、边框、分栏、区段等等页面的属性。当然我们也可以在对象查看器中点击 Page前面的“+”展开它的所有属性,并分别设置这些属性。其中PagerSize是设置纸张大小的,他与Width、Length是密切相关的,改变PagerSize的值,后面两个的值也会做出相应的变化,同样,改变后两个属性时,PagerSize的值也会做出相应的改变。我们可以通过改变Orientation的值来改变打印的方向。Margins指的是报表显示内容在PagerSize中的位置。Columns属性我们一定注意,它是分栏设置,与WORD里的分栏设置是一样的,无论出于何种目的,有时我们要把打印内容分成两栏(或多栏)时,这时我们就要用到它,把它的值改为2(或实际栏数),至于栏间的距离我们通过Column space来设定。 Units属性是用来设置纸张的显示单位的,我们通常都选用mm(毫米),当然你要对其它比较了解也可以选用,但我认为最好不要选用其它项。 2)主要方法及事件 TQuickRep提供了大量方法以实现生成、预览和打印报表的功能,但是,它的许多方法是私有成员函数,在类外不允许访问。在实现报表功能时,应用程序经常需要调用Cancel、NewColumn、Preview、PreviewModal、PreviewModeless、Print、PrinterSetup和ResetPageFooterSize几个方面。 Cancel 方法用来撤销当前正在进行的操作,它与把TQuickRep 组件对象的Cancelled属性设置为true是一样的。 NewColumn、Print与PrinterSetup都是与打印有关的方法。其中NewColumn用来强制打印机从新栏开始打印,如果当前栏是页面的最后一栏,则该方法将自动调用方法NewPage ,从新页开始打印。 Preview、PreviewModal和PreviewModeless都是用来预览报表的。 这些方法都不需要使用任何参数。 TQuickRep能够响应的事件主要有:AfterPreview、AfterPrint、BeforePrint、OnEndPage、OnStartPage和OnPreview事件,这些事件的触发与使用方法比较简单,另外在实际应用中运用的并不多,这里就不再多说了。 四、 报表控件摆放的区段 作为报表,它通常有一个固定的模式,最常见的报表主要是由以下六部分组成: PageHeader:页眉,每页均会出现 

    Title:标题, 只出现在第一页 

    ColumnHeader:所有列的标题,即报表文件的字段区域,每页只会出现一次 

    Detail:记录的内容,一个字段一列,即报表的文本区域(重复区) 

    Summary:摘要(只出现在最后一页) 

    PageFooter:页脚,每页均会出现 
    在QuickReport中,是通过不同的TQRBand区段来实现的。 TQRBand 是放在TQuickRep组件上面的一个容器,我们在其上面可以放置我们要打印的可视化QuickReport组件。而通过对TQRBand的BandType属性的设置,我们可以改变TQRBand区段的类型,来实现不同区段的功能。 BandType是一个枚举型变量,显然上面常见报表组成表中的那六个部分也一定会出现在BandType的枚举值中,只不过每个前面都加上了前缀rb。我们选择不同的BandType值,就代表不同的区段类型,实现不同的功能,这一点必须注意。 实际上TQRBand的BandType属性值不止上面的六个,她还有以下几个值: rbGroupHeader:组页眉表格元,用于标志组页中每一页的开始,也用于TQRSubDetail; rbGroupFooter:组页脚表格元,与rbGroupHeader结合分隔出单页,适用于TQRGroup和TQRSubDetail; rbSubDetail:字数据表格元,无需手工设置; rbChilder:字表格元,无需手工设置。 事实上,我们还可以在TQuickRep上来布置区段,我们只要把TQuickRep组件的Band属性前面的“+”点开,就会看到上面那六个值(当然每个前面都加上了Has,可不是rb了),这些值都是布尔型的,我们想要用哪个区段类型的TQRBand,只要把其值设为true,就可以了。从这一点可以看出:前者可以更加灵活的布置Band区段,后者使用起来更加方便、快捷,至于到时候你用哪个,那就看你当时的心情与实际情况了。单纯从结构严谨性上来讲,还是通过TQRBand的BandType来设定区段类型更好一些,并且这样做出的报表出现的问题最少。五、报表运算组件TQRExpr与系统功能组件TQRSysData 报表运算组件TQRExpr用来提供一些简单的计算功能。Expression属性是她的最重要属性,我们有必要而且也必须掌握好她。 只要单击Expression右端的编辑按钮就可以打开表达式编辑窗口。利用这个编辑器,我们可以比较方便的设计表达式。通过表达式编辑器窗口中的按扭,可以在表达式中插入数据库中的表的字段、函数、数学和逻辑运算符,并可以通过Validate按扭来测试表达式的正确性。 当然,我们也可以直接在编辑器中输入表达式。 在她的函数中IF你一定要用好,因为她会帮我们很多忙,这个函数的对于学过DBASE的程序爱好者来说应该是非常熟悉的,因为在这里她们的使用是一样的;在C中,她与for(;;)语句或“?:”表达式差不多。她的具体使用格式如下: IF(条件式,为真用这句,为假用这句) 系统功能组件TQRSysData可以为我们提供一些经常用到的系统功能。为了实现这些功能,他提供了两个重要属性Data和Text。 Data是一个枚举类型变量,它有七个取值,如下表: 系统功能类型表(Data取值表) 系统功能类型 
    功能描述 qrsTime 
    系统时间 qrsDateTime 
    系统日期和时间 qrsDetailCount 
    需要打印的记录数量 qrsDetailNo 
    正在打印的记录索引 qrsPageNumber 
    正在打印的页 qrsReportTitle 
    报表标题 qrsDate 
    系统日期 
    Text属性是字符串类型变量,用来构成完整的系统功能字符串。 Data和Text这两个属性通常是一起使用的。如果将Text设置为“打印时间:”,而将Data设置为qrsDataTime,则系统打印结果为“打印时间:2003-9-21 13:08:12”的形式。 许多情况下,我们更想打印如“第1页”这样格式的页码,使用上面的属性是不能实现的,这就要我们编写代码来实现。在打印/显示报表时,应用程序将触发OnPrint事件句柄。这样我们只要在报表运算组件TQRExpr或系统功能组件TQRSysData的OnPrint中写下如下代码就可以实现了: void __fastcall TForm1::TQRExpr1Print(TObject *sender, AnsiString &Value) { Value="第"+Value+"页"; } //------------------------------------------------------------------- 或 void __fastcall TForm1::TQRSysData1Print(TObject *sender, AnsiString &Value) { Value="第"+Value+"页"; } //------------------------------------------------------------------- 通过这两段代码我们可以知道,原来这两个组件显示或起作用的就是Value,如果我们不修改Value的值,则直接打印Value内容。由于我们在OnPrint事件中修改了她的值,从而改变了打印的内容。 注意:有些朋友把上面代码输入了进去,却得不到正确的内容,原因很简单:TQRSysData的Data属性值设置不对,这个例子中我们要得到页数,看一下Data的值是不是qrsPageNumber,并且Text的值是否为空;对于TQRExpr组件,你是否通过Expression编辑器的Variable按钮进入了下一页,选择了PAGENUMBER值?这是你不能正确实现代码的问题所在。 六、TQRShape组件 TQRShape组件可以在报表上输出一些简单的图形,设置它的Shape属性可以选择不同的图形,但它主要用于绘制表格线,因此与TShape有些不同,下面我们来看一下Shape的取值: TQRShape组件Shape属性取值表 Shape属性取值 
    意义 qrsCircle 
    画圆 qrsHorLine 
    画水平直线(Height要设为1或其它) qrsRectangle 
    画矩形 qrsRightAndLeft 
    仅在矩形左右绘直线 qrsTopAndBottom 
    仅在矩形上下绘直线 qrsVertLine 
    画垂直线(Width要设为1或其它) 
    作为画图组件她的四个位置属性最为重要,它们是Top、Left、Height和Width。其实对于QuickRep的绝大多数组件来说,这四个属性也是非常重要的。 在Shape属性值为QrsHorLine/ QrsVertLine时,Height/Width的属性值要改为1或其它,这取决于你线条的宽度。 Brush属性用来设置几何图形内部的填充风格,它包括填充颜色Color和填充图案Style。 Pen属性用来设置用于画图的画笔的属性,它包括Color、Style、Mode、Wide等。 TQRShape组件与TShape组件有许多相同之处,但也有一些不同之处,象Shape属性的取值等等,我们一定注意。其实通过对两个类似组件的对比学习,会加深我们对她们的掌握。如果运用得当,漂亮的线条就会出现在我们面前。 对于TQRShape组件的使用来说更多的是熟练,她应该是所有QuickReport组件中最好掌握的一个了,使用率也是最高的一个,并且TQRShape在表格设计中的作用是其它组件所不能取代的,但本文限于篇幅就不在做过多的解释了。
      

  4.   

    我只学会了
    ReportMachine 
      

  5.   

    clc830516太感动了,我再补习一下