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

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

在DELPHI下读取与设置系统时钟 在Delphi中避免2000年问题的捷径 在Delphi中调用API函数 在Delphi中获取和修改文件的时间 在Delphi中控制扫描仪 在Delphi中实现对WIN9X应用程序使用权限的设置 在Delphi中实现对目录拷贝、删除和搬移的操作 在Delphi中使用自定义光标 在Delphi中用拼音首字符序列来实现检索功能。 在DELPHI中用线程排序 在Delphi中制作背景音乐 在Dephi中使用TStream读写数据的技巧-Delphi资料 在应用程序中跟踪MOUSE的坐标-Delphi资料 怎样建立回调函数-Delphi资料 怎样显示自定义鼠标光标(Cursor)-Delphi资料 找出消失的 Delphi 窗口 执行外部程序-Delphi资料 执行一程序并等待其结束-Delphi资料 制作一个不在任务栏及任务列表中显示的幽灵程序-Delphi资料 抓获全屏-Delphi资料 子目录级的文件查询的实现-Delphi资料 Delphi中ChartFX构件使用详解 Delphi中动画设计 Delphi中对Jpeg格式文件的处理... Delphi中多媒体组件使用解析 Direct3D起步:教程以及资源指南-Delphi资料 播放背景音乐-Delphi资料 弹出、关闭CD-ROM驱动器-Delphi资料 检测声卡存在-Delphi资料 控制声音音量-Delphi资料 让pc speaker美妙动听-Delphi资料 请教如何将.cab包解开 50分﹕HELP!!!為什么我的report分發后﹐項目全錯位了﹐應如何解決﹖ 各位,在工程中怎样用资源文件(*.res) !!请问如何利用ADO做三层设计? 哪位大哥有vfw.pas的啊?60分相赠 ATL在中国的现状怎样,大家进来说说!!! 如何黑一个网吧~~~ 急:问个初级问题,希望能得到解决 这个论坛不错! 能不能让C盘只读不写啊? 为什么CopyMemory在NT下的效率与在98下的效率不同! cmos密码如何破解 database控件的问题????? 关于if 语句! 急急急...所以的程序一运行报错:This Example Program Can Only Be Run From With The IDE? 我的机器一运行该页面就慢 怎样设置FileListBox1的路径 free,delete ,Free()的区别? 初学网络,从何学起?如何过渡 请问生成EXE文件以后,要把PB下的哪些dll文件拷贝过去,全部都要吗??还是只要拷贝几个就可以,请问是哪几个? 如何实现自动编号(在线等待) 请问如何在使用insert into时同时使用select和values语句?(十万火急) 怎样改变ListView1在详细显示模式下表头的高度(调用小5号字体)? 我用的是TomCat,请大侠们帮我看看这段调用access数据库的jsp程序那里错了!每次都提示“From字句语法错误”! 如何对数据窗口中的内容进行批量修改?急!!!!! 全上海暂无业者,联合起来!!! 请问如何在使用insert into时同时使用select和values语句?(十万火急) 高分解答!!!谢谢!!!! 字符'\'在c++中当什么看 初学者的problem,讲一讲 一个菜问题 我的爱机是不是感冒了? 关于.NET的资源占用问题? 大侠们好!!!为什么我用DBEdit输入中文可是在DBGrid中显示的是“#”?? 请教Sybase高手3个问题 有关打印的问题,急! 关于响应键盘事件!!菜题送分急!看看我的记录,我一向是当天给分的!!只要题答好。 SetParaFormat的问题,烦死了。 同时登上"vc版"和"网络通信版"榜首,高兴散分 在delphi 中怎么判断Sql Server 表中的字段为计算字段,急等 问个在Delphi里关于Socket的问题,别嫌弱啊 求租!上海! 如何实现描点视图的剪切板传输问题(复制) 帮我看看这题怎么解,谢啦 大侠们好!!!为什么我用DBEdit输入中文可是在DBGrid中显示的是“#”?? 在VB中如何用程序在SQL SERVER中加入数据库 哪儿有Programming Windows的配套光盘代码下载? 悬赏解密SQLANYWHERE 的DB文件 !!请问如何利用ADO做三层设计?! 什么原因能导致能够编译通过的程序:unable to create process呢? 如何保存整个 ctreeview 的信息 中亚只有内流河,和内流湖吗?另外,如果知道的话,请帮忙回答一下什么叫我国华北平原出现返盐现象?什么叫返盐现象? 求:优美句子! 在口袋里放红、黄两种铅笔.任意摸一支,要符合下面的要求,分别应该怎样放.摸到黄铅笔的可能性是1/5,可以这样放?有不同的放法吗 高烧时人产热散热为什么相等 优美句子 写出和以下诗句含相同道理或意境的成语1欲穷千里目,更上一层楼2谦虚使人进步,骄傲使人落后3读书破万卷,下笔如有神回答满意的可追加分‘、50---100急. 高烧时打哆嗦是散热还是产热? 达达主义和波普艺术的区别简单描述一下它们的区别各自的特点及所倡导的思想~不要粘贴来的, 指景色富有诗、画的意境.的成语有哪些? 遥感与地理信息系统在化学领域有哪些应用? 求优美诗句用 清风 乘云 万紫 雪羽 血色 青绸 落羽 暗香 仙侣 暗淡 改成5个字的句子 不要求和诗一样连着 只要格式差不多就好 类似 初风染堇色 流苏落晚衣 这种的 4字也成 有几个算几个一 形容心里不舒服,情绪低落的样子.是什么成语意思? 生物:人体每天正常摄取的蛋白质是多少啊? 优美的句子 根据意思写词语:情绪低落,非常伤心. 生物题:蛋白质在人体什么中被初步消化,在什么中被彻底消化和吸收? 1、关于大气环流的叙述( D )A、信风带都分布在副热带高压带南侧B、高气压带控制的地区气流都是上升的C、西风带内的风是寒冷湿润的D、赤道低压带和极地高压带是热力因素造成的2、关 遇到不愉快的事而情绪低落这个意思对应的词语是要注意准确,四字词 补充里为人体蛋白质的有关代谢问题,请回答:⑴蛋白质是人体的重要营养物质,人体每天必须摄入足够的蛋白质才能满足人体的需要,其原因是什么?⑵人体内某些氨基酸不能通过氨基转换作用 人体的产热和散热是相等的,那么在发烧的情况下是什么情况? 急 请你将右图画面的意思分别用六个子表示出来,把这六个字组合在一起,又可以组成大家都喜欢的一个词,这是什么词? 谁能帮算下额定功率多少,最大多少.顺便给下公式 为什么人在发烧的时候产热量和散热量是相等的?发烧的时候体温不是上升么?可是为什么产热量会和散热量相等?顺便稍问一句,为什么进行了骨髓移植后血型会变?血型不是遗传基因控制的么? 51最小系统为什么用10千欧电阻10微法电容 什么叫达达主义 人高烧不退的时候,体热的产热=散热 那体温上升的时候,产热和散热又是什么关系?比如说从37度升到39度这个过程,产热和散热的关系是什么 卤代烯烃用系统命名法,先考虑双建排号最小,还是先考虑卤素原子排号最小 达达主义的意思? 请你根据下列诗句的意思各写出一个相同道理或意境的成语)1,会当凌绝顶,一览众山小2,小娃撑小艇,偷采白莲回3,千磨万击还坚劲,任尔东西南北风4,春色满园关不住,一枝红杏出墙来5,草长莺 怎样镀铜,最好简单点, 达达主义有什么惊人的艺术主张 人体在发烧时的产热和散热是怎么样变化的?代谢是怎么样变化的?ATP的分解? 往植物表面镀铜需要什么工艺呢? 达达主义收到什么哲学思潮的影响 关于高中地理——气压带和风带气压带和风带真混乱.为什么亚欧大陆西部盛行西风却有地中海气候?还有,南半球的风向是怎样的?气压带是不是随着太阳直射点的移动而移动的?.怎样根据气压 为什么西北地区多内流河和湖泊?它们的特点是什么? 我的理想作文,不用太多,一写些好词好句就行不过也别太少啊,200字至600,越多越好啦,写当编辑的或服装搭配师, 名词解释--达达主义 西北地区最长的内流河是 我的理想作文,好词好句多的 1.是不是全球都受气压带风带的影响?那为什么有的地方吹季风有的地方吹西风或信风?2.高压切低压是怎么回事? 有没有可控核聚变的?可控核聚变需要什么条件 形容说话一点不剩的词就是形容那种心里面憋了好久的话全部一下子说出来的词.紧急提问! 有谁能详细的介绍一下“汽车内饰设计发展史”.请注意是“汽车内饰设计发展史”不是“汽车发展史”. 风带与气压带.不明白是怎么从图中看到所有的风向都是往左偏的. 把有的说成没有的可以用什么词语形容啊?,...不是无中生有哦 是把有的说成没有的 平面设计发展史每个发展阶段的特点是什么 高中地理所涉及的风带,气压带? 形容说话不流利的词语 我自己写了一首诗,母亲的眼泪 女娲下凡来到尘世间,开始人类生命的起点.地球母亲流下了喜悦的泪水,香甜.大地上出现第一棵火苗,这是人类文明的起点.地球母亲流下了激动的泪水,甘美.滚滚 请把这句英文改成更漂亮的句子He may not be a talent smart enough to master knowledge fast.(master knowledge 好像很奇怪的用法.是么?如有更好意见请改之, 中亚的河流多为内流河,主要河流有哪些 大家看我自己写的诗怎么样?这是首骂无信小人的诗,你们可能看出什么来?无人不遇厄运时,信尔方起救悯心,小烦已随东风去,人心且遭豺狼食,猪肥献身报食恩,狗念恩情不弃穷,不想人心逊猪狗, ____能感受内、外环境变化并产生神经冲动 中亚地区多为内流河的原因 人体最多摄取蛋白质才不会有反效果?如题 形容句,要象小说那样句子优美,长些一:美女:1.冷酷无情,皮肤白,头发微发黄,高才生2.野蛮,热情,头发乌黑3.有智慧,没前两位漂亮4.可爱,活泼.二:帅哥:1.微笑如阳光一般,优雅,个子高,运动很好(象 中亚的河(湖)为何多内流河(湖)?能更具体分析一下吗,请问这跟中亚的地形是否有关? 根据下列诗句的意思各写一个含有相同道理或意境的成语王师北定中原日,家祭无忘告乃翁.( ) 诗文、图画、思想或道理等方面而达到的高度、意境 是什么成语
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘