当前位置:首页>>开发编程>>综合开发>>新闻内容
Text字段Delphi中手动分页输出
作者:wuaihua/西部E网 发布时间:2004-4-9 11:37:19 文章来源:西部E网

声明:西部E网(www.weste.net) wuaihua 原创,如转载请注明出处

作者:wuaihua    emailRiver2003@126.com  QQ:18408685

  说明:本人使用的是Delphi6
  由于本人在制作打印报表时遇到以下问题:在设计时从数据库中取出的某一字段类型为Text型,经过用户在界面添加新的内容后不存入数据库 直接打印输出,大家都知道Text的长度较长[text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。],而且在制作 报表时要求单独输出,所以就有可能存在分成多页输出的问题。而Delphi中通常对分页输出的处理是使用QReport控件组中的TQRDBRichText控 件放在报表的TQRSubDetail子表控件上,要求是TQRDBRichText要与数据源连接!但是例中的Text数据类型的值是选赋值到TRichEdit控件中,经 过用户对内容的再次添加后直接打印输出,由于要考虚程序执行效率,不重新写入数据库,所以无法通上面提到的赋值给TQRDBRichText控件的 办法去实现。所以一切分页打印工作必须通过程序手动分页打印处理。

  首先对上面提到的实际情况特性进行分析:

  1.所有Text字段的内容以及新增的内空都在TRichEdit控件中,TRichEdit是界面上的Win32组的控件。

  2.输出报表是要把录入时的格式也能够完全的展示出来,因为TRichEdit控件中可以输入控制符,例如:"回车符",所以也只有选用能够把 TRichEdit.Text的所以字符都能够接收的TQRRichText控件。

  3.按2中的控件已经可以确定,所以下一步就要考虚把TRichEdit.Text的值赋给TQRRichText控件。通过TQRRichText.Lines.Add()方法逐行加入。

  4.用户界面上的TRichEdit(取名为RichEditUser)与报表界面上的TQRRichText(取名为QRRichTextQRp)的宽度可能有所不同,所以再要添加一 个TQRRichText的控件(取名为QRRichText1),将QRRichText1.Width与最终报表控件上的QRRichTextQRp.Width相同字体字号也要相同,目的 是将界面上的RichEditUser.text内容赋到QRRichText1中能够得到最终输出报表上QRRichTextQRp真实总行数,然后将总行数进行分页处理。


  具体算程序及算法如下:

procedure TFrmWorkBill.Print;
var
  FrmGroupPrint: TFrm_A_AF_GroupInfoPrint;
 
  PageCount,k,LinesCount,PageRow: Integer; //PageCount页数循环中间变量,LinesCount总行数,k新一页在取的QRRichText1.Lines的起点数
begin
  PageRow := 58;                           //每页中QRRichTextQRp中容纳的行数,此值根据字体大小经过实际测算得出
  QRRichText1.Lines.Clera;
  QRRichText1.Lines.Add(RichEditUser.Text);  //将用户介面的RichEditUser.Text内容赋值到QRRichText1.Lines.Add中
  LinesCount := QRRichText1.Lines.Count;

  for PageCount := 1 to LinesCount div PageRow  + 1 do begin
    WorkTallyPrint := TFrm_Work_Tally_Print.create(self);  //WorkTallyPrint是报表所在的窗体
    WorkTallyPrint.ClareQRRich;
    WorkTallyPrint.AssignRep(PageCount);    //PageCount将当前所在页传给报表,作为页号标记,相关过程在WorkTallyPrint中

    if PageCount = LinesCount div PageRow  + 1 then    //判断如果是末页
      for k := (PageCount - 1) * PageRow  + 1 to LinesCount do begin
        WorkTallyPrint.QRRichTextQRp.Lines.Add(QRRichText1.Lines[k  - 1]);
      end

    else                                         //判断非末页
      for k := (PageCount - 1) * PageRow  + 1 to PageCount * PageRow  do begin
        WorkTallyPrint.QRRichTextQRp.Lines.Add(QRRichText1.Lines[k  - 1]);
      end;
    WorkTallyPrint.QuickRep1.Print;
    WorkTallyPrint.Free;
  end;
end;


最新更新
·wml中页面自动跳转的实现方法
·Alexa排名数据接口的简要介绍
·利用U盘进行软件加密的方法(VB)
·优秀程序员的十个习惯
·项目管理:如何逃离垃圾客户
·QQ2009去广告部分核心源代码
·让程序更容易理解:13个代码注释的小技
·nx1和nx2后缀名是什么数据库文件?
·正则表达式符号解释大全
·什么是RIA?介绍几种RIA客户端开发技术
相关信息
·Delphi中Hash表的使用方法
·利用Delphi控制Windows任务栏
·Delphi常用控件命名缩写规范
·Delphi中建议使用的语句
·用Delphi实现图像放大镜
·Delphi编程禁止用户关闭操作系统
·[推荐]Delphi快捷键大全
画心
愚爱
偏爱
火苗
白狐
画沙
犯错
歌曲
传奇
稻香
小酒窝
狮子座
小情歌
全是爱
棉花糖
海豚音
我相信
甩葱歌
这叫爱
shero
走天涯
琉璃月
Nobody
我爱他
套马杆
爱是你我
最后一次
少女时代
灰色头像
断桥残雪
美了美了
狼的诱惑
我很快乐
星月神话
心痛2009
爱丫爱丫
半城烟沙
旗开得胜
郎的诱惑
爱情买卖
2010等你来
我叫小沈阳
i miss you
姑娘我爱你
我们都一样
其实很寂寞
我爱雨夜花
变心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK绷
贝多芬的悲伤
哥只是个传说
丢了幸福的猪
找个人来爱我
要嫁就嫁灰太狼
如果这就是爱情
我们没有在一起
寂寞在唱什么歌
斯琴高丽的伤心
别在我离开之前离开
不是因为寂寞才想你
爱上你等于爱上了错
在心里从此永远有个你
一个人的寂寞两个人的错