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

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

《近匠》专访AbleCloud李海磊:IoT平台求变 腾讯、京东、微软等设计专家齐聚,探讨移动应用体验创新设计 TIOBE 2015年5月编程语言排行榜:微软系语言份额上升 《Hadoop核心技术》作者翟周伟 :我与Hadoop的不解之缘 云集百位核心专家 中国云计算大会演讲议题公布(表) 细品这杯香浓的咖啡——阿里中间件高级专家沈询的Java之旅 超图研究院院长李绍俊:创新2.0时代的平台软件研发体系 优麒麟(Ubuntu Kylin)15.04发布派对在天津成功举行 【CTO讲堂】以API为核心的移动应用云大发展时代 游戏设计的迭代误用:从半成品到概念修正 成功的社区在于拥抱变化——知乎创始人周源专访 优化UITableViewCell高度计算的那些事 国外iOS大牛:开发Apple Watch应用我犯过的错 云上Java System Profiling与Debugging——蚂蚁金服观察与实践 搜狗商业平台Java技术实践 Java在电信软件领域的技术实战 关于Java框架Vert.x的几点思考 Java在游戏服务器开发中的应用 Java框架研发思考 那些年,Java程序员用过的开发工具 Java内存模型的历史变迁 Java 8与Apache Ignite Java开发与技术挑战——关于技术的技术思考 专访唯品会架构师肖桦:做编码的架构师 越来越“简单”的Java 我的Java!越过山丘 专访沙梓社:做个“Think Different”的技术牛人 基于ES6,使用React、Webpack、Babel构建模块化JavaScript应用 财税街创始人石克清:创业须空杯心态+有效社交 自我知识管理:连贯性就是生产率 玩转Google I/O 2015:Android M、IoT、Glass 2.0、VR、ATAP 我写的java小程序出错,为什么 告急!!请问怎样得到数据库中所有表的名称,怎样检查一个表是否存在? 资源共享!!!!!!!! 请各位介绍一下初学C#的好书,注意是初学者,谢谢! 请问。哪里有MapPoint 2002的下载? 生死时速!!!! 在线等待:把VIEW1中把所有字段 VVV 中值相等的纪录 中所有字段中的值相加怎么办? 应当怎样使用appletviewer? 代理软件出现的问题! VB and VC 我在ADOCE编程时发现好像其中执行的SQL语句不支持Update,是这样吗?如果是那怎么修改记录呢?请指教!!! (100分)用Microsoft jdbc Driver for sqlserver2000(type4)访问sqlserver2k的问题,help! 关于SQL SERVER 数据库连接? iis4下载 请教 在线等待:把VIEW1中把所有字段 VVV 中值相等的纪录 中所有字段中的值相加怎么办? 有关数据窗口的问题 那里有cscwbook(计算机协同工作导论 史美林等编)下载,谢谢! 如何得到登陆到服务器上的所有机器IP地址 大家说说.....(高手快进) 菜单 如何实现在TabPage之间切换 有谁知道ActionList1控件是做什么用的吗? vb制作浏览器的问题 QuickRpt制作的报表存盘的问题。 请问在VB中如何做饼行图和柱状图? c++中ctor是什么意思? 关于数据库 对话框数据共享的问题 怎么让我的非模式对话框出现在屏幕中间 高程有无含金量 进程,线程。STA,MTA ,COM 对象之间的关系?请讲解一下,举一个例子。谢谢 {KDE}:我的KDE进不去了 返回值是动态数组的函数如何递归调用? 关于Tdatetimepicker的显示格式问题 谁能告诉我那里有visual c++ 6.0 技术内幕的光盘??? 关于JPEG和MJPEG??? 进程,线程。STA,MTA ,COM 对象之间的关系?请讲解一下,举一个例子。谢谢 一个关于动态链接库的问题 关于WEB共享的问题? Oracle8i不能登录,报告“凭证检索错误" 我想结束一个话题,回复次话题者得分。 密码忘了怎么办 数据库高手请进 关于AC97声卡(100芬) 如何将javascript对象中的内容保存到数据库中去???? 失恋了,非常郁闷,想散分都不行(各位开导开导) 在西文dos下,打开txt文件,并在屏幕上显示,怎么编程呀? 天理何在?为什么降我的信誉值,这个论坛谁说了算,出来说个理由。 Visual J++ 6.0的问题! 关于Word,IE等程序的设计模型问题? 在线等待BCB+Access 我的世界狼怎么繁殖 五(2)全班48人去划船,公园里大船每条坐6人,小船坐4人,一共租了9条船,租了大,小船各几条~快 指针万用表的1K是不是表示只能测比1K小的电阻那数字的呢?他们都是怎么接读数乘以倍率吗 我的世界喂养动物需要什么食物 水呢?(手机版) 我的世界怎么养狼 如何使用万用表测量电阻,电压,电流,与如何判断它们的好坏. 不是理想的情况下,一辆匀速运动的汽车,它的动能是多少?牵引力与汽车所受的摩擦力一样大吗?动能表达式不是末动能和初动能的差吗? 猫的繁殖方式是什么? 计数单位就是数位?是对还是错? .站在匀速行驶的汽车里的乘客受到几个力的 作用 答案是2个不是有重力,支持力,牵引力,摩擦力这四个吗 如果猫像狗了,狗像狼了,狼像猪了,那么猪像谁呢? 探究加速度与力和质量的关系实验里,改变盘和砝码质量后需要重新平衡摩擦力吗? 如图所示的滑轮组提升物体,已知物体重480牛,以0.3米/秒的速度被匀速掉起,若绳子自由端的拉力为200牛,不计绳重及摩擦,求滑轮组的机械效率是多少?拉力的功率是多少.图片: 几个证券投资学判断题,需要改错~10.组建证券投资组合是投资过程的第三步,它涉及到确定具体的证券投资品种和投资者的资金投入各种资产的投资比例.1.波浪理论和财务分析中都涉及到比 多用电表的原理是什么?用它测电压,电流,电阻的时候,表笔的接法有什么区别?红黑表笔各接的是电源的哪 请问,一只羊能换6只鹅,2只鹅能换6只鸡,那么5只羊能换多少只鸡? 判断题,错的要改错 探究力,加速度和质量的关系的实验中平衡摩擦力后,小车下滑时机械能是否守恒? 一只羊换6只鹅、2只鹅换7只鸡、4只羊换几只鸡? 判断题:正确的打对 不对的改错一个十和一个百分之一组成的数是(10又一百分之一),它的计数单位是(百分之一),它有(1001)个计数单位. 多用电表测电阻时,红黑表笔分别与多用电表电源哪一极相连?测电压是 哪个笔与外电源正极相连 1只羊能换6只鹅,2只鹅能换7只鸡,那么4只羊能换多少只鸡? 矿产工人用200牛的水平拉力,抓紧绳子一端,在10秒内 某矿产工人用200牛的水平拉力,抓紧绳子一端,沿水平地面匀速向右运动,在10秒内将矿井里质量为32千克的物体提升4米. 该煤矿工人做了多 在探究加速度与力和质量关系实验中,如果平衡了摩擦力,则小车质量需不需要远大于砝码质量? 一只船从一码头顺流而下,再逆流而上,打算在8小时之内回到原地,已知这条船在静水中的速度是10千米/小时,水流速度是2千米/小时,问此船最多走多少千米就必须返回,才能在8小时内返回原地? 改错字和判断题, 万用表电阻档红黑表笔接触时电阻一般是多少 2只羊换6只鹅,2只鹅换5鸡.4只羊换成几只鸡 使用万用表的测量方法(MF47D型)a.测电阻:b.测电流:c.测电压.分别怎么测? 在实验探究加速度、力、质量的关系中,平衡摩擦力后,为什么每次实验时必须在满足小车上所加砝码的质量...在实验探究加速度、力、质量的关系中,平衡摩擦力后,为什么每次实验时必须在满 二力平衡的时候如果摩擦力等于牵引力,那怎么运动,就应没有匀速运动的状态呀比如说10N拉车,也会有10N的摩擦力,有相反,怎么会动呢? 我的世界怎么给鸡喂小麦 一个圆柱体的侧面积是18.84平方厘米,底面半径是3厘米,它的体积是( ) 一只船从一码头顺流而下,再逆流而上,打算在9小时内回到原来出发的码头,已知这只船在静水中的速度为每小时18千米,水流速度是每小时2千米问此船最多走上多少千米就必须返回才能保证在9 我的世界1.72小麦吸引不了动物我拿着小麦走到鸡,牛,羊身边,他都不跟我走,看我一眼就转头了,还有围了两只鸡,过了一天就不见了. 物理实验题:“探究加速度与力、质量的关系”平衡摩擦力的步骤中,木板的倾斜角过大或过小有什么后果?如果有折线图就更好了. 一根绳子能成熟的最大拉力是19.6牛,用它拉一个浸没在水中的质量为2.7千克的铝块在水中匀速上升(不计水的阻力),问:(1)铝块全部没在水中时,绳子对它的拉力多大?(2)铝块露出水面的 怎么在我的世界里 用小麦吸引牛啊 我把小麦拿手上,牛看我一眼走啦 写出每个式子的意思:小红家养鹅X只,养的鸭比鹅多10只,养的鸡是鸭的2倍.一.X+10.二.2(X+10) 三.X+X+10.四.2(X+10)-X.五.X+X+10+2(X+10) 一艘轮船从一码头顺流而下,再逆流而上,计划8小时回到原来出发的码头,若船在静水中的速度是10km/h,水流速度是2km/h,那么这艘船最多顺水走 km,就必须返回.到底是38.4还是8啊 我的世界小麦可以吸引牛羊吗? 大船6人小船4人 有一块铝重2700牛,当它浸没在水中时,排开水的体积为多大?若铝快被一根绳子栓住,求绳子对铝块的拉力.初二科学上 水的浮力 工人用一个动滑轮提起重物,他在绳端用300牛的拉力竖直向上匀速提起重物不计动滑轮的重力和摩擦,则物体重_______________牛,若绳子自由端移动2米,则物体升高_________米 一个专业户养鸡480只,养鹅的只数是鸡的5分之2,是鸭的2分之1.养了多少只鸭 一只船从一个码头顺流而下,再逆流而上,打算在8小时内回到原来出发的码头.已知这只船在静水中的速度是10千米/小时,水流的速度是2千米/时,那么这只船最多走多少千米就必须返回,帮能在8 我的世界1.5.2小麦可以吸引什么就是想养动物但是不知道怎么让动物进我家 大船6人,小船4人 一根绳子能成熟的最大拉力是19.6牛,用它拉一个浸没在水中的质量为2.7千克的铝块在水中匀速上升(不计水的一根绳子能成熟的最大拉力是19.6牛,用它拉一个浸没在水中的质量为2.7千克的铝块 用动滑轮在20秒内将重300牛的重物匀速提升,所用的拉力是200牛,绳的自由端被拉上1米1.动滑轮的重力2.物体被提高的距离3.拉力做功4.拉力做功的功率 万用表DT9205测电流和电阻怎么使用?刚刚学怎么用表,麻烦写的简单明了些 穿在静水中的速度是24千米/小时,水流速度是2千米/小时.从码头逆流而上,在顺流而下,船最多开多远就就返才能在6小时内回到码头 怎样用万用表测量电压、电流和电阻(分别回答) 万用表电流档内电阻怎么算?书上说 万用表直流电流档各档的内阻为:500mA~1.5欧,100mA~7.5欧,准确度为2.5级,那个准确度2. 一根绳子能成熟的最大拉力是19.6牛,用它拉一个浸没在水中的质量为2.7千克的铝块在一根绳子能承受的最大拉力是19.6牛,用它拉一个紧密在水中的质量为2.7千克的铝块,如果铝块在水中匀速上 奶牛,鸭,大象,农场,肥胖的,狐狸,狮子,猪,绵羊,用英文怎么读? 如何用万用表电阻档验证电容器的好坏,原理是什么,用电路暂态的有关知识解释如果指针偏转后不能返回原刻度,说明什么;如果指针偏转后返回速度很慢,说明什么。 我的世界 狼和猫能同时养在屋子里么?如果猫和狼养在一起,狼会吃掉猫么? 奶牛用英语怎么读? 用打点计十器探究加速度与力的关系时,需要平衡摩擦力.平衡摩擦力时 应该使小车1.挂上钩码,拖上纸带,开打点计时器2.不挂钩码,拖上纸带,开打点计时器3.不挂钩码,不拖纸带4.挂上钩码,不拖
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘