网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > DELPHI > 正文
在动态报表制作中巧用DBGRID
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/12
下载{$ArticleTitle}原创论文样式

在Delphi中,编程人员利用Quick Report控件可以方便地设计和实现静态报表,但对动态报表的制作仍有不便之处。如制作一个列表式报表时,如何动态调节每一列的宽度?由于报表在预览情况下不能修改,只能在预览前将宽度设定好,因此,如何比较方便地预先设定宽度,就成了一个需要解决的问题
分析问题
首先可想到一种笨办法,就是在确定报表中需要显示的字段后,对每一个字段的宽度赋予一个初始值(比如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;
……//画表头栏边框。起始位为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; 

  • 下一篇资讯: 在Delphi中实现多重查询
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号