Office中国论坛/Access中国论坛

标题: 在ACCESS实现自定义纸张 [打印本页]

作者: andymark    时间: 2011-10-9 11:02
标题: 在ACCESS实现自定义纸张
在ACCESS自定义纸张源码

窗体代码:
  1. Private Sub CmdNew_Click()
  2.     Dim PrinterName  As String
  3.     Dim FormName As String
  4.     Dim FormSize As SIZEL
  5.     Dim PrinterHandle As Long
  6.     Dim LngWidth As Long
  7.     Dim LngHeight As Long
  8.    
  9.     If IsNull(Me.TxtNewStyle) Then
  10.        MsgBox "请输入要创建的打印格式"
  11.        Me.TxtNewStyle.SetFocus
  12.        Exit Sub
  13.     End If
  14.    
  15.     If IsNull(Me.TxtWidth) Then
  16.        MsgBox "请输入要创建的打印格式的宽度尺寸(mm)"
  17.        Me.TxtHeight.SetFocus
  18.        Exit Sub
  19.     End If
  20.    
  21.     If IsNull(Me.TxtHeight) Then
  22.        MsgBox "请输入要创建的打印格式高度尺寸(mm)"
  23.        Me.TxtWidth.SetFocus
  24.        Exit Sub
  25.     End If
  26.    
  27.     If Not IsNumeric(Me.TxtWidth) Then
  28.        MsgBox "打印格式宽度尺寸必须是数字类型"
  29.        Me.TxtWidth.SetFocus
  30.        Exit Sub
  31.     End If
  32.    
  33.     If Not IsNumeric(Me.TxtHeight) Then
  34.        MsgBox "打印格式高度尺寸必须是数字类型"
  35.        Me.TxtWidth.SetFocus
  36.        Exit Sub
  37.     End If
  38.    
  39.    
  40.     Dim RetVal As Long
  41.     Dim Continue As Long
  42.    
  43.    
  44.     PrinterName = GetSrvName(cmbPrinter)
  45.     FormName = Me.TxtNewStyle
  46.     LngWidth = Me.TxtWidth * 1000
  47.     LngHeight = Me.TxtHeight * 1000
  48.    
  49.     If PrinterName = "" Then
  50.         PrinterName = Printer.DeviceName     '当前打印机
  51.     Else
  52.         MakeDefaultPrinter PrinterName       '设置默认打印机
  53.     End If

  54.     RetVal = AddCustForm(FormName, Me.hwnd, LngWidth, LngHeight, PrinterName)

  55.     Select Case RetVal
  56.         Case FORM_NOT_SELECTED    ' 0
  57.             ' Selection failed!
  58.             MsgBox "添加错误" & " ErrorCode:" & Err.LastDllError, vbExclamation, _
  59.                     "错误!"
  60.         Case FORM_SELECTED   ' 1
  61.            MsgBox FormName & " 打印格式已经存在于 " & PrinterName & " ", vbExclamation
  62.         Case FORM_ADDED      ' 2
  63.             '//Form added and selected.
  64.             MsgBox FormName & " 打印格式已经添加到 " & PrinterName, vbInformation
  65.             AddMyForm = True
  66.    End Select
  67.    
  68.   ReGetPaperList
  69.    
  70. End Sub

  71. Private Sub Form_Load()
  72.     Dim Prn As Printer
  73.     Dim Obj As AccessObject
  74.    
  75.     For Each Prn In Printers
  76.         Me.cmbPrinter.AddItem Prn.DeviceName
  77.     Next
  78.    
  79.     If cmbPrinter.ListCount > 0 Then
  80.        cmbPrinter = Printer.DeviceName
  81.        LstPaper.RowSource = GetPaperList(cmbPrinter)
  82.     End If
  83.    
  84.    For Each Obj In CurrentProject.AllReports
  85.       Me.LstReport.AddItem Obj.Name
  86.    Next
  87. End Sub


  88. Private Sub cmbPrinter_AfterUpdate()
  89.     Call ReGetPaperList
  90. End Sub

  91. Private Sub CmdDelete_Click()
  92.     Dim colNetworkPrinters As New Collection
  93.     Dim srvName As String, tmpName As String

  94.     Dim FormName As String
  95.     Dim PrinterName As String
  96.     Dim i

  97.     On Error Resume Next

  98.     If Me.LstPaper.ListIndex < 0 Then
  99.         MsgBox "请选择要删除的纸张格式"
  100.         Exit Sub
  101.     End If
  102.     FormName = Mid(LstPaper, 1, InStr(1, LstPaper, " -") - 1)
  103.    
  104.     tmpName = ""
  105.     srvName = GetSrvName(cmbPrinter)
  106.    
  107.     If srvName <> "" Then
  108.     Call DeleteMyForm(srvName, FormName)
  109.      End If
  110.      
  111.    
  112.     ReGetPaperList
  113. End Sub

  114. Private Sub CmdReport_Click()
  115.     Dim Rpt As Report
  116.    ' Dim Prt As Report
  117.     'Dim accObj As AccessObject
  118.    
  119.     Dim strReportName As String
  120.    
  121.     If Me.LstReport.ListIndex < 0 Then
  122.        MsgBox "请选择报表"
  123.        Exit Sub
  124.     End If
  125.    
  126.    
  127.     If Me.LstPaper.ListIndex < 0 Then
  128.        MsgBox "请选择打印的纸张类型"
  129.        Exit Sub
  130.     End If
  131.    
  132.     strReportName = LstReport
  133.    
  134.     If IsLoaded(strReportName) Then
  135.        MsgBox "不能重复打开相同的报表"
  136.        Exit Sub
  137.     End If
  138.    
  139.    
  140.     Select Case strReportName
  141.    
  142.       Case "报表1"
  143.    
  144.          Set Rpt = New Report_报表1
  145.    
  146.       Case "客户标签"
  147.    
  148.          Set Rpt = New Report_客户标签
  149.          
  150.       Case "概览子报表"
  151.         
  152.          Set Rpt = New Report_概览子报表
  153.         
  154.       Case Else
  155.       
  156.        Set Rpt = New Report_报表1
  157.       
  158.     End Select
  159.    
  160.    
  161.    
  162.    
  163.    ' Set Rpt = Reports(strReportName)
  164.    

  165. 'Set Rpt = New Report_报表1
  166.     With Rpt.Printer
  167.       
  168.         .PaperSize = GetPaperSize(LstPaper)
  169.         .Orientation = Me.frameOrientation.Value
  170.         
  171.     End With

  172.     clnClient.Add Item:=Rpt, Key:=CStr(Rpt.hwnd)
  173.     Rpt.Visible = True
  174. End Sub


  175. Private Sub ReGetPaperList()
  176. '刷新表单(纸张)列表
  177.     If Not IsNull(Me.cmbPrinter) Then
  178.        LstPaper.RowSource = ""
  179.        LstPaper.RowSource = GetPaperList(cmbPrinter)
  180.     End If
  181.    
  182. End Sub

  183. 完整代码请参考附件
复制代码
[attach]46876[/attach]
作者: Henry D. Sy    时间: 2011-10-9 11:15
谢谢分享!
作者: t小宝    时间: 2011-10-9 11:24
精品之作!
作者: wuheng    时间: 2011-10-9 13:44
谢谢分享,先下再学.顶~~~~~``
作者: 轻风    时间: 2011-10-9 14:48
好东西呀!
作者: 风中漫步    时间: 2011-10-9 15:06
不错
作者: todaynew    时间: 2011-10-9 15:09
学习一下
作者: tzh16000    时间: 2011-10-9 15:15
太需要了...
作者: 咱家是猫    时间: 2011-10-9 15:37
收藏先,以后用得着,谢谢分享.
作者: yanghua1900363    时间: 2011-10-9 16:43
谢谢分享
作者: tmtony    时间: 2011-10-9 18:52
精品之作,谢谢分享!
作者: t小宝    时间: 2011-10-9 20:19
似乎有点问题,使用新创建的自定义格式预览报表时,ACCESS崩溃,使用的打印机是Microsoft Office Document Image Writer
作者: andymark    时间: 2011-10-9 20:42
小宝的是什么系统,麻烦换其他驱动测试
2010 和 2003 环境下都没有你说的问题
作者: xie62    时间: 2011-10-10 09:39
谢谢分享.
作者: zhao__feng    时间: 2011-10-10 11:43
十分需要,谢谢!!
作者: t小宝    时间: 2011-10-10 21:23
andymark 发表于 2011-10-9 20:42
小宝的是什么系统,麻烦换其他驱动测试
2010 和 2003 环境下都没有你说的问题

如果打印机是Canon iP2700 series,不会崩溃,但也不能等到自定义页面,如我定义一个10CM*10CM的自定义纸张,用这个格式来预览,但并没有显示为正方形的纸张。
如果打印机为Microsoft Office Document Image Writer,则ACCESS崩溃。
作者: c101    时间: 2011-10-10 22:46
谢谢分享
作者: 风中漫步    时间: 2011-10-11 08:42
是稍有点小问题

在打印机表单的描述中如果多于2个"("的话就会取PAGESIZE错误(如:B4 (JIS)257MM*364MM (12)),建议将GetPaperSize函数中的instr换为instrrev

其他的没发现问题.期待斑竹的修正版
作者: xuwenning    时间: 2011-10-11 09:04
谢谢分享
收下来
作者: tanhong    时间: 2011-10-11 12:05
也收藏一下,问这个的人挺多。
作者: yyh740225    时间: 2011-10-14 11:54
正需要呢.
作者: yy2000    时间: 2011-10-14 13:42
学习.
作者: danis    时间: 2012-2-14 21:09
mark
作者: VulcanTerry    时间: 2012-11-8 17:45
很有味道
作者: fnsmydyang    时间: 2014-3-24 14:57
下载学习了。
作者: zpy2    时间: 2014-6-25 05:55
谢谢了!!!
作者: purplerose    时间: 2015-8-3 14:31
赞一个
作者: siaele    时间: 2016-4-6 11:31
谢谢分享,很有启发
作者: 李力军2    时间: 2016-8-12 18:18
谢谢分享,先顶后学
作者: 灰太郎    时间: 2018-12-17 18:40
白白白白白
作者: 灰太郎    时间: 2022-1-24 16:54
123456
作者: 灰太郎    时间: 2022-2-6 19:41
123456
作者: 灰太郎    时间: 2022-2-6 19:44
12345623
作者: shixm_1    时间: 2022-6-5 09:23





欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3