我的程序是标签打印系统,有个报表要打印,但设置的报表在我自己的电脑上可以显示 ,也可以运行,但在客户的电脑上报表显示就提示:报表宽度大于纸张宽度,为什么了?我已经对报表页面设置横向打印了,同时标签打印的页面是纵向的,在我电脑显示完全正确.(客户的电脑的显示器和我的一样的,但是液晶的而已,操作系统也一样).要怎么解决了?谢谢高手帮忙!

解决方案 »

  1.   

    会的,你可以在代码中加入设置打印机,给你一个模块
    Option Explicit
    Public Enum PrinterOrientationConstants
        OrientPortrait = 1  '肖像, 人像                 |     .
        OrientLandscape = 2 '风景, 山水画, 地形, 前景  ----   .
    End Enum
    Private Type PRINTER_DEFAULTS
        pDataType As String
        pDevMode As Long
        DesiredAccess As Long
    End Type
    Private Type PRINTER_INFO_2
        pServerName As Long
        pPrinterName As Long
        pShareName As Long
        pPortName As Long
        pDriverName As Long
        pComment As Long
        pLocation As Long
        pDevMode As Long
        pSepFile As Long
        pPrintProcessor As Long
        pDataType As Long
        pParameters As Long
        pSecurityDescriptor As Long
        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 Type
    Public Const DMPAPER_A5 = 11
    Private Const DM_IN_BUFFER As Long = 8
    Private Const DM_OUT_BUFFER As Long = 2
    Private Const DM_ORIENTATION As Long = &H1
    Private Const DM_PAPERSIZE = &H2&
    Private Const PRINTER_ACCESS_ADMINISTER As Long = &H4
    Private Const PRINTER_ACCESS_USE As Long = &H8
    Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
    Private Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)
    Public Enum Modifypage
            Orientation = 1
            ModifySize = 2
    End Enum
    'Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
    Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As Any) As Long
    Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
    Private 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
    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 Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal Command As Long) As Long
    Function SetDefaultPrinterOrientation(ByVal eOrientation As PrinterOrientationConstants, _
                    Optional Str_Type As Modifypage = Orientation, _
                    Optional PaperSize As PrinterObjectConstants = vbPRPSA4, _
                    Optional NotShowInfo As Boolean) 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_TYPE:     Dim pd As PRINTER_DEFAULTS
        Dim pi2 As PRINTER_INFO_2
        On Error GoTo ErrPrt
        ' 获取默认打印机的设备名称
        sPrnName = Printer.DeviceName
        ' 由于要调用SetPrinter,所以
        ' 如果是在NT下就要求PRINTER_ALL_ACCESS
        pd.DesiredAccess = PRINTER_ALL_ACCESS
        ' 获取打印机句柄
        If OpenPrinter(sPrnName, hPrinter, pd) Then
        ' 获取PRINTER_INFO_2结构要求的字节数
            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 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))
            With dm              ' 设置新的走向
                Select Case Str_Type
                Case Orientation '改变方向
                    .dmOrientation = eOrientation
                    .dmFields = DM_ORIENTATION
                Case ModifySize  '改变纸张大小
                    .dmPaperSize = PaperSize
                    .dmFields = DM_PAPERSIZE '必须,否则无法设置纸张大小
                End Select
            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)
            SetDefaultPrinterOrientation = True
        Else
            SetDefaultPrinterOrientation = False
        End If
        Exit Function
    ErrPrt: If NotShowInfo Then MsgBox Err.Description
    End Function在打开报表之前打开设置纸张
    Call SetDefaultPrinterOrientation(vbPRORPortrait, ModifySize, , True) '调整大小为A4'
    Call SetDefaultPrinterOrientation(vbPRORPortrait, 1)  '调整为纵向'
    Call SetDefaultPrinterOrientation(OrientLandscape, 1)  '调整为横向'
      

  2.   

    xx22nn(redhill红岭山腰的程序员)
    您好,我在调试还是出错的了,不知道为什么了?我是比较笨点,请指教阿,谢谢大家乐!
      

  3.   

    解决了,代码如下:不过预览显示慢了点:
     Private   Const   CCHDEVICENAME   =   32   
      Private   Const   CCHFORMNAME   =   32   
      Private   Const   STANDARD_RIGHTS_REQUIRED   =   &HF0000   
      Private   Const   PRINTER_ACCESS_ADMINISTER   =   &H4   
      Private   Const   PRINTER_ACCESS_USE   =   &H8   
      Private   Const   PRINTER_ALL_ACCESS   =   (STANDARD_RIGHTS_REQUIRED   Or   PRINTER_ACCESS_ADMINISTER   Or   PRINTER_ACCESS_USE)   
      Private   Const   DM_MODIFY   =   8   
      Private   Const   DM_IN_BUFFER   =   DM_MODIFY   
      Private   Const   DM_COPY   =   2   
      Private   Const   DM_OUT_BUFFER   =   DM_COPY   
      Private   Const   DM_DUPLEX   =   &H1000&   
      Private   Const   DMDUP_SIMPLEX   =   1   
      Private   Const   DMDUP_VERTICAL   =   2   
      Private   Const   DMDUP_HORIZONTAL   =   3   
      Private   Const   DM_ORIENTATION   =   &H1&   
      Private   PageDirection   As   Integer   
      Private   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   
              dmLogPixels   As   Integer   
              dmBitsPerPel   As   Long   
              dmPelsWidth   As   Long   
              dmPelsHeight   As   Long   
              dmDisplayFlags   As   Long   
              dmDisplayFrequency   As   Long   
              dmICMMethod   As   Long                 '   //   Windows   95   only   
              dmICMIntent   As   Long                 '   //   Windows   95   only   
              dmMediaType   As   Long                 '   //   Windows   95   only   
              dmDitherType   As   Long               '   //   Windows   95   only   
              dmReserved1   As   Long                 '   //   Windows   95   only   
              dmReserved2   As   Long                 '   //   Windows   95   only   
      End   Type   
        
      Private   Type   PRINTER_DEFAULTS   
     
              pDatatype   As   String   
              pDevMode   As   Long   
              DesiredAccess   As   Long   
      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    
      Private   Declare   Function   DocumentProperties   Lib   "winspool.drv"   Alias   "DocumentPropertiesA"   (ByVal   hwnd   As   Long,   ByVal   hPrinter   As   Long,   ByVal   pDeviceName   As   String,   ByVal   pDevModeOutput   As   Any,   ByVal   pDevModeInput   As   Any,   ByVal   fMode   As   Long)   As   Long      
      Private   Sub   SetOrientation(NewSetting   As   Long,   chng   As   Integer,   ByVal   frm   As   Form)   
              Dim   PrinterHandle   As   Long   
              Dim   PrinterName   As   String   
              Dim   pd   As   PRINTER_DEFAULTS   
              Dim   MyDevMode   As   DEVMODE   
              Dim   Result   As   Long   
              Dim   Needed   As   Long   
              Dim   pFullDevMode   As   Long   
              Dim   pi2_buffer()   As   Long           'This   is   a   block   of   memory   for   the   Printer_Info_2   structure                           
              PrinterName   =   Printer.DeviceName   
              If   PrinterName   =   ""   Then   
                      Exit   Sub   
              End   If   
                
              pd.pDatatype   =   vbNullString   
              pd.pDevMode   =   0&   
              pd.DesiredAccess   =   PRINTER_ALL_ACCESS   
                
              Result   =   OpenPrinter(PrinterName,   PrinterHandle,   pd)                   
              Result   =   GetPrinter(PrinterHandle,   2,   ByVal   0&,   0,   Needed)   
              ReDim   pi2_buffer((Needed   \   4))   
              Result   =   GetPrinter(PrinterHandle,   2,   pi2_buffer(0),   Needed,   Needed)           
              pFullDevMode   =   pi2_buffer(7)                      
              Call   CopyMemory(MyDevMode,   ByVal   pFullDevMode,   Len(MyDevMode))   
                
              'Make   desired   changes   
              MyDevMode.dmDuplex   =   NewSetting   
              MyDevMode.dmFields   =   DM_DUPLEX   Or   DM_ORIENTATION   
              MyDevMode.dmOrientation   =   chng        
              'Copy   our   DevMode   structure   back   into   FullDevMode   
              Call   CopyMemory(ByVal   pFullDevMode,   MyDevMode,   Len(MyDevMode))         
              'Copy   our   changes   to   "the   PUBLIC   portion   of   the   DevMode"   into   "the   PRIVATE   portion   of   the   DevMode"   
              Result   =   DocumentProperties(frm.hwnd,   PrinterHandle,   PrinterName,   ByVal   pFullDevMode,   ByVal   pFullDevMode,   DM_IN_BUFFER   Or   DM_OUT_BUFFER)   
                
              'Update   the   printer's   default   properties   (to   verify,   go   to   the   Printer   folder   
              '     and   check   the   properties   for   the   printer)   
              Result   =   SetPrinter(PrinterHandle,   2,   pi2_buffer(0),   0&)   
                
              Call   ClosePrinter(PrinterHandle)         
              Dim   p   As   Printer   
              For   Each   p   In   Printers   
                      If   p.DeviceName   =   PrinterName   Then   
                              Set   Printer   =   p   
                              Exit   For   
                      End   If   
              Next   p   
              Printer.Duplex   =   MyDevMode.dmDuplex   
      End   Sub   
        
      Public   Sub   ChngPrinterOrientationLandscape(ByVal   frm   As   Form)   
              PageDirection   =   2   
              Call   SetOrientation(DMDUP_SIMPLEX,   PageDirection,   frm)   
      End   Sub   
        
      Public   Sub   ResetPrinterOrientation(ByVal   frm   As   Form)   
                      PageDirection   =   1         
              MsgBox   PageDirection   
              Call   SetOrientation(DMDUP_SIMPLEX,   PageDirection,   frm)   
      End   Sub         
      调用时如下:   
      Call   SetOrientation(DMDUP_SIMPLEX,   2,   Me)   '2是横打,1是竖打   
      form1.Show