在动态报表制作中巧用DBGRID.net -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    分析问题 首先可想到一种笨办法,就是在确定报表中需要显示的字段后,对每一个字段的宽度赋予一个初始值(比如80),对于需要调整的字段再通过编辑框进行输入修改,

在动态报表制作中巧用DBGRID.net

。这样的确可以达到预期目的,但由于不直观,可能需要多次调整,影响了效率和方便性。 笔者通

    分析问题

    首先可想到一种笨办法,就是在确定报表中需要显示的字段后,对每一个字段的宽度赋予一个初始值(比如80),对于需要调整的字段再通过编辑框进行输入修改。这样的确可以达到预期目的,但由于不直观,可能需要多次调整,影响了效率和方便性。

    笔者通过实践,利用DBGRID解决了这个问题。由于是制作与数据库相关的报表,其报表记录肯定需要通过一个SQL语句来产生,那么这些记录就可以先显示在一个DBGRID中。由于DBGRID的各列宽度可以动态调节,那么将适当的DBGRID的各列宽度赋给报表中的各列,就一次性达到了我们预期的目的,而且操作非常方便。

    设置窗体

    建立两个窗体mainform和repform。在mainform上放置edit1、datasource1、query1、dbgrid1、button1(caption为“提取数据”)和button2(caption为“预览报表”),将datasource1.dataset设定为query1,将dbgrid1的datasource设定为datasource1。在repform上放置Quickrep1,并至少将Quickrep1.bands.hascolumnband和Quickrep1.bands.hasdetailband设为true。

    编程实现

    运行时,在edit1中输入正确的 SQL语句。点击“提取数据”按钮,将相应记录显示在 dbgrid1中。具体的程序代码如下:

    procedure Tmainform.button1click(sender:TObject);

    var s:string;

    begin

    s:=edit1.text;

    with query1 do

    begin

    close;

    sql.clear;

    sql.add(s);

    open;

    end;

    end;

    点击“预览报表”按钮,可以看到形成的报表,如果对宽度摆放还有些不满意,可以关闭预览窗口后重新调整。具体的程序代码如下:

    procedure Tmainform.button2click(sender:TObject);

    var leftv,i:integer; //leftv为报表起始位置

    cheader:Tqrlabel;

    detailtext:Tqrdbtext;

    ……

    begin

    leftv:=0;

    for i:=0 to dbgrid1.columns.Count-1 do

    begin

    cheader:=TQrlabel.Create(repform);

    with repform.cheader do

    begin

    parent:=repform.columnheaderband1;

    caption:=dbgrid1.columns[i].fieldname;

    width:=dbgrid1.columns[i].width;

    height:=repform.columnheaderband1.height; left:=leftv+2;

    top:=5;

    end;

    ……//在leftv 处画表格竖线

    leftv:=dbgrid1.columns[i].width+leftv;

    end;

    ……//画表头栏边框,

电脑资料

在动态报表制作中巧用DBGRID.net》(https://www.unjs.com)。起始位为0,总宽度为leftv,也就是dbgrid1的各列宽度之和

    leftv:=0;

    //显示记录内容

    for i:=0 to dbgrid1.columns.Count-1 do

    begin

    detailtext:=TQrdbtext.create(repform);

    with repform.detailtext do

    begin

    parent:=repform.detailband1;

    dataset:=query1;

    datafield:=dbgrid1.columns[i].fieldname;

    width:=dbgrid1.columns[i].width;

    height:=repform.detailband1.height;

    left:=leftv+2;

    top:=5;

    end;

    ……//在leftv 处画表格竖线

    leftv:=dbgrid1.columns[i].width+leftv;

    end;

    ……// 画明晰栏边框。

    repform.quickrep1.preview();//报表预览

    end;

    原文转自:http://www.ltesting.net

最新文章