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

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

Windows 初始化文件的修改 -VB资料 Word 97与WPS97的完美结合 -VB资料 比较两个文件-VB资料 采用递归算法删除带有多级子目录的目录-VB资料 菜单项的动态装入 -VB资料 处理加了密码的MDB文件-VB资料 VB创建临时文件 从公共对话框控件中提取多个文件名称 -VB资料 从全路径名中提取文件名 -VB资料 打印MsChart之类的控件 -VB资料 谈谈在VB6.0中如何使用资源文件进行编程 动画图像分解在VB动画设计中的应用 多重文档界面设计方法-VB资料 恢复回收站中的文件 -VB资料 VB获得位图文件的信息 VB获得文本框中光标所在行的内容 VB获取程序工作路径的方法 VB获取文件或文件夹属性 基于VB的通用折行打印程序 基于VB和EXCEL的报表设计及打印 VB建立多级目录 -VB资料 VB建立快捷方式-VB资料 VB建立文件关联 -VB资料 将RichTextBox 之中被选取的内容复制到剪贴簿-VB资料 将我的程序的文本直接送到WORD中(不用粘贴)-VB资料 开启文件属性窗口 -VB资料 快速读取 TextBox 第 N 行的资料 -VB资料 快速选择里List全部项目-VB资料 VB利用 App.Path 读取「应用程序所在之目录」 VB利用 EM_LINESCROLL 信息控制 TextBox 的卷动。 命名的技巧 -VB资料 fatal error C1010 找一个和VB的属性区一样的代码,控件或类库均可 如何调用在不同的窗体里自定义的过程 一个技术探讨问题,我想知道象在WORD等软件中插入图形或图象后,还能把它选择,并移动是怎样实现的? 请问:在另一个.asp文件中如何调用相同的变量? WEB初级应用问题 DIALOGBAR问题 请想报考明年的网络设计师的朋友进来聊聊 Oracle面向对象特征讨论,请进! 我学会VISUAL C++ 到底要多少时间 线程调试问题 大家一起进来讨论oracle和sql server的日志哦 请指教如果设置服务器端COM组件的权限,使终端可以访问到?分数好说啦,急,高手快帮忙! 如何把程序嵌入到widows Expolore 中? 今天心情特好!散分 在vc下怎样调出window下的“打开方式”对话框,他是类还是控件!请高手指点! 一个门外汉的问题~~~~ 谁知道windows共享密码如何算的 vc中asm怎么不執行? 在开始菜单点右键,拉出的菜单里的内容,怎么添加删除?? 帮忙找一个和VB的属性区一样的代码,控件或类库均可。 Word 中字体的问题 我买了一台SLE4442读写器, 为什么不能写 谁用过FAST REPORT 请求帮助 realplayer中文件菜单栏中的以看过的文件名,怎么删除??? php如何改写或者是添加一个cron的命令参数给linux服务器? SQL Server 能制作表单和报表吗?????? DirectDraw页面格式问题(两个)。答对100分绝对送上,从不食言!(附源码) VC++中的内部交互调试器在哪? 人邮版的C++面向对象高效编程如何? realplayer中文件菜单栏中的以看过的文件名,怎么删除? 如何实现真正的无标题栏的拖动? 用"select top n"取了前n纪录后,要再接着取n+1至2n条纪录,接着再取2n+1至3n……,这种取法要怎样实现呢? 如何在Excel中编制一个宏? 如何得知程序的一个实例正在运行? 送分了,送分了,虽然不多,但天天有! 为什么select count(*) from test 时,提示表或示图不存在!!! 请问如何设置mp3文件的在线播放?? 请问在内部局域网正常的情况下,打印机无法共享(共享以后没有效果)的主要原因是什么?谢谢! ===我对Linux上的Oracle8.1.7.0.1操作的时候只读,为什么啊???==== 请给我一个GetCurrentDirectory使用实例, 问一个深入MFC的简单问题 请问有关delphi项目编译的一个小问题。 各位,那里有VisualAge for Java4.0下在?我从ibm的网站上下载了,但是安装不了,说是语言不对! shcv.dll 编译不过去!!!!! have a test!have a test!have a test!have a test!have a test!have a test!have a test!have a test! mysql 结果中再次查询如何才能实现呢 pc2phone java支持byte[] a = String.getBytes("iso-8859-1");转换吗? c语言中关于对windows命令调用的语法、命令及其格式。 小明按1:100的比例尺画出教室的长是acm,小强按1:150的比例尺画出的教室长是多少? 一个长方形花坛,周长是48米,长是宽的2倍,这个长方形花坛的长和宽分别是多少米? 在物理公式中:电流是电压除以电阻计算出来的吗? 小明按1:100的比例尺画出教师长的线段是7.5厘米,小强按照1:150的比例尺画出这个教室长的线段应是()厘米. 一个长方形花坛,长和宽的比是7:4,如果长减少2米,同时宽增加4米,它就变成正方形,这个长方形花坛的面积是多少平方米(接上面的)?要有列式,要讲解,好的提赏! 电压 电阻 电流 之间的公式计算什么的 还有一些功率 什么的公式 例如:R=IU 什么的 列全啊求求了 最好列 清楚一点 物理电学给我学的都快阳痿了 小明安1:100的比例尺画出教室长的线段是a厘米,小强按照1:500的比例尺画出这个教室长的线段应是()厘米 一个长方形花坛的周长是120米,长与宽的比是3:1,这个长方形花坛的长和宽各是多少?面积呢? 3.56万改写成用“一”作单位的数是() 当x≠0时,(2x-1)的0次幂为什么无意义 若函数f(x),g(x)分别是R上的奇函数,偶函数,且满足f(x)-g(x)=e^x,比较g(0),f(2),f(3)的大小要有过程 谢! 正项等比数列an的前n项和为sn,a1=2,且a2,a3的等差中项为s2,求an的通项公式正项等比数列an的前n项和为sn,a1=2,且a2,a3的等差中项为s2,1.求an的通项公式2.设bn=log2an,求数列{bn}的前n项和Tn (x-1)的零次幂加2-x分之1有意义,则x的取值 若函数f(x),g(x)分别是R上的奇函数、偶函数,且满足f(x)-g(x)=e^x,比较f(2)f(3)g(0)的大小 如右图,大正方形CDEF的边长是16cm,四边形ABCG是正方形.求阴影部分面积 当x___时,(x+2)/(x-2)-(x-1)0次幂,有意义 若函数f(x)和g(x)分别是R上的奇函数和偶函数,且满足f(x)-g(x)=e的x次幂Y=e的x次幂为什么是增函数?e的x次幂为什么大于0? 如图,正方形ABCG的和正方形CDEF的边长分别为a、b.(1)用含a,b的代数式表示阴影部分的面积; (2)当a如图,正方形ABCG的和正方形CDEF的边长分别为a、b.(1)用含a,b的代数式表示阴影部分的面 当x趋向于无穷时,1的x次幂=?,x的0次幂=? 若函数f(x),g(x)分别为R上的奇函数,偶函数,且满足f(x)-g(x)=e^x,设a=f(2),b=f(3),c=g(0),则a,b,c的大小要有过程的,e^x表示e的x次方 串并联电路谐振原理及电路电流、电压、电抗计算公式是什么?混联电路不单是串联或并联,要在一起的电路 试画出用两个启动和两个停止按钮在两个不同地方,对同一台三相异步电动机进行“启动”和“停止”控制电路 若函数f(x),g(x)分别为R上的奇函数、偶函数,且满足f(x)-g(x)=e^x,则g(0),f(2),f(3)的大小关系为_____. 串联谐振为什么是过电压?并联谐振为什么是过电流? 三相异步电动机行程控制电路的接线图怎么画如题,最好是有图,很随便的图也行.因为我对这个一窍不通,文字的话我应该看不懂. 380V配电柜上三个电流表都显示100A怎样算他功率?是P=1.732乘电流i乘电压380V在乘功率因数吗 0.8的计数单位是( ),把它改成用0.001作单位的数是( ) 已知an是等比数列,(a4+a8)(a6+a10)=49,则a5+a9等于 试画出既能连续工作,又能点动工作的三相异步电动机的控制电路. 四边形abcd是边长为12cm的正方形,e是正方形的中心f是bc边的中心求阴影部分面积 在等比数列{an}中,a4+a5=10,a6+a7=20,则a8+a9等于 在等比数列{an}中,已知a6-a4=24,a3a5=64,求{an}前8项和 正方形ABCD边长12cm,阴影部分面积24平方厘米,求梯形ABCDE的面积. (x+1/x)的九次方的展开式中X的三次方的系数为多少 小明住的房间地面是长方形,长4米,宽3米.(1)小明房间的长和宽分别缩小到原来的一百分之一后,场小明住的房间地面是长方形,长4米,宽3米.(1)小明房间的长和宽分别缩小到原来的一百分之 正方形ABCD的边长是12cm,且E是DC的中点,求阴影部分面积. 利用延时器星形转三角形降压启动电路图 明明住的房间地面是长方形,长4米,宽3米.(1)我们把明明房间的长和宽分别缩小到原来的一百分之一,得到的长和宽分别是多少厘米?(2)请分别算算房间地面的实际周长和缩小后的周长,再比 等比数列an,aq 鼠笼式三相异步电动机做星形连接时的线电流是做三角形连接时线电流的多少倍? 若某数列前n项和公式Sn=a^n-1,则an是等比数列吗证明 甲乙两数互为倒数,把甲数缩小10倍是4分之1,原来两数的和是 星三角形降压启动电路帮忙分析下电路原理啊!和排故步骤! 一个长方形的长增加10%,宽缩短10%,那么现在长方形面积是原长方形面积的百分之几?最好要算式, 下图甲,乙都是正方形,a=12cm,b=10cm,求阴影部分面积 三相异步电动机星-三角形降压启动控制1、画出继电器-控制器控制电路,说明工作原理.2、画可编程序控制器控制的I/O配线图.3、画可编程序控制器控制的梯形图. 数列{an}的前n项和为Sn=3an+2(1)证明:数列{an}是等比数列(2)求通项公式 一个电机功率是3KW.电压是380V,电流是6.3A.这个电流数是怎么求出来的 已知等比数列{an}的各项都是正数,且a6*a10+a3*a5=41,a4*a8=4,则a4+a8 一个长方形各边按一百分之一缩小后的长是0.84米,宽是0.3米.求这个长方形的实际长和宽,并求出面积! 求下面图形中阴影部分的面积,上底是10cm,下底是12cm,高是8cm. 已知等比数列{an}的各项都是正数,且a6*a10+a3*a5=41,a4*a8=4,求a4+a8 设数列{an}的前n项和Sn=2(an-3),证明{an}为等比数列,并求通项公式 电压 电流 电阻的关系?什么公式? 等比数列{an}中多项均为正值且a6*a10+a3*a5=41,a4*a8=5 求a4+a 如果函数f(x)=a的x次幂乘以(a的x次幂-3乘a的2次方-1)在区间[0到正无穷大)上是增函数,那么实数a的取值范围是:(A)(0,2/3] (B)[3分之根号3,1) 已知数列{an}的前n项和为Sn 1若数列{an}是等比数列,满足2a1+a3=3a2.a3+2是a已知数列{an}的前n项和为Sn1若数列{an}是等比数列,满足2a1+a3=3a2.a3+2是a2.a4的等差中项,求数列{an}的通向公式 小明按1:100的比例尺画出教室长的线段是a厘米,小强按照1:150的比例尺画出这个教室长的线段应是( ) 若函数f(x)=a的x-b次幂的图像如图所示,其中a,b是常数,则b(a-1)与0的大小关系是图像减函数,过(-1,1) 分之一次幂怎么算
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn