王朝网络
分享
 
 
 

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

王朝厨房·作者佚名  2007-01-04
宽屏版  字体: |||超大  

---- 一. 概述

---- 几乎所有数据库应用软件,都需要打印单证和报表。常见的方法是利用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环境中调试通过。

资料来源:孔祥军 苏悦娟

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有