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

基于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资料 编写网络寻呼机 -VB资料 编制自已的电话录音小程序-VB资料 程序中如何启动默认的拨号连接-VB资料 打开浏览器并进入指定网址-VB资料 得到用户的IP地址 -VB资料 电话拨号 -VB资料 电子邮件的标准格式 (RFC 822)-VB资料 断开拨号网络的连接-VB资料 断开与 Internet 的连接 -VB资料 发送电子邮件附件-VB资料 VB获得用户网络登录名 基 于Win95 的VB5 串 口 通 信 程 序 基于Win95的VB5串口通信程序 检测运程数据传送的断线-VB资料 简单电子邮件发送程序-VB资料 VB建立拨号联接 -VB资料 将所有窗口最小化-VB资料 VB利用IE控件访问Internet VB利用IE控件设计简易浏览器 VB利用Mscomm32控件判断MODEM是否打开,或者正在工作,并且判断拨号时是否遇忙音 VB利用TAPI进行电话拨号 利用VB访问Internet 利用VB设计聊天室 利用Visual Basic实现无线通讯 VB利用Winsock控件实现局域网通信 VB如何从 Internet 上取回某一个网页的內容? VB如何检测是否已连接到Internet? VB如何利用Winsock控件编写自己的Internet程序 VB如何每天抓取 Internet 上某一个网页中的图片来更换桌面的壁纸 VB如何启动拨号网路中的连线? 怎样在VB中加入动画? 费时操作是如何估计所花费时间的? 为什么我新装的机器在播放声音和视频文件时速度比原速度快了好多? 怎么样清楚Cookies 如何通过一个链接弹出一个没有标题栏,没有菜单栏,没有地址栏等的新页面? 配置问题,在线等待?分不够再加! MFC基础, 如何实现在CScrollView上, 把某一文本文件显示出来(不用file - new)? 求救:请问哪儿有《Beginning Visual Basic.Net》英文书下载??? 高分100 label 控件刷新问题 如何通过一个链接弹出一个没有标题栏,没有菜单栏,没有地址栏等的新页面? 实现这样一个报表??????? 求救。。。。。Access2000的数据库密码忘了,该怎么办呀!!! 动态产生的列表框,如何让记录按列对齐? 为什么有时自动打开网页,有时却不能? 在JDBTable中如何选中行? 我想让进度条竖着从下往上显示,应该怎么做? 可否知道数据表即将产生记录的标识键值???? 怎样让程序启动时最大化,但又不允许用户再还原或者改变窗口大小,谢谢! 紧急求救!关于ADSL下的固定IP地址访问问题,相关IP地址转发技术 谁见过这种编译错误,怎么办啊? 我的RH7.2不能Telnet ,请帮忙. GPRS 有无条件等待指令吗? 简单的问题_50分。 在vba的编写过程中无法在excel中调用word等其他对象,怎么办?(顶者有分) 事实证明,weblogic会对注释行报错! 一个让人困惑的问题 bcp 的问题 请问:有没有UNIX下的测试工具? 请问一个关于BCB消息MAP的问题... 系统2000,用installshield6.0包了程序,有问题 请问我用VC++做的数据库程序怎样打包在线等待急用, 在控制面斑-- >删除/添加程序 选项中 Win2000和Win98怎么不一样啊 改写了8254后如何得到正确的系统时钟 在别人机子上生成报表时提示出错,除打包安装外有无其他办法? ★ 懂 ORACLE 和 DB2 的高手请进... ★ 求助!!! 100分求小软件 为什么MediaPlayer播放不正常? 关于在向固定格式的Word模版中导入数据的问题,急!!!!!!!!!!!!!!! SQL SERVER 2000简体中文企业版 与 SQL SERVER 2000简体中文标准版 区别 同时装了Win2000和Office2000的朋友,快看看自己的电脑有没有这样的毛病:)送分! 干掉靖国神社..http://www.yasukuni.or.jp/index2.html 在我调试程序时,出现了有关"cs3250mt.dll"文件的出错信息,是怎么回事呢,急死我了!!!大家帮帮我吧!!! 关于windows media 问题,请教了!!! 如何在两个FORM中互相调用控件??? 关于控制发音。 高分请教一个对话框程序问题。!!!!!!!!!!!!!!!! 怎样处理数据库,才能在企业管理器及查询分析器中不能直接看到数据库结构 高分请教,如何获得“正在进行的共享连接” Delphi中如何创建控件数组 中秋节虽已过去,但是很多人家还有很多没有吃完的月饼.某同学观察到家中的月饼包装袋内都有一小包干燥剂 电阻的色标位置和倍率关系 请高手回答下 我是初学者比如说 电阻的色标位置和倍率关系如下表所示:颜色 有效数字 倍率允许偏差(%)银色 / x0.01 ±10金色 / x0.1 ±5黑色 0 +0 /棕色 1 x10 ±1红 人类为什么会出现在世界上? 芳香化学物和脂环化学物如何区分呢? 电阻的色标法中 红色代表的有效数字是几 a lot of;lots of;a lot的区别和用法? 用色标法怎么判别电阻的大小?用色标怎么看电阻大小... 电阻的色标法中,红色代表的有效数字是? a lot和 lots of的用法 果胶酸法水解机理,为什么不能碱水解 电阻的色标环和测得的量不符我板子上有个五色电阻,色环为棕(好像也是红),红,黑,金(是个黄色,搞不清是是金还是黄橙),红.用数字表万用表200K欧档,测得数字24.6,它的实际数值是多少,表 世上为什么会有我们这些人类呢? 酸法提取橘子皮果胶工艺的优化研究试验的过程 果胶酶可将紫甘薯匀浆中的果胶水解成什么? C3H6的同分异构体丙烯的同分异构体.急需.麻烦写清楚点.谢谢.环状的麻烦附一下图.图的话上传空间然后复制地址就好了.谢谢了. lots of 和 a lot of在用法上有什么区别? 果胶酶和果胶水解酶的区别?类似的讲解也可以!(蛋白酶之类的) 小屁孩问我为什么挪威船长特别多,怎么解释清楚? a lot of 和lots of 的用法和区别列举 列举例子 如:用法上有什么不同 用在可数还是不可数的 都要列举一个例句 三Q三Q 加热为什么不利果胶水解?为什么不是越热越水解? 二甲亚砜沸点 半干法脱硫 缺点不懂的不要瞎掰, 细胞壁都可以被纤维素酶水解吗?果胶酶呢? 谢谢 二甲亚砜是什么 培育和保持企业核心竞争力的注意要素 如何看电阻色标? 脱硫系统中增压风机放在什么位置增压风机和引风机的位置如何布置? 浅谈如何培育企业核心竞争力 电阻器的色标,从哪个方向开始读呀?从左到右,从右到左?呵呵不过,昨天读一个,从这个方向无意义,因为读成"1-0"从另一个方向就可以读出有意义的数字组合. 330WMW脱硫中的增压风机耗电量是多少? Here is a notice___the board.Aon.Bat.Cin 五元环的酯类化合物和六元环的酯类化合物 怎么写出来的根据什么写出来的呢?是CH2OH(CHOH)4COOH 脱水后形成的.怎么写出来呢? 电厂脱硫氧化风机起什么作用 民营企业核心竞争力怎么培育? 关于脂环化合物碳的个数问题脂环化合物 CnH2n n趋向于正无穷,能出现这种化合物吗?是形成一个环?多个环?如果不能,又是什么原因呢?如果是杂环呢? 氧化风机出口温度与脱硫率关系? The announcememt will be__ on the notice board.A.put upB.put offC.put downD.put on 为什么会出现人类? 脱硫增压风机电流逐渐降低的原因正常运行中,导叶全开的时候,电流395A约2个月时间,缓慢下降,降至365请各位帮分析原因?我能考虑到因叶片磨损或腐蚀,还有其他什么原因? 餐饮企业核心竞争力的培育?几篇关于“餐饮企业核心竞争力的培育” 的论文 lot of;lots of;a lot;a lots;a lots of;a lot of的区别 电阻的色标怎么读的?比如说是一个1230的电阻 应该是综红橙综?也可以理解为12000误差为1%的电阻啊 色标电阻如何读值 a lot of与lots of的区别是什么? 英语翻译如题 1K电阻是什么色标.10K电阻是什么色标 a lot of / lots of嗯There is a lot of water.There is a lot of books.There are lots of books.There is lots of water.这是我的猜想.这里的there be句型中的be 是根据a lot of、 lots of 的变化而变,还是根据后面那个名词的变 central weighted median filter (CWM) ,^-^为什么会出现人类啊`? lot of、a lot of与lots of的区别 世界上为什么会出现人类呢?这是为什么. 人们穿的化纤面料的服装为什么容易脏? 围魏救赵的故事?要真的! a lot of和lots of的区别与用法 想知道中国服装将来的走向会是怎样?化纤面料又将何去何从? 环境恶化、( )和( )是当今地球所面临的重大问题 为什么世界上会出现人类? 冬天穿化纤布料的服装特别爱“上灰”甚至拍都拍不掉这是为什么 现在地球面临的环境问题对地球有那些影响 a lot of,lots of与a lot的区别与用法,举例说明
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘