首页 »VB教程 » vb通用对话框:基于VB的通用折行打印程序 »正文
vb通用对话框:基于VB的通用折行打印程序
来源: 发布时间:星期四, 2009年1月15日 浏览:109次 评论:0
---- 几乎所有数据库应用软件Software 都需要打印单证和报表 常见 思路方法是利用VB Crystal Reports(水晶报表)方式 通过TextBox等数据绑定Control控件 Pr 思路方法直接输出 虽然Crystal Report这 个功能强大、样式丰富且无编程方式 报表编制 能适应大部分单证、报表打印 需要 但是Crystal Reports引擎是 个动态链接库 需许多文件支持和 更多系统资源 大大增加系统负担 ---- 另 种解决办法是通过Pr er对象 Pr 思路方法 直接打印 串 这虽然减少了系统资源 开销 但它不能直接用于打印复杂 单证和报表 本文通过两个例子 阐述 个通用折行打印 编程和在单证及报表 应用 ---- 2. 编程实现及例子 ---- 为便于阐述 方便 我们先建立 个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 Prer.CurrentX = X Prer.CurrentY = Y Prer.FontBold = False Prer.FontSize = font str = txt str2 = str i = 0 rowlab = 0 If Len(Trim(str)) = 0 Then rowlab = 1 '待打印串为空标志 Else Do While Len(str) > 0 Prer.CurrentX = X Prer.CurrentY = Y rowlab * 240 rowlab = rowlab 1 If Len(str) >= val Then str1 = Mid(str, 1, val) Prer.Pr str1 i = i 1 str = Mid(str2, i * val 1) Else Prer.Pr str Exit Do End If Loop End If End Function
---- 3. 在Project1中新建 个窗体Form1 窗体上添加 个DataControl控件Data1 个MSFlexGridControl控件MSFGrid1 7个TextBox和两个命令按钮CmdPrnt1、CmdPrnt2 设置DataControl控件 属性: .. 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" Prer.FontName = "黑体" dd = prnt11(strx, stry, 10, txt, 50) stry = stry rowlab * 240 Prer.Line (0, stry)-(9000, stry) Prer.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) Prer.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.Record.RecordCount If gridrow = 0 Then MsgBox "无满足条件记录打印!" Exit Sub End If Prer.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) Prer.Line (strx - 20, stry - 30)-(10460, stry - 30) Prer.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 Prer.NewPage Prer.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) Prer.Line (-20, stry - 30)-(10460, stry - 30) '打印起始线 Prer.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) Prer.EndDoc End Sub
相关文章
读者评论
发表评论
|
|