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

基于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环境中调试通过。

VB中利用API函数实现特殊窗体的两种方法 VB中用API函数实现文件夹列表 WIN32 API-VB资料 WIN32 API的分类介绍 -VB资料 Win95系统API函数大揭秘 作者:何发武 -VB资料 把图标放在WIN95的系统托盘中-VB资料 打开/关闭光驱门-VB资料 调用API函数设计ABOUT窗口 -VB资料 功能强大的SendMessage函数 -VB资料 简单计算函数的编写过程-VB资料 将文件大小变成相应的字符串-VB资料 可以直接用API改变textbox的扩展样式-VB资料 快速读取TextBox第N行的数据 -VB资料 VB利用 API 可以直接拨号 VB利用API 使Text框只读 VB利用API创建文件目录 VB利用API函数实现VB特殊窗体的两种方法 VB利用API函数实现无TittleBar窗体的移动 VB利用API在VB5.0中实现清除文档名 VB利用App.PrevInstance防止同一程序执行多次 VB判断应用程序是否仍在运行并设置焦点 巧用VISUAL BASIC的RND()函数 让你的程序不在任务栏中显示 -VB资料 VB如何不用API使文本框属性只读? VB如何从文件中提取图标 VB如何关闭/重新启动计算机? VB如何建立快捷方式? VB如何让窗口始终在最前面? VB如何使你的程序同文件扩展名建立关联? VB如何提高调用WINDOWS API函数编程技巧 VB如何为你的应用程序设置热键? 求助有关IFS-HOOK 高手请入!!急救!求msflexgrid 的打印源码????? 如何在list中显示文件夹 哪里可以看到Obejct类clone的实现方法? 系统的FOUND.00*文件夹里放的FILE000*是什么文件?可以删除吗?刚装系统时没有这些文件的阿 给分啊 今日郁闷之至……散分! 来来来,大伙们一起来衷心祝愿xxmm (晓箫)的老爸老妈顺利赴美参加晓箫的毕业典礼!! Dev-Cpp 使用 NetAPI32.lib 的问题 急寻严蔚敏,吴伟民版《数据结构习题集》c语言版的答案,请问哪有啊 高手们给我一个超级简单的HOOK API的例子好吗?求你们了。 错在哪里 好郁闷啊~ 谁有站内关键字模糊查询的代码?紧急求救、在线等待!!!! 字符串转化为数组的问题 讨论<<标准C++库大全>> 上次是哪位兄弟要的《新编API参考大全》CHM版呀?我找到了一个,还行。 欢迎大家访问我公司的网站! 请学c++builder 有份量的人推荐一本经典的教材(适合初学者) 欢迎大家访问我们公司的网址! 关于分页的问题 请帮我看看这个小程序 欢迎大家访问我公司的网站! 已知一个文件夹的路径,如何得到该文件夹中的文件的名字? 关于StreamReader的问题 欢迎大家访问我公司的网站! 有关编辑框的问题 各位大侠一个很菜的问题,来帮帮忙! 关于集合的一个小问题 最菜的问题,100分白送!!! 很基础问题,脑子不清楚,大家帮忙看看 紧急问题! 终于 知道MESSENGER 只是 WIN2K 的服务了! 那么 这 个怎么办?? 请问以下我如何实现一个带滚动条的子窗口 问一下,resin和iis集成后class文件放在什么目录下 用 http://www.rc80.com (c# + sqlserver2000) 只想换一个.net 的完整的分页代码! 一个Corba客户端连接的问题! 如何在resin中设置wap服务器功能 大家帮忙!! 什么时候用DataGrid,什么时候用DataList? 怎么样从数据库里取得某字段的值??? 昆腾的硬盘修理找谁啊?急,UP有分........ www.webmatrixhosting.net免费空间中FTP文件上传问题 Apache 2.0.43 +Tomcat 4.1.24+mod_jk2-2.0.43.dll整合问题出现:The servlet container is temporary unavailable or being upgraded 我装的Delphi7好像丢了一个文件:Proxies.pas,哪位好心人给我一个? 人,真脆弱! 开水房追女之呕心沥血计划 (超暴笑) 孤独 急!!Image对象如何设置成为透明的???Thanks! 【憋的慌】大头、阳光呢!!! And because,as you know,the traditional media is still heavily controlled by the government这句话在word里显示有误, 苄嘧磺隆防除稻田杂草,怎样使用? we snowball throw and make sometimes them 怎么连词成句 法布尔解开了“白蝎自杀之谜”,谜底究竟是什么 水稻田主要防治的杂草是稗草、-----------\---------------------. pen用汉语怎么读 Her face appeared on innumerable magazine covers,and she was ___ by the media.(A.confusedB.caughtC.houndedD.followed shape 的单复数用法有一堆苹果,是问what shapes are the apples?还是:what shape are the apples? glue怎么读 空气加湿器30W 50W是什么概念,一般宿舍能用吗?我就是想知道这个功率到底算多大,会不会像饮水机一样在宿舍转不起来. 塑料上面的镭射是什么意思? 英语翻译 —个三角形桃园底54米高40米.如果每棵桃树占地9平方米,这个桃园一共有多少棵桃树? 正方形的面积是20米,如果每4平方米种一棵桃树,这个果园可以种多少棵桃树? pudding的音标是? 2平方米是什么概念?房子 什么的 一块面积为2400平方米的地栽了400棵桃树,桃树的株距是2.4,行距是多少米? 请问pen presure 在哪里啊 我用的中文版c4d 我也是 ps有压感 但是 c4d没有 怎么调啊 王叔叔出去旅游5天,这5天的日期之和是35,请算一算,王叔叔回来的日期是几日? 如果桃树的棵树比梨树都5/3,那么桃树有多少棵?是不是用 桃树×(1+5/3) 2013年热门关键词有哪些 figgy ,until ,的音标~ 哪些动物住在洞里的? 2013年热门职业2013什么职业好呢? 怎么用英语音标拼汉字就像lancome(化妆品)兰蔻,可译音成汉字 兰蔻一样 列:兰蔻音译回去---(汉字怎么音译成英语) 什么是合力?什么是向心力? 求2013年的热点话题.热点! 无花果的含义是什么? 不是合力提供向心力吗 glue的中文 无花果有什么 含义 向心力一定是合力吗赤道上,为什么向心力+重力=引力?为什么不是引力全部变成向心力? 以“我和我的祖国—喜迎国庆60周年”为题写征文征文主题“我和我的祖国—喜迎国庆60周年”以歌颂祖国和党,赞美社会和家乡发展变化(我是晋城的),表现人性真善美等为主要内容. Tony was t—— (使非常激动)by the good news that he got an "A" in the fina The Chinese ----is said to be a healthier one than----,which contains too muA food the west B diet that of the west Cfood,that of the west D diet the western为什么不选C 请问parfix glue 是什么意思?谢谢~~ 英语翻译不要百度百科里的,求直白接地气的翻译! 有一些鸡和兔,共有脚72只,若将鸡的只数与兔的只数互换,则共有脚84只.鸡,兔各有多少只? 祖国60周年国庆作文最好带这60年来的进步脚步450字左右.好的追加20 中国农业银行每个月存1500元,存满一年本金是18000元,利息是多少啊?谢谢!还有什么方法比这个利息更高吗?谢谢! Neiter.I use a pen.中文意思 glue的中文意思 李某在农行存入2000元钱,年利率为1.98%,12个月以后,张三从这批款中会得到的收益是答案是31.68,为什么? correction pen 的汉语意思是什么? glue是什么意思? it's hurt/it hurts的区别好像电影里总能听到it's hurt 但偶尔有一天看见朋友写的it hurts,网上一查,好像也对.这俩在语境里有什么区别,意思表达上有什么差别呢?我只是想知道这两句在实际使用时 设a,b是方程(log2X)^2+5(log2X)+1=0的两个解,求a,b,注意,其中2是a,X是N 一只船顺水行320千米需用8小时,水流速度为每小时15千米,这只船逆水行这段路程需用几小时?320÷8-15 =25(千米) 25-15=10(千米)320÷10=32(小时) 这是答案它为什么减去一个15后又减一 请问提供IDC和提供带宽有什么区别呢?带宽的增加和成本的增加是线性关系吗?如果不是线性,麻烦好心人多说点啊,我不懂这些虚拟的玩意儿啊,最好能举个形象点的例子,谢谢啦 research可数么? 水流速度是每小时十五千米,现在有船顺水而行,八小时行320千米,若逆水行320千米需几小时?不用方程解. 两列火车同时从甲.乙两地相对开出快车行完全程需要二十小时慢车行完全程需要三十小时开出后十五小时相遇已知快车中途停留了四小时慢车停留了几小时 research 水流速度是15km/时,现在有船顺水而行,8小时行了320千米,如果逆水行了320千米需要及时? there are good reason to be troubled by the violence that spreads throughout the media.to be 在这是什么,怎么用 什么结构,分析结构 hurt的用法,与hurts的区别如;my left leg is ( )His left leg is ( )为什么? research 何时可数 何时不可数 白蝎自杀之谜的谜底究竟是什么? 稻田杂草如何防治? Eat fruit and vegetables?是什么一 西班牙称遭大规模监控难以接受 促美公尼泊尔政客涉嫌谋杀同党候选人 两印度尼泊尔政客涉嫌谋杀同党候选人 两印度叙利亚问题联合特使卜拉希米抵达大马士浙江一盗销柴油团伙五分钟能使满箱柴油拆东墙补西墙 浙江一男子非法集资14李克强会见德国友人多国对美国监听表达不满要求解释 研究突尼斯政治纷争致市政荒废 街头成“垃俄官员说中国是俄旅游领域主要战略伙伴四川南充男子驾中巴强冲交警队和法院 俄官员说中国是俄旅游领域主要战略伙伴张高丽会见美国能源部长莫尼兹外交部:国际社会应尽早制定网络空间行赵洪祝会见尼泊尔客人范长龙会见巴基斯坦陆军参谋长华媒:揭秘核潜艇部队剑有所指 新海军中国核潜艇部队42年来首次揭秘 打击揭牌首月 上海自贸试验区登记企业同比21世纪理事会将就“读懂中国”展开讨浙台经贸合作平台发展规划发布 打造超台湾工商业肯定洪秀柱 盼促两岸服贸货感恩父亲节 您“胃”父辈做了什么?男性功能障碍及前列腺难题 美国尖端科冯小刚又发飙了,因没吃上米饭陕西省教育厅主办权威展会 超30万考维修消防设施 可直接启用维修基金他10年来赈灾济困 累计投入资金3亿判断股价趋势可用20日均线本周23只新股抽血 震荡将加剧低价换机正当时 京东潮流电子大牌“价征战国际军体赛场 “90后”女兵7次“保”送名校·“利”惠沈城,千人抢购当医生,博士毕业也要从基层做起乔石同志逝世明廉锅炉房试点煤改气 每年可减少用煤东大老校友重返校园“讲人生”免费保健按摩培训17日开课招募美女啦啦队、观战团去年一些高校机械类专业就业率较高直播提示福利来了!200元现金券来晨报免费送
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘