自定义纸张的格式为:
宽:21cm
长:11cm在Datareport中设置打印方向为纵向打印,在预览或者直接打印的时候都显示纸张宽度不够,设置为横向打印,则打印出来的结果不对。在Datareport打印或者预览之前,设定为横向打印,然后在弹出打印设置对话框的时候,再通过对话框修改打印方向为纵向打印,则打印出来的结果才是正确的。因为是大量票据打印,不可能要求操作员每次都去人工调整打印方向,这种问题怎么解决?明明正确的打印方向是纵向,宽度也够。环境:VB SP6,XP,打印机:EPSON 1600KIII

解决方案 »

  1.   

    或者,怎样避开Datareport检查纸张宽度,强制它纵向打印?
    或者,怎样自动在Datareport开始打印前,强制改掉打印方向?
      

  2.   

    开始-->设置-->打印机和传真-->文件-->服务器属性
    按你报表纸张老板新建一个纸张规格,然后在打印机中选择这个纸张
      

  3.   

    纸张已经设定好了,21cm*11cm 的,打印机里面也已经选择这个纸张了。问题时:
    设置横向打印-〉打印结果错误
    设置纵向打印-〉提示纸张宽度不够如果:
    程序里面设置横向打印-〉打印前的那个打印对话框里面再设置成纵向打印-〉打印结果正确。希望:
    能不需要每次都人工去修改打印对话框里面的打印方向。
      

  4.   

    如果设计时纸张规格和打的打印机纸张规格一致,是不会有这样的情况的
    你仔细检查吧,这不是Datareport的问题
    打印机纸张的设置一是在打印默认项中,一是在设备设置中,二者都要设置正确
      

  5.   

    你不信的话,可以去试试看,在XP里面,设置打印机纸张的宽度大于长度,然后在VB里面做报表。预览的时候,你看到的报表是正常的(宽度大于长度),但此时的VB实际上认为这是横向打印而不是纵向打印(它认为更长的边属于长度),如果按照这种方式来打印,实际上到了打印机,原本应该是纵向打印的东西被横向打印了,只出现在纸张的右侧面一小部分。我不知道我说清楚了没有,你可以自己试试看,宽度大于长度的:
    打印预览正常-〉打印不正常
    程序里面直接改好打印方向再打印的-〉提示宽度不够
    打印预览后调出打印设置框-〉人工订正打印方向-〉打印才会正常
      

  6.   

    而且,在Datareport中,如何保证设计时候纸张的规格?Datareport实际上只能控制自身这张报表的宽度,仅此而已,它根本控制不了长度,它本身是没有纸张规格这种概念的,它仅仅是只有一个本报表控件总宽度的参数而已。我的报表宽度实际上是19cm,打印纸张的宽度是21cm。你试试看,再说话,谢谢了
      

  7.   

    1.而且,在Datareport中,如何保证设计时候纸张的规格?2.Datareport实际上只能控制自身这张报表的宽度,仅此而已,它根本控制不了长度,它本身是没有纸张规格这种概念的,它仅仅是只有一个本报表控件总宽度的参数而已。我的报表宽度实际上是19cm,打印纸张的宽度是21cm。3.你试试看,再说话,谢谢了
    ----------------------------------------
    1.简单的方法是设计报表时,将打印机纸张设置为你设计的纸张
    2.通常用宽度和高度来标识纸规格,当你打印机设置的纸张宽度小于你报表设计时定义的纸张宽度,就是你现在的错误。高度是用来控制打印机走纸的,并不只是一个参数
    3.谢谢你提醒,我天天用着Datareport报表打印文件 :)
      

  8.   

    谢谢你的回答:
    1 我设计报表的时候,默认打印机,默认纸张就是需要的21*11的规格
    2 我Datareport里面的宽度只有19cm,纸张宽度有21cm,足够了,正常理解是不会有错误,但实际上就会提示这样的错误。我已经重复很多遍了,尽管我们设置了宽21,长11,但实际上打印的时候,VB始终认为宽11,长21,宽度为19的报表必须横向打印。
    3 Datareport中能控制高度吗?在哪里设置?据我的理解,Datareport仅仅是控制宽度和打印方向。
    4 我相信你经常使用Datareport,但你试过这种情况吗?我写VB已经五年了。
      

  9.   

    补充一下:XP下面,打印机为Epson 1600KIII
      

  10.   

    我并没有说在Datareport中控制高度,我是说纸张高度是用来控制走纸的。我学VB不到四年,是业余爱好,不过Datareport做的报表天天在用,纸张规格24cm * 12cm (宽*高),连续走纸,而且是在公司的局域网中,许多机器上都用这个程序,有XP,2000,没有问题,打印机 Epson LQ680。
      

  11.   

    再提醒一个: 一定要打印出来才会发现它的错误,预览的时候是看不出错误的,纸张的宽度长度内容都对,但到了实际打印,如果不人工修改打印方向,VB会自做聪明地用横向打印方式来打
    ------------------
    N,这个是有点郁闷了
    不过会和VB相关吗?疑问
      

  12.   

    你可以试一下,预览没问题后,你在datareport的打印设置里将打印方向,重设一下就可以了
    但就是每打印一次就要重设一次
    解决:
    先升级,vssp6
    升级完后,Datareport下会多一个可以设置打印方向的属性.Or。的,我忘了
    因为在datareport内改变打印方向的话就预览不出来了,所以就要等预览出来后再改变打印的方向
    方法就是在调用datareport下的窗口中加个timer,在timer里改变打印的方向
    然后在datareport下的active事件内将timer的enabled设为true就可以了
      

  13.   

    哦,难怪。我用的是vb6+vbsp6
    不打sp6补丁,Datareport没有Orientation属性,这个我到知道,
    呵呵,没想到是这个问题
    为什么要在timer中设置Orientation呢?可以在DataReport_Initialize设置啊?
      

  14.   

    预览和打印时方向不一样。也不知是不是datareport的问题。
      

  15.   

    15表宽!不咬横向打印,打不了可以分组打印
    ---------------------------------------------------------------------------------
    人事考勤工资系统88元!9天自助建站系统80元!VB项目毕业设计参考20元!100个商业网站源码热销中!
    阳光软件网:
    http://www.sun883.com
      

  16.   

    我也遇到楼主同样的问题,一直也没解决。望楼主解决后能发一封邮件给我。我的EMAIL:[email protected]
    我现在只能另外再做一个打印菜单,直接进行打印。这时的打印机设置方向和系统的打印机打印方向是一致的,可以直接打印。但不能同时打开表格预览窗口又进行打印操作,否则会出错。
      

  17.   

    有个笨办法,看起来很别扭但应该可以用就是把票据纸张加大,搞成高度>宽度。
    当然,那些要打印的那些数据,它们在纸上的位置仍旧不变,这样套打就不会有偏移了我一些自己写的打印都是这样的,直接打在纸上,不管是什么纸,都是按坐标为(0,0)来进行位置编排PS:不知道有没有用过VSPRINTER控件呢???
    有个预览的问题想请教!
      

  18.   

    问题已经解决,主要情况如下:
    【原因】
    在98中的自定义设置纸张仅需在打印机设置中设置好长和宽即可,因为98下的自定义打印纸被统一为Custom类型,编号是256(还是255?忘记了)。程序控制中也是使用Printer.Height和Printer.Weight进行修改即可,所以在98下设计自定义纸张一般没什么问题;在XP中,允许存在多个自定义纸张(使用打印纸的自定义名称进行选定),当系统中设定的自定义纸张的类型大于1种的时候,则可能发生早期的语言工具无法控制自定义纸张的问题,因为此时你要的自定义打印纸可能不是256这样的编号(早期语言工具主要都找这个编号来用),结果就是无法控制自定义纸张的大小。这样的问题不只存在于VB中,其他的语言,是98年代时髦起来的语言都可能存在这样的问题,例如:Delphi的QuickReport也是抓不准XP的自定义打印纸张。【解决方案】
    按照XP的选纸方式进行:就是根据你在打印机的服务器属性内设定好的自定义纸张的名称,找到它的编号,然后修改打印机设置的纸张类型为这种编号。代码参考(一些API的声明就不写了,不然太长了):
      

  19.   

    '根据名字获取纸张编号的函数
    Public Function GetFormName(ByVal PrinterHandle As Long, _
                              FormName As String) As Integer
      Dim NumForms As Long, i As Long
      Dim FI1 As FORM_INFO_1
      Dim aFI1() As FORM_INFO_1           ' Working FI1 array
      Dim Temp() As Byte                  ' Temp FI1 array
      Dim FormIndex As Integer
      Dim BytesNeeded As Long
      Dim RetVal As Long
      Dim SaveFormName As String
      
      'FormName在下面的处理中会变掉,所以先保存到SaveFormName中
      SaveFormName = FormName  FormName = vbNullString
      FormIndex = 0
      ReDim aFI1(1)  RetVal = EnumForms(PrinterHandle, 1, aFI1(0), 0&, BytesNeeded, NumForms)
      ReDim Temp(BytesNeeded)
      ReDim aFI1(BytesNeeded / Len(FI1))  RetVal = EnumForms(PrinterHandle, 1, Temp(0), BytesNeeded, BytesNeeded, _
               NumForms)
      Call CopyMemory(aFI1(0), Temp(0), BytesNeeded)
      For i = 0 To NumForms - 1
          With aFI1(i)
               If PtrCtoVbString(.pName) = SaveFormName Then
                 '找到相符的打印纸,返回编号
                  FormName = PtrCtoVbString(.pName)
                  FormIndex = i + 1
                  Exit For
              End If
          End With
      Next i
      'FormIndex中就是打印纸编号,如果没找到,还原FormName的值
      GetFormName = FormIndex  
      If FormIndex = 0 Then
          FormName = SaveFormName
      End If
    End Function
      

  20.   

    '设置打印纸张的主函数
    Function ChangeDefault(ByVal tmpFormName As String, ByVal Eorientation As _
        PrinterOrientationConstants) As Boolean        Dim bdevmode() As Byte
            Dim bprinterinfo2() As Byte
            Dim hprinter As Long
            Dim lresult As Long
            Dim nsize As Long
            Dim sprnname As String
            Dim dm As DEVMODE
            Dim pd As PRINTER_DEFAULTS
            Dim pi2 As PRINTER_INFO_2
            Dim SetPaperSize As Integer        sprnname = Printer.DeviceName
            pd.DesiredAccess = PRINTER_ALL_ACCESS        If OpenPrinter(sprnname, hprinter, pd) Then               Call GetPrinter(hprinter, 2&, 0&, 0&, nsize)
                    ReDim bprinterinfo2(1 To nsize) As Byte
                    lresult = GetPrinter(hprinter, 2, bprinterinfo2(1), nsize, nsize)
                    Call CopyMemory(pi2, bprinterinfo2(1), Len(pi2))
                    nsize = DocumentProperties(0&, hprinter, sprnname, 0&, 0&, 0)
                    ReDim bdevmode(1 To nsize)
                    If pi2.pdevmode <> 0 Then
                            Call CopyMemory(bdevmode(1), ByVal pi2.pdevmode, Len(dm))
                    Else
                            Call DocumentProperties(0&, hprinter, sprnname, bdevmode(1), 0&, DM_OUT_BUFFER)
                    End If                Call CopyMemory(dm, bdevmode(1), Len(dm))
                   '调用上面的函数获得纸张编号 
                   SetPaperSize = GetFormName(hprinter, tmpFormName)
                   If SetPaperSize = 0 Then
                         ClosePrinter (hprinter)
                         ChangeDefault = False  '找不到纸张则返回
                         Exit Function
                   End If
                    
                    With dm
                            .dmOrientation = Eorientation
                            .dmPaperSize = SetPaperSize
                            .dmFields = DM_ORIENTATION Or DM_PAPERSIZE
                    End With
                    Call CopyMemory(bdevmode(1), dm, Len(dm))                Call DocumentProperties(0&, hprinter, sprnname, _
                            bdevmode(1), bdevmode(1), DM_IN_BUFFER Or _
                            DM_OUT_BUFFER)                pi2.pdevmode = VarPtr(bdevmode(1))                lresult = SetPrinter(hprinter, 2, pi2, 0&)                Call ClosePrinter(hprinter)
                    ChangeDefault = True
            Else
                    ChangeDefault = False
            End IfEnd Function
      

  21.   

    调用这个函数的时候注意不要设置DataReport的打印方向,要保持default,例如:
            ChangeDefault "mypage", OrientPortrait
            rpt.Orientation = rptOrientDefault
            rpt.PrintReport以上是我的解决方案,希望能给遇到同样问题的人有点帮助
      

  22.   

    嗯,2wuliao(无疗)的方法要好好一下,谢谢
      

  23.   

    嗯,2wuliao(无疗)的方法要好好研究一下,谢谢共享
      

  24.   

    我也遇到了同样的问题,能给我发一份详细的代码吗?谢谢。[email protected]
      

  25.   

    2wuliao(无疗),能不能把API的声明也放出来啊,我也出现你这样的问题啊,一直没解决
    借用了别的地方的API的声明,但总是提示类型不匹配,不知道为什么啊
      

  26.   

    Option Explicit
    Public Declare Function EnumForms Lib "winspool.drv" Alias "EnumFormsA" _
        (ByVal hPrinter As Long, ByVal Level As Long, ByRef pForm As Any, _
        ByVal cbBuf As Long, ByRef pcbNeeded As Long, _
        ByRef pcReturned As Long) As Long
        
    Public Declare Function AddForm Lib "winspool.drv" Alias "AddFormA" _
        (ByVal hPrinter As Long, ByVal Level As Long, pForm As Byte) As Long
        
    Public Declare Function DeleteForm Lib "winspool.drv" Alias "DeleteFormA" _
        (ByVal hPrinter As Long, ByVal pFormName As String) As Long
        
    'Public Declare Function OpenPrinter Lib "winspool.drv" _
    '    Alias "OpenPrinterA" (ByVal pPrinterName As String, _
    '    phPrinter As Long, ByVal pDefault As Long) As Long
        
    'Public Declare Function ClosePrinter Lib "winspool.drv" _
    '    (ByVal hPrinter As Long) As Long
        
    Public Declare Function DocumentProperties Lib "winspool.drv" Alias "DocumentPropertiesA" _
    (ByVal hWnd As Long, _
        ByVal hPrinter As Long, ByVal pDeviceName As String, _
        pDevModeOutput As Any, pDevModeInput As Any, ByVal fMode As Long) _
        As Long
        
    Public Declare Function ResetDC Lib "gdi32" Alias "ResetDCA" _
        (ByVal hdc As Long, lpInitData As Any) As Long
        
    'Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    '    (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
        
    Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _
        (ByVal lpString1 As String, ByRef lpString2 As Long) As Long
        
    ' Optional functions not used in this sample, but may be useful.
    Public Declare Function GetForm Lib "winspool.drv" Alias "GetFormA" _
        (ByVal hPrinter As Long, ByVal pFormName As String, _
        ByVal Level As Long, pForm As Byte, ByVal cbBuf As Long, _
        pcbNeeded As Long) As Long
        
    Public Declare Function SetForm Lib "winspool.drv" Alias "SetFormA" _
        (ByVal hPrinter As Long, ByVal pFormName As String, _
        ByVal Level As Long, pForm As Byte) As Long
    ' Constants for DEVMODE
    Public Const CCHFORMNAME = 32
    Public Const CCHDEVICENAME = 32
    Public Const DM_FORMNAME As Long = &H10000
    Public Const DM_ORIENTATION = &H1&
    ' Constants for PRINTER_DEFAULTS.DesiredAccess
    Public Const PRINTER_ACCESS_ADMINISTER = &H4
    Public Const PRINTER_ACCESS_USE = &H8
    Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Public Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _
      PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)
    ' Constants for DocumentProperties() call
    Public Const DM_MODIFY = 8
    Public Const DM_IN_BUFFER = DM_MODIFY
    Public Const DM_COPY = 2
    Public Const DM_OUT_BUFFER = DM_COPY
    ' Custom constants for this sample's SelectForm function
    Public Const FORM_NOT_SELECTED = 0
    Public Const FORM_SELECTED = 1
    Public Const FORM_ADDED = 2
    Public Type RECTL
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End Type
    Public Type SIZEL
            cx As Long
            cy As Long
    End Type
    Public Type SECURITY_DESCRIPTOR
            Revision As Byte
            Sbz1 As Byte
            Control As Long
            Owner As Long
            Group As Long
            Sacl As Long  ' ACL
            Dacl As Long  ' ACL
    End Type
    ' The two definitions for FORM_INFO_1 make the coding easier.
    Public Type FORM_INFO_1
            Flags As Long
            pName As Long   ' String
            Size As SIZEL
            ImageableArea As RECTL
    End Type
    Public Type sFORM_INFO_1
            Flags As Long
            pName As String
            Size As SIZEL
            ImageableArea As RECTL
    End Type
    Public Type DEVMODE
            dmDeviceName As String * CCHDEVICENAME
            dmSpecVersion As Integer
            dmDriverVersion As Integer
            dmSize As Integer
            dmDriverExtra As Integer
            dmFields As Long
            dmOrientation As Integer
            dmPaperSize As Integer
            dmPaperLength As Integer
            dmPaperWidth As Integer
            dmScale As Integer
            dmCopies As Integer
            dmDefaultSource As Integer
            dmPrintQuality As Integer
            dmColor As Integer
            dmDuplex As Integer
            dmYResolution As Integer
            dmTTOption As Integer
            dmCollate As Integer
            dmFormName As String * CCHFORMNAME
            dmUnusedPadding As Integer
            dmBitsPerPel As Long
            dmPelsWidth As Long
            dmPelsHeight As Long
            dmDisplayFlags As Long
            dmDisplayFrequency As Long
    End Type
    Public Type PRINTER_DEFAULTS
            pDatatype As String
            pDevMode As Long    ' DEVMODE
            DesiredAccess As Long
    End Type
    'Public Type PRINTER_INFO_2
    '        pServerName As String
    '        pPrinterName As String
    '        pShareName As String
    '        pPortName As String
    '        pDriverName As String
    '        pComment As String
    '        pLocation As String
    '        pDevMode As DEVMODE
    '        pSepFile As String
    '        pPrintProcessor As String
    '        pDatatype As String
    '        pParameters As String
    '        pSecurityDescriptor As SECURITY_DESCRIPTOR
    '        Attributes As Long
    '        Priority As Long
    '        DefaultPriority As Long
    '        StartTime As Long
    '        UntilTime As Long
    '        Status As Long
    '        cJobs As Long
    '        AveragePPM As Long
    'End TypePublic Type PRINTER_INFO_2        pServerName As String
            pPrinterName As String
            pShareName As String
            pPortName As String
            pDriverName As String
            pComment As String
            pLocation As String
            pDevMode As Long              ' LPDEVMODE
            pSepFile As String
            pPrintProcessor As String
            pDatatype As String
            pParameters As String
            pSecurityDescriptor As Long   ' PSECURITY_DESCRIPTOR
            Attributes As Long
            Priority As Long
            DefaultPriority As Long
            StartTime As Long
            UntilTime As Long
            Status As Long
            cJobs As Long
            AveragePPM As LongEnd Type'判断系统是否为NT系统
    Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
                            (lpVersionInformation As OSVERSIONINFO) As Long
    Public Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long
        szCSDVersion As String * 128      '  Maintenance string for PSS usage
    End Type    
        
    '  ------DECLARATIONS
        
      Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
      Private Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal Command As Long) As Long
      Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As Long, pcbNeeded As Long) As Long
      Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
      Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
        
      

  27.   

    找到了上述API的声明,但还是无法解决问题,点击打印后默认的打印方向还是横向,郁闷啊
    2wuliao(无疗)快来救命啊。。
      

  28.   

    我也是遇到同样问题,和2wuliao提出的问题一模一样,只不过我纸张是24X14  环境:VB   SP6,XP,打印机:EPSON   1600KIII都一样,我现在也是一直没有解决