说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

基于VB的通用折行打印程序

HTML文档下载 WORD文档下载 PDF文档下载
基于VB的通用折行打印程序
作者:孔祥军
一. 概述
---- 几乎所有数据库应用软件,都需要打印单证和报表。常见的方法是利用VB的Crystal Reports(水晶报表)方式,通过TextBox等数据绑定控件,调用Print方法直接输出。虽然Crystal Report这一个功能强大、样式丰富且无编程方式的报表编制程序能适应大部分单证、报表打印的需要,但是Crystal Reports引擎是一个动态链接库,需许多文件支持和调用更多系统资源,大大增加系统负担。

---- 另一种解决办法是通过Printer对象的Print方法,直接打印字符串。这虽然减少了系统资源的开销,但它不能直接用于打印复杂的单证和报表。本文通过两个实例,阐述一个通用折行打印程序的编程和在单证及报表的应用。

二. 编程实现及实例

---- 为便于阐述的方便,我们先建立一个Access数据库Standards.mdb,其内SN表由以下几个字段组成:

---- 标准号(文本,17)

---- 标准名称(文本,255)

---- 英文名称(文本,255)

---- 实施日期(日期,8)

---- 修定日期(日期,8)

---- 发布日期(日期,8)

---- 代替标准(文本,50)

---- 通用折行打印程序编制操作如下:

---- 1.在VB5.0编程环境中,新建一个工程Project1;

---- 2. 在Project1中添加Moduel,在Moduel模块中定义一个记录最大折行数的公用变量Rowlab和Function函数(以下程序都经过实际运行测试,可以原样复制使用);

Public rowlab As Integer
'定义一个公用变量
Function prnt11(X As Integer, Y As
Integer,Font As Single, Txt As String, Val As Integer)
Dim str As String, str1 As String,
str2 As String ,I As Integer
Printer.CurrentX = X
Printer.CurrentY = Y
Printer.FontBold = False
Printer.FontSize = font
str = txt
str2 = str
I = 0
rowlab = 0
If Len(Trim(str)) = 0 Then
rowlab = 1 '待打印字符串为空的标志
Else
Do While Len(str) > 0
Printer.CurrentX = X
Printer.CurrentY = Y + rowlab * 240
rowlab = rowlab + 1
If Len(str) >= val Then
str1 = Mid(str, 1, val)
Printer.Print str1
I = I + 1
str = Mid(str2, I * val + 1)
Else
Printer.Print str
Exit Do
End If
Loop
End If
End Function


---- 3. 在Project1中新建一个窗体Form1,窗体上添加一个Data控件Data1,一个MSFlexGrid控件MSFGrid1,7个TextBox和两个命令按钮CmdPrnt1、CmdPrnt2。设置Data控件的属性:

.. DatabaseName="Standards.mdb"
..RecordSourse="SN"
MSFGrid1属性:
.DataSource="Data1"
Text1属性:
.DataSource="Data1"
.DataField="标准号"
Text2~Text7类同。


---- CmdPrnt1、CmdPrnt2分别为打印单条记录和多条记录的按钮。

---- 实例1:文字串定位折行打印在口岸联检部门中应用非常广泛。下述例子是用CmdPrnt1的Click事件代码实现了对文字串定位折行打印:

Private Sub CmdPrnt1_Click()
Dim str As String, str1 As String ,txt As String
Dim strx As Integer, stry As Integer,I As Integer
strx = 200
stry = 0
txt = Space(20) + "中国出入境检验检疫标准目录检索STEMS 2000"
Printer.FontName = "黑体"
dd = prnt11(strx, stry, 10, txt, 50)
stry = stry + rowlab * 240
Printer.Line (0, stry)-(9000, stry)
Printer.FontName = "宋体"
txt = "标准号:" + Space(2) + Trim(Text1) + Space(3) +
"发布日期:" + Trim(Text4) + Space(3) + "实施日期:"
+ Trim(Text6) + Space(3) + "修定日期:" + Trim(Text5) '+ Chr(13)
stry = stry + 240
dd = prnt11(strx, stry, 10, txt, 70)
stry = stry + rowlab * 240
txt = "代替标准:"
dd = prnt11(strx, stry, 10, txt, 10)
dd = prnt11(strx + 1000, stry, 10, Trim(Text7), 60)
stry = stry + rowlab * 240
txt = "标准名称:"
dd = prnt11(strx, stry, 10, txt, 10)
dd = prnt11(strx + 1000, stry, 10, Trim(Text4), 38)
stry = stry + rowlab * 240
txt = "英文名称:"
dd = prnt11(strx, stry, 10, txt, 10)
dd = prnt11(strx + 1000, stry, 10, Text5, 72)
Printer.EndDoc
End Sub


---- 注: Prnt11函数原形:prnt11(X As Integer, Y As Integer, Font As Single, Txt As String, Val As Integer),其各参数含义如下:

---- X、Y为待打印字符串左上角起始座标;

---- Font为字体大小;

---- Txt为待打印字符串;

---- Val为字符串打印折行长度。

---- 实例2:直接打印表格式窗体显示的多记录多字段,往往因某些字段的字节太多而造成纸张宽度不足。以下CmdPrnt2的Click事件中的代码,实现了对上述MSFGrid1表格记录的打印:

Private Sub CmdPrnt2_Click()
Dim fnt As Single
Dim pp As Integer
Dim stry As Integer, strx As Integer
Dim stry1 As Integer,
strx1 As Integer, linw As Integer
Dim page1 As Integer, p As Integer,
gridrow As Integer, ii As Integer
p = 0
ii = 1 'ii记录MSFGRID1表格同一记录内字段最大打印行
pp = 0 '开始页码
ss$ = "中国出入境检验检疫标准目录检索STEMS 2000" ' 表头
Static a(4) As Integer
kan = 0
a(2) = 1680
a(3) = 2800
a(4) = 5300
page1 = 46 '定义每页行数
strx = 200
strx1 = 200
stry = 1400
stry1 = 1400
linw = 240 '定义行宽
fnt = 10 '定义字体大小
For I = 2 To 4
kan = kan + a(I)
Next
gridrow = Datdatact1.Recordset.RecordCount
If gridrow = 0 Then
MsgBox "无满足条件记录打印!"
Exit Sub
End If
Printer.FontName = "黑体"
dd = prnt11(3300, 700, fnt, ss$, 26) '打印标题
dd = prnt11(500, stry - 250, fnt, "标准号", 26)
dd = prnt11(2690, stry - 250, fnt, "标准名称", 26)
dd = prnt11(6690, stry - 250, fnt, "英文名称", 26)
Printer.Line (strx - 20, stry - 30)-(10460, stry - 30)
Printer.FontName = "宋体"
For j = 1 To gridrow '打印gridrow条记录
MSFGrid1.Row = j
strx = strx1
For I = 2 To 4 '假设只打印2-3 列
MSFGrid1.Col = I
dd = prnt11(strx, stry, fnt,
MSFGrid1.Text, Iif(I = 3, 13, 55))
If ii < rowlab Then
'ii记录同一记录内字段最大打印行
ii = rowlab
End If
strx = strx + a(I)
Next
p = p + ii
rowlab = ii
ii = 1 '重新初始化
If p > page1 Then
p = 0
strx = strx1
For n = 2 To 4
strx = strx + a(n)
Next
pp = pp + 1
stry = stry + rowlab * linw
foot$ = "第" + CStr(pp) + "页"
dd = prnt11(strx / 2, stry + 3 * linw, 10, foot$, 26)
stry = stry1
Printer.NewPage
Printer.FontName = "黑体"
dd = prnt11(3300, 700, fnt, ss$, 26)
dd = prnt11(500, stry - 250, fnt, "标准号", 26)
dd = prnt11(2690, stry - 250, fnt, "标准名称", 26)
dd = prnt11(6690, stry - 250, fnt, "英文名称", 26)
Printer.Line (-20, stry - 30)-(10460, stry - 30)
'打印起始线
Printer.FontName = "宋体"
strx = strx1
Else
stry = stry + rowlab * linw
End If
Next
If p < page1 Then
For p = 0 To page1 + 1
strx = strx1
Next
End If
strx = strx1
For n = 2 To 4
strx = strx + a(n)
Next
pp = pp + 1
foot$ = "第" + CStr(pp) + "页"
dd = prnt11(strx / 2, stry + 3 * linw, 10, foot$, 26)
Printer.EndDoc
End Sub

---- 以上程序在简体中文Windows98、VB5.0环境中调试通过。

专心做设计!开源跨平台应用开发框架Appverse Mobile 无线盛宴尽在阿里百川开放大会 医学界的Instagram:加拿大重症监护医生开发照片分享应用 2014中国移动开发者大调查第二批获奖名单揭晓 基于OpenStack的私有云开发部署实践 亚马逊云平台的迁移过程 【干货】微信企业号开发资源集锦 CSS生日快乐:CSS之父Håkon Wium Lie访谈录 好友近2000万,绑定银行卡过千万,日会话近百万,招商服务号成功之道 一名程序员十年技术之路的思考与感悟 聚焦企业号、服务号典型案例 微信开发者大会深圳站正式开启 Objective-C之父Brad Cox访谈:我的编程之路 【先锋】完成B轮融资的TalkingData新商业模式:平台理念+跨界分析+技术开源 1/10计算资源,1/3耗时,Spark颠覆MapReduce保持的排序记录 Cookie已死,看Facebook、Google、Apple如何追踪用户 Clay.io基于AWS、Docker、HAProxy等的10X架构打造 经典服务/企业号案例来袭!2014微信开发者大会(深圳)亮点抢先看 移动应用云APICloud宣布完成A轮500万美金融资 从Apache Storm学到的经验教训 【CTO俱乐部走进天津】探讨如何成为技术团队管理者 不容错过!参加MDCC 2014移动开发者大会八个理由 你的钱被洗劫了么!APP安全问题来袭 10大最常见的数据库安全问题 南航微信服务号是如何炼成的? 超40项功能改进,虚幻引擎4.5正式发布! 【工具推荐】ER:可轻松构建一站式AJAX Web应用的开发框架 GraphLab:将大数据分析从理念运用到生产 支持Android 5.0:完全用Ruby的Ruboto框架迎1.2.0更新! 万物互联第一步:采用AllJoyn技术的智能硬件 【专访】敏捷专家何勉:让测试成为拉动组织敏捷实施的力量 Docker与微软合作 支持Windows Server 请问,下面的警告提示什么意思(关于sybase) 那位可以给我描述一下“代表”? 请问有WINsock编程高手么,帮我看一下下面的程序 紧急招聘PB程序员(成都) 关于产品序列号的问题……想了很久了。 这里有几个问题,能者请进! 请教VC项目开发经验 如何让下载的程序变成免费的? 请问有Pdf到Text的转化的源代码么? 能否让下载的程序变成免费的? 请问怎样才能自动复制文本框中的文本到剪贴板? 是否可用简体中文的VB开发翻体中文的应用程序? 使用JavaMail转发邮件 在servlet中是不是不可以引用其它的类中的函数.(这个类不是派生于HttpServlet) 为什么买书配送的光盘文件在BCB工程中打开后不让修改(打开前已转换为存档文件了)? 请教使用OPEN CLIENT 的一个小问题 索求算法 请问能否将下载的程序变成免费的? 现在学习C#不晚吧,:P 关于VB中控制运行实例的问题 请教关于DBGRid的问题。 请问在Java下如何实现文件压缩?有没有现成的接口或者压缩算法代码?多谢 这里下载C#电子书《C#教程》(中文 希望出版社) 我如何才能删除ORACLE中建立的用户??总是提示用户不存在或SQL第归错误等等!! CSDN灌水乐园的惊世大骗局!!CSDN灌水乐园的惊世大骗局!!CSDN灌水乐园的惊世大骗局!! 如何用简体中文VB开发翻体中文软件? 高分请教!!!! 一定加分!!!1111111 在打印或打印预览前如何获取报表页数 求助.希望有人帮忙!! 我用ACTIVE REPORT出了问题....相教 请问如何获得硬盘的序列号? 请问各位,有什么好的方法来为用户分配权限,要多少分就给多少? 我有一个www.cnjava.com,有没有人愿意要这个域名? 请问Delphi中关于fropro数据库的软删除问题!急用!谢谢! 当两个表用主键关联时,删除主表的一条记录,关联表对应的记录能不能自动删除(不用代码)? 大家来谈谈各自在制作网页时的css于inc的运用吧 小弟对Java及C#的一点看法-请大家指正! 高手请进,帮我看看这是什么意思?感谢非常 基于组件的三层应用程序怎么打包?200分相赠!!! 如何执行带OUT参数的ORACLE的存储过程 有谁做过矩阵奇异值分解的程序? 讨论:爱需要表白吗? 请教各位大侠:我用TNMStrm控件发送数据时,怎样实现定时连续发送?我现在发送一次成功,紧接着第二次发送就不行了,出现蓝屏. slide中的滚动条,有NM_RELEASEDCAPTURE事件,是响应mouseup,有没有什么事件响应mousedown的? 再送50分,求大家来讨论用存储过程建datawindow时应注意的事情。 我想做一个网页,实现文本分割,发送短消息! 那为老兄知道SCO OPENSERVER下面PHP的安装方法! 在asp中可不可以不用recordset来开发? 是否有好的ASP书籍 哪里有已经破解了的BAS4.5下载? 调用::GetCurrsorPos()和窗体成员函数GetCurrsorPos()得到的位置都不对???? 工程队修建一条水渠,第一天修了180米.第二天修了全长的4分之1,第三天修的水渠的长度为前两.工程队修建一条水渠,第一天修了180米.第二天修了全长的4分之1,第三天修的水渠的长度为前两天 数学应用题:某一工程修一条路,第一天修了全长的二十七分之五,补充上面的:第二天修了余下的十一分之三,第三天修了第二天余下的六分之五,第四天修8千米,正好修完.求这条路的总长度 某工程队修一条路,第一天修了20%,第二天修了150米,两天一共修了全长的二分之一,这条路全长多少米? 一支工程队要修一条水渠,第一天修了全长的5分之1,第二天修了全长的4分之1,第二天比第一天多修了25千米,这条水渠全长多少米?(注意单位) 工程队修一条路,3天修了全长的9分之2,多少天可以修完? 修一条公路,第一天修了全长的三分之一,第二天修了全长的二分之一,两天共修了全长的几分之几? 修一条路 第一天修了全长的2分之1 第二天修了余下的2分之1,这条路还剩几分之几没有修? 工程队修一条公路,第一天铺了全长的五分之二第二天比第一天少铺三分之一,还剩210米没铺.这条路有多长? 有一条长24千米的公路,第一天修了它的八分之一,第二天修了五分之二千米,两天共修多少千米? 一条路100米,第一天修了这条路的2分之1,第2天修的是第一天的3分之1,还剩这条路的几分之几没有修 某工程队修筑一条马路,第一天修了全长的十分之三,第二天修了全长的五分之二,还剩630米没有修,这条马路全长多少米? 修一段路,第一天修了全长的五分之二,第二天修了全长的四分之一,两天共修了260米,这段路长多少米? 一条路100米,第一天修了全长的二分之一,第二天修了全长的三分之一,还剩这条路的几分之几没修? 市工程队修一条路第一天修了全长的五分之二第二天修了全长的百分之二十五还剩154米没修这条路全长多少米 加工一批零件,王师傅加工26个,占总数的5分之1,剩下零件按7:6分给张、李两位师傅.两位师傅各加工多少(方程和假设) 一段路第一天修了二分之一,第二天修了剩下的二分之一,还剩几分之几没修? 市工程队俢一条路,第一天修了全长的五分之二,第二天修了全长的百分之二十五,还剩154m没修,这条路全长多少m 李师傅加工一批零件,已加工的与未加工的个数比是1:3,再加工400个后,已加工的占总数的2分之1.这批加工的零件有多少个? 一条路一百米,第一天修了二分之一,第二天修了余下的三分之一,还剩这条路的几分之几?只要算式! 工程队修一条路.第一天修了全长的百分之二十五,第二天与第一天所修的比是4:3,还剩500米没有修.这条路 加工一批零件,王师傅加工26个,占总数的五分之一,剩下的零件按7:6分给张,李两位师傅,两位师傅各加工多少个 一段路,第一天修了二分之一,第二天修了二分之一,还剩全长的几分之几 修路队修一条公路,第一天修了全长的四分之一还多1.2千米,第二天修了全长的五分之二少0.8千米,这时还剩6.6千米没修,这条公路全长是多少千米? 李师傅要做350个零件,前三个小时完成了总数的七分之三.照这样的速度,他完成全他完成全部零件需要多少小时? 修一条水渠,第一天修了全长的十五分之二,第二天比第一天多修了全长的20分之3,还剩几分之几没有修? 某工程队,第一天修了600米,第二天修了全长的20%,两天共修了全长的1/2.这条公路全长多少米? 李师傅4分之3小时做6个零件,照这样的速度,他工作2分之5小时,一共可以做多少个 某队修一条水渠,第一天修了全场的25%,第二天与第三天的比是7:8,第一天修的比第三天修的少21米,这条水渠全长多少米? 修一条长五分之四米长的水渠,第一天修了全长的三分之一,第二天修了全长的五分之二,还剩几分之几没有修把全长看做单位一来减,还是用五分之四减 某工程队修路,第一天修了三分之一,第二天修了50米,两天共修了全长的百分之50,这条路有多长? 某队修一条水渠,第一天修了全场的25%,第二天与第三天的比是7:8,第一天修的比第三天修的少21米,这条水渠全长多少米?不要用2个未知数方程 修一条水渠,第一天修了全长的十五分之二,第二天修了全长的十分之一,还剩几分之几没有修? 某工程队修路,第一天修全长的百分之25,第二天修一百五十米,两天共修了全长的十分之三,这段公路长多少米求列算式详细回答,有讲解 工程队修一条路,第一天修了全长的25%,第2天与第3天修的比是7:8,第一天比第3天少修21米,这条路全长多少 修一条长5分之4米长的水渠,第一天修了全长的3分之1,第2天修了 全长的5分之2还剩几分之几没有修 工程队修路,第一天修了600米,第二天修了全长的20%,两天共修了全长的1/2.公路全长? 工程队修一条路第一天修的比全长的三分之一少100米第二天修了300米两天共修了全长的40%这条路全长多少米 一条路100米,第一天修了这条路的12%,第二天修了余下的13%,还剩这条路的几分之几没修? 某工程队修路,第一天修了600米,第二天修了全长的20%,两天一共修了全长的二分之一.这条公路全长多少米? 工程队3天修一条水渠第一天修全长的25%第二天与第三天修的比是7:8第一天比第二天少21米这水渠全长多少 一条路长100米,第1天修了1/2,第2天修了1/3,还剩这条路的几分之几没修? 一个工程队修一条公路,第一个月修了全长的四分之一,第二个月修了全长的五分之二,第二个月比第一个月多修了12千米,这条公路全长多少千米? 工程队修一条水渠,第一天修了全长了四分之一,第二天修了全长的百分之三十,还剩下900米没修.这水渠全长 工程队修一段160米长的公路,第一天修了全长的1/5第二天修了全长的3/8,还剩全长的几分之几没有修? 一个工程队修一条公路,第一个月修了全长四分之一,第二个月修了全长的五分之二,还剩14千米这条公路全长多少千米? 工程队修一条水渠,第一天修了全长了四分之一,第二天修了全长的百分之三十,还剩下900米没修水蕖全长不要方程 工程队修一条长3/4千米的道路,第一天修全长的1/4,第二天修全长的1/3,还剩全长的几分之几没有修完 1.一个工程队修一条公路,第一个月修了全长的四分之一,第二个月修了全长的五分之二,第二个月比第一个月多修十二千米.这条公路长多少千米?2.仓库里有一批货物,运出五分之三后,又运进二 工程队修一条水渠,第一天修了全长了1/4,第二天修了全长的30%,还剩下900米没修.这条水渠全场多少米? 工程队修一条公路,第一天修了全长的3分之1,第二天修了80米,还剩86米没有修,这条公路长多少米? 某工程队三个月内修一条全长为12千米的公路,第一个月修了五又三分之一,第二个月修了剩下的五分之二,第三个月修了多少米速度速度 啊 工程队修一条水渠,第一天修了全长的25%,第二天修了全长的30%,还剩下900米没修,这条渠全长多少米?今天就要 工程队要修一条长200米得路,修了一段后还剩63米没修.已知的米数占 条路的几分之几 修一条路,第一天修了300米,第二天修了全长的四分之一,两天共修了全长的十八分之五,这条路长多少米? 工程队修一条水渠,第一天修了全长的15%,第二天修了全长的40%,还剩下900米没修,这道水渠全长多少米 工程队修一条路已经修了5分之4千米,剩下的是已修的8分之7,这条路长多少千米? 工程队修一条路,第一天修了全长的30%,第二天修了30米,两天共修了全长的50%,这条路全长多少米? 某工程队挖一条水渠.第一天挖了全长的5分之1,第二天又挖了全长的5分之1,第三天挖了全长的6分之1.这条水渠(要算式) 应用题:工程队修一条路,已修了800米,正好占全长的9分之4.这条路全长多 工程队修一条路,第一天修的比全长的1/3少100m,第二天修了300m,两天共修了全长的40%,这条路长多少米?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn