modPrint.bas
上传用户:djzm888
上传日期:2013-02-15
资源大小:867k
文件大小:10k
源码类别:

其他数据库

开发平台:

Visual Basic

  1. Attribute VB_Name = "modPrint"
  2. Option Explicit
  3. Private Const ColDistance = 400
  4. Private Const RowDistance = 150
  5. Private Totalwidth As Long
  6. Private FixedX As Long
  7. Private FixedY As Long
  8. Private LinesPerPage As Integer
  9. Private Lineheight As Integer
  10. Private Curx As Long
  11. Private Cury As Long
  12. Private LineStartx As Long
  13. Private LineStarty As Long
  14. Private LineEndy As Long
  15. Private MaxColWidth As Long
  16. '区别于PrintGridNormal: 它打印时题头为第一列而不是第一行
  17. 'Title: 标题, 将被醒目打印
  18. 'GridToPrint: 待打印的 Grid 控件名称, 注意必须是 MSFlexGrid 控件
  19. 'SubTitle: 附加标题
  20. Public Sub PrintGridRoutate(Title As String, Gridtoprint As MSFlexGrid, SubTitle As String)
  21. On Error GoTo PrinTErr
  22. If MsgBox("请准备好打印机,单击[确定]开始打印...", vbExclamation + vbOKCancel, "准备打印") = vbOK Then
  23.     Dim T_str As String
  24.     Dim P As Integer
  25.     Dim i As Integer
  26.     Dim j As Integer
  27.     Dim k As Integer
  28.     Dim StartRow As Long
  29.     Dim EndRow As Long
  30.     Dim L As Integer
  31.     'Printer.PaperSize = 9 'A4纸 210 x 297 毫米
  32.     P = 0
  33.     With Gridtoprint
  34.         StartRow = 1
  35.         EndRow = .Rows - 1
  36.         i = 0
  37.         Printer.Orientation = 1
  38.         LinesPerPage = 3
  39.         For k = 0 To EndRow - StartRow
  40.             If (k Mod LinesPerPage) = 0 Then
  41. '                Call PrintTitleRoutate(Gridtoprint, Title, SubTitle)
  42.             End If
  43.             Cury = FixedY
  44.             .row = k + StartRow
  45.             Printer.CurrentY = Cury
  46.             For j = 0 To .Cols - 1
  47.                 If .ColWidth(j) <> 0 Then
  48.                     .col = j
  49.                     Printer.CurrentX = Curx
  50.                     Printer.Print .Text
  51.                     Cury = Printer.CurrentY + RowDistance * 2
  52.                     Printer.CurrentY = Cury
  53.                 End If
  54.             Next j
  55.             Curx = Curx + ColDistance * 1.5 + MaxColWidth
  56.             Cury = Printer.CurrentY + Lineheight
  57.             i = i + 1
  58.             If i = LinesPerPage Then
  59.                 i = 0
  60.                 P = P + 1
  61.                 T_str = "第" & P & "/" & (EndRow - StartRow + 1)  LinesPerPage + 1 & "页"
  62.                 Call PrintFooter(FixedX, Cury, T_str)
  63.                 Call PrintTableRoutate(Gridtoprint, Gridtoprint.Cols)
  64.                 Printer.EndDoc
  65.                 Printer.Orientation = 1
  66.                 LinesPerPage = 3
  67.             End If
  68.         Next k
  69.     End With
  70.     P = P + 1
  71.     T_str = "第" & P & "/" & (EndRow - StartRow + 1)  LinesPerPage + 1 & "页"
  72.     Call PrintFooter(FixedX, Cury, T_str)
  73.     Call PrintTableRoutate(Gridtoprint, Gridtoprint.Cols)
  74.     Printer.EndDoc
  75. End If
  76. Exit Sub
  77. PrinTErr:
  78.     On Error GoTo 0
  79.     Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
  80.     Printer.KillDoc
  81. End Sub
  82. '区别于PrintTitleRoutate: 它打印时题头为第一行而不是第一列
  83. Private Sub PrintTitleNormal(Gridtoprint As MSFlexGrid, Title As String, SubTitle As String)
  84. Dim j As Integer
  85. On Error GoTo PrinTErr
  86.     Title = Trim(Title)
  87.     Printer.FontSize = 16
  88.     Totalwidth = 0
  89.     For j = 0 To Gridtoprint.Cols - 1
  90.         If Gridtoprint.ColWidth(j) <> 0 Then
  91.             Gridtoprint.col = j
  92.             Totalwidth = Totalwidth + Gridtoprint.ColWidth(j) + ColDistance
  93.         End If
  94.     Next j
  95.     FixedX = (Printer.Width - Totalwidth)  2
  96.     FixedX = IIf(FixedX > 500, FixedX - 200, FixedX)
  97.     Curx = (Printer.Width - Len(Title) * Printer.FontSize * 20.2)  2
  98.     Cury = 1000
  99.     Printer.CurrentX = Curx
  100.     Printer.CurrentY = Cury
  101.     Printer.Print Title
  102.     Printer.FontSize = 10
  103.     Lineheight = RowDistance + Printer.FontSize * 20.2
  104.     Gridtoprint.row = 0
  105.     Curx = FixedX
  106.     Cury = Cury + 1000
  107.     LineStartx = FixedX - ColDistance  2
  108.     LineStarty = Cury - RowDistance  2
  109.     If SubTitle <> "" Then
  110.         Printer.CurrentX = Curx
  111.         Printer.CurrentY = Cury - RowDistance - Printer.FontSize * 20.2
  112.         Printer.Print SubTitle
  113.     End If
  114.     Printer.CurrentX = Curx
  115.     Dim OldFontSize As Single
  116.     OldFontSize = Printer.FontSize
  117.     Printer.FontSize = 11
  118.     Printer.Font.Bold = True
  119.     For j = 0 To Gridtoprint.Cols - 1
  120.         If Gridtoprint.ColWidth(j) <> 0 Then
  121.             Gridtoprint.col = j
  122.             Printer.CurrentY = Cury
  123.             Printer.Print Gridtoprint.Text
  124.             Curx = Curx + Gridtoprint.ColWidth(j) + ColDistance
  125.             Printer.CurrentX = Curx
  126.         End If
  127.     Next j
  128.     Printer.Font.Bold = False
  129.     Printer.FontSize = OldFontSize
  130. Exit Sub
  131. PrinTErr:
  132.     On Error GoTo 0
  133.     Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
  134.     Printer.KillDoc
  135. End Sub
  136. Private Sub PrintFooter(X As Long, Y As Long, MyStr As String)
  137. On Error GoTo PrinTErr
  138.     Printer.CurrentX = X
  139.     Printer.CurrentY = Y
  140.     Printer.Print "打印时间:" & Format(Date, "yyyy-mm-dd") & "   " & Format(Time, "hh:mm:ss")
  141.     Printer.CurrentX = X + Totalwidth - Printer.FontSize * 10.1 * LenB(MyStr)
  142.     Printer.CurrentY = Y
  143.     Printer.Print MyStr
  144. Exit Sub
  145. PrinTErr:
  146.     On Error GoTo 0
  147.     Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
  148.     Printer.KillDoc
  149. End Sub
  150. Private Sub PrintTableRoutate(Gridtoprint As Control, R As Integer)
  151. Dim L As Integer
  152. Dim TableRowCol As Long
  153. On Error GoTo PrinTErr
  154.     TableRowCol = LineStarty
  155.     For L = 0 To R
  156.         Printer.Line (LineStartx, TableRowCol)-(LineStartx + Totalwidth, TableRowCol)
  157.         TableRowCol = TableRowCol + Lineheight
  158.     Next L
  159.     Printer.Line (LineStartx, TableRowCol)-(LineStartx + Totalwidth, TableRowCol)
  160.     LineEndy = TableRowCol
  161.     TableRowCol = LineStartx
  162.     Printer.Line (TableRowCol, LineStarty)-(TableRowCol, LineEndy)
  163.     TableRowCol = TableRowCol + Totalwidth - 3 * MaxColWidth - ColDistance * 3
  164.     For L = 0 To 3
  165.         Printer.Line (TableRowCol, LineStarty)-(TableRowCol, LineEndy)
  166.         TableRowCol = TableRowCol + ColDistance + MaxColWidth
  167.     Next L
  168. Exit Sub
  169. PrinTErr:
  170.     On Error GoTo 0
  171.     Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
  172.     Printer.KillDoc
  173. End Sub
  174. '区别于PrintRoutate:  它打印时题头为第一行而不是第一列
  175. 'Title: 标题, 将被醒目打印
  176. 'GridToPrint: 代打印的 Grid 控件名称, 注意必须是 Grid 控件
  177. 'myOrientation: 决定输出是纵向还是横向, 1:纵向, 2:横向
  178. 'SubTitle: 附加标题
  179. Public Sub PrintGridNormal(Title As String, Gridtoprint As MSFlexGrid, myOrientation As Integer, SubTitle As String, Optional IsHasLine As Boolean = True)
  180. On Error GoTo PrinTErr
  181. If MsgBox("请准备好打印机,单击[确定]开始打印...", vbInformation + vbOKCancel, "准备打印") = vbOK Then
  182.     Dim T_str As String
  183.     Dim P As Integer
  184.     Dim i As Integer
  185.     Dim j As Integer
  186.     Dim k As Integer
  187.     Dim StartRow As Long
  188.     Dim EndRow As Long
  189.     Dim L As Integer
  190.     'Printer.PaperSize = 9 'A4纸 210 x 297 毫米
  191.     P = 0
  192.     With Gridtoprint
  193.         StartRow = 1
  194.         EndRow = .Rows - 1
  195.         i = 0
  196.         Printer.Orientation = myOrientation
  197.         LinesPerPage = IIf(myOrientation = 1, 38, 24)
  198.         'ShowProgress 0, EndRow - StartRow
  199.         For k = 0 To EndRow - StartRow
  200.             If (k Mod LinesPerPage) = 0 Then
  201.                 Call PrintTitleNormal(Gridtoprint, Title, SubTitle)
  202.             End If
  203.             Cury = Printer.CurrentY + RowDistance
  204.             Curx = FixedX
  205.             .row = k + StartRow
  206.             Printer.CurrentX = Curx
  207.             For j = 0 To .Cols - 1
  208.                 If .ColWidth(j) <> 0 Then
  209.                     .col = j
  210.                     Printer.CurrentY = Cury
  211.                     Printer.Print .Text
  212.                     Curx = Curx + .ColWidth(j) + ColDistance
  213.                     Printer.CurrentX = Curx
  214.                 End If
  215.             Next j
  216.             Cury = Printer.CurrentY + RowDistance
  217.             i = i + 1
  218.             If i = LinesPerPage Then
  219.                 LineEndy = Printer.CurrentY + RowDistance  2
  220.                 i = 0
  221.                 P = P + 1
  222.                 T_str = "第" & P & "/" & (EndRow - StartRow + 1)  LinesPerPage + 1 & "页"
  223.                 Call PrintFooter(FixedX, Cury, T_str)
  224.                 If IsHasLine Then
  225.                     Call PrintTable(Gridtoprint, LinesPerPage)
  226.                 End If
  227.                 Printer.EndDoc
  228.                 Printer.Orientation = myOrientation
  229.                 LinesPerPage = IIf(myOrientation = 1, 38, 24)
  230.             End If
  231.            ' Progress.ProgressBar1.Value = k
  232.         Next k
  233.     End With
  234.     LineEndy = Printer.CurrentY + RowDistance  2
  235.     P = P + 1
  236.     T_str = "第" & P & "/" & (EndRow - StartRow + 1)  LinesPerPage + 1 & "页"
  237.     Call PrintFooter(FixedX, Cury, T_str)
  238.     If IsHasLine Then
  239.         Call PrintTable(Gridtoprint, (EndRow - StartRow + 1) Mod LinesPerPage)
  240.     End If
  241.     Printer.EndDoc
  242.     'Progress.Hide
  243. End If
  244. Exit Sub
  245. PrinTErr:
  246.     On Error GoTo 0
  247.     Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
  248.     Printer.KillDoc
  249. End Sub
  250. Private Sub PrintTable(Gridtoprint As MSFlexGrid, R As Integer)
  251. Dim L As Integer
  252. Dim TableRowCol As Long
  253. On Error GoTo PrinTErr
  254.     TableRowCol = LineStarty
  255.     For L = 0 To R
  256.         Printer.Line (LineStartx, TableRowCol)-(LineStartx + Totalwidth, TableRowCol)
  257.         TableRowCol = TableRowCol + Lineheight
  258.     Next L
  259.     Printer.Line (LineStartx, TableRowCol)-(LineStartx + Totalwidth, TableRowCol)
  260.     LineEndy = TableRowCol
  261.     TableRowCol = LineStartx
  262.     For L = 0 To Gridtoprint.Cols - 1
  263.         If Gridtoprint.ColWidth(L) <> 0 Then
  264.             Printer.Line (TableRowCol, LineStarty)-(TableRowCol, LineEndy)
  265.             TableRowCol = TableRowCol + ColDistance + Gridtoprint.ColWidth(L)
  266.         End If
  267.     Next L
  268.     Printer.Line (TableRowCol, LineStarty)-(TableRowCol, LineEndy)
  269. Exit Sub
  270. PrinTErr:
  271.     On Error GoTo 0
  272.     Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
  273.     Printer.KillDoc
  274. End Sub