专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »VB教程 » vb通用对话框:基于VB的通用折行打印程序 »正文

vb通用对话框:基于VB的通用折行打印程序

来源: 发布时间:星期四, 2009年1月15日 浏览:109次 评论:0
  ---- 几乎所有数据库应用软件Software都需要打印单证和报表常见思路方法是利用VBCrystal Reports(水晶报表)方式通过TextBox等数据绑定Control控件Pr思路方法直接输出虽然Crystal Report这个功能强大、样式丰富且无编程方式报表编制能适应大部分单证、报表打印需要但是Crystal Reports引擎是个动态链接库需许多文件支持和更多系统资源大大增加系统负担

  ---- 另种解决办法是通过Prer对象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控件MSFGrid17个TextBox和两个命令按钮CmdPrnt1、CmdPrnt2设置DataControl控件属性:

.. DatabaseName="Standards.mdb"
..RecordSourse="SN"
  MSFGrid1属性:
    .DataSource="Data1"
  Text1属性:
    .DataSource="Data1"
    .DataField="标准号"
  Text2~Text7类同


  ---- CmdPrnt1、CmdPrnt2分别为打印单条记录和多条记录按钮

  ---- 例子1:文字串定位折行打印在口岸联检部门中应用非常广泛下述例子是用CmdPrnt1Click事件代码实现了对文字串定位折行打印:

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:直接打印表格式窗体显示多记录多字段往往因某些字段字节太多而造成纸张宽度不足以下CmdPrnt2Click事件中代码实现了对上述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


0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: