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

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

美国最大婚恋网站eHarmony利用Hadoop、OpenStack重构自己 每个Java开发者都应该知道的5个JDK工具 异构计算应用研讨暨OpenCL编程培训在上海和西安成功举行! APIs.io:用来发布和发现API的利器 偏爱MySQL,Nifty使用4个Web Server支撑5400万个用户网站 直接拿来用!十大Material Design开源项目 初探WatchKit,开发者必须知道的6件事! 【MDCC专访】环信CEO刘俊彦:音视频即时通讯将成为技术壁垒 第十七届全国工程建设计算机应用大会在京召开,AMD受邀详解GPU Computing! 哪一门开发语言薪水最高? 借助ArangoDB,带你玩转Google图算法引擎Pregel 【最具价值CTO评选秀】MediaV CTO胡宁:技术女神的自我奋斗 豌豆荚邓草原:如何实现实时响应式平台 必须谨记!Node.js安全开发技巧 聚焦新平台新应用 IBM 2014技术峰会上海站顺利落幕 《近匠》NAGA娜迦信息:移动安全加固定制化 棱镜、飞流、TalkingData三方解读:手游如何高效运营 【MDCC秀场】枕戈待旦——秉持移动开发大潮下的主角思想 Netflix的首席产品官Neil Hun谈推荐系统打造和AWS实践 微信开放WiFi接口,醉翁之意在乎O2O还是大数据? 软硬整合:基于云的微型智能防丢设备Linquet 【MDCC专访】AppCan CTO赵庆华:助力企业快速移动化 使用Bluemix中的Rules服务构建一个酒店预订应用程序 基于IBM Bluemix开发微信公共账号应用 用Cloudant在Bluemix上构建一个简单的文字游戏应用程序 IBM Bluemix是什么? 【最具价值CTO评选秀】纷享销客CTO刘晨:企业移动的技术挑战 【最具价值CTO评选秀】能做存储的超级计算机——任宇翔和以色列团队的创业故事 OpenStack Swift存储策略 分享5个可视化的正则表达式编辑工具 在iOS程序中使用Bluemix云推送服务 AD和額外域控制器的角色轉換 两个问题? 请教大家如何从另外一个程序往一个dx的游戏上写字?? asp程序取sql存储过程返回参数的问题 初学c++,请教 加权平均分 如何快速的判断文件是否存在? 问一个软件!!! 98的提示符下加载哪个命令可以出现中文? 关于C的疑惑 asp程序取sql存储过程返回参数的问题 精品:数据库-表字段类型的写法!! 谁知道一般网站的在线人数统计功能是如何实现的? 如何处理float型的长度问题? 请大家帮忙这个存储过程该怎样设计?呵呵,不好意思!第一次发贴发错了^_^ 在线请教,找错 请高手门帮我解决一个问题! 请问如何把一个form的关闭按钮屏蔽掉而只留下标题栏? 高手::::请教一个简单的问题???? 还是.net连oracle的问题 急救!VB访问Linux服务器上的Oracle8i的问题 如何在没有安装.net的机子上运行C#程序阿?? 在模板实参推演中,数组的长度是如何得知的呢??? asp作提交表单 自动发到指定邮箱里。 急哭了!在线等待!!!!!! 为何我的sql服务管理器停止不了,一直为“正在停止”,而一旦停止了却又启动不起来? 怎样调用IE的一些功能??? 求教,急! 初学asp,问个简单的问题吧:怎么样知道客户端的时间? strus的配置和使用,我用jdevelop, ADO+MSSQL对DataSet中Record定位 欢迎讨论,关于水晶报表实现:折线图,或者柱形图问题 在线求助:如何读取B端操作系统信息和浏览器信息? 系統用戶使用權限的設計 combox 问题 急寻MAYA编程高手 服务器端有一个很大的XML(10M)文件,怎样从client端读取? CMainFrame 的窗口句柄怎么得到 从数据库读出文本如何保持原来格式 ? 在winform中,请教关于combobox的一个小问题 Stream Write error??????????? 存储过程的and和or连用 谁有新浪或网易等的短信网关接口? 请问如何在水晶报表里面定义一个全局变量?谢谢 如何配置SMTP服务 使用触发器时想到的 为什么要实现双接口 求DOM(DOMAIN OBJECT MODEL)的详细资料,顶着有分 winxp 在重启时总是提示:"此媒体的类型产品号无效请用正确的cd重新安装",系统进不去! 那位老大给仍一个visual assist 6.0的key,等待中。。。。 请问哪儿有类似于TDBchart数据显示的图形控件? 服务器端有一个很大的XML(10M)文件,怎样从client端读取? 用三个半径相同的圆纸片覆盖边长为1的正方形,所用圆纸片的最小半径是多少 一个边长是1的正方形至少需要几个单位圆才能完全覆盖?对不起,是直径为1的圆,如果用三个圆盖住最小半径为多少呢? 要把一个边长为1M的正方形水池完全覆盖,至少需要做一个半径为多大的圆形池盖? 网络词语是什么?有几部分组成? 带刺儿 花红色 叶子出汁白色 浇水少 有人叫楼上楼,四季之星 暂时只想起来这些谢谢大家 要把边长为1CM一个正方形水池完全覆盖,至少要做一个半径为多少的圆池覆盖 like 翻译成“像”的时候后面的动词应该是什么形式的? 你对读一本好书就是在和高尚的人谈话怎样理解 汉译英:1.我的学校叫二小.2.它在新区.3.建于2007年.4.占地45亩.5有教学楼3栋.两单词之间请不要空格,请用逗号.那个school后不能加's,要直加is. 幸福是什么? 急 饮了这杯祝福,让你拥有全部幸福 日本人气电子宠物菲比精灵 可用iPh德国反驳美国抨击 称顺差体现竞争力2013亚洲旅游节:探索亚洲旅游业发广西和泰国教育交流日趋密切日本今日起举行大规模“夺岛”演习 被澳大利亚两个月间39人遭遇隆胸假体破美澳等多国驻外使馆被曝精心伪装 监听美国务卿首承认:某些时候美间谍活动走朴槿惠访欧正值韩英建交130周年 英经济滞缓导致欧元区通胀率降至2009大阪高岛屋出现机器人销售员 酷似真人找准创作的坐标(编辑点评)母亲邮包进苗寨大胜不足喜 恶战仍在前(体坛聚焦)余光中文学馆开馆你在“群”里吗?(视窗·透视微信群(让食品智慧交流跨越太平洋中国为全球经济治理作出重要贡献中国稳居俄罗斯旅游第一大客源国科技短波“中企让我们的生活发生了变化”让国人吃上国产好苹果(关注)
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘