自定义纸张的格式为:
宽:21cm
长:11cm在Datareport中设置打印方向为纵向打印,在预览或者直接打印的时候都显示纸张宽度不够,设置为横向打印,则打印出来的结果不对。在Datareport打印或者预览之前,设定为横向打印,然后在弹出打印设置对话框的时候,再通过对话框修改打印方向为纵向打印,则打印出来的结果才是正确的。因为是大量票据打印,不可能要求操作员每次都去人工调整打印方向,这种问题怎么解决?明明正确的打印方向是纵向,宽度也够。环境:VB SP6,XP,打印机:EPSON 1600KIII
宽:21cm
长:11cm在Datareport中设置打印方向为纵向打印,在预览或者直接打印的时候都显示纸张宽度不够,设置为横向打印,则打印出来的结果不对。在Datareport打印或者预览之前,设定为横向打印,然后在弹出打印设置对话框的时候,再通过对话框修改打印方向为纵向打印,则打印出来的结果才是正确的。因为是大量票据打印,不可能要求操作员每次都去人工调整打印方向,这种问题怎么解决?明明正确的打印方向是纵向,宽度也够。环境:VB SP6,XP,打印机:EPSON 1600KIII
或者,怎样自动在Datareport开始打印前,强制改掉打印方向?
按你报表纸张老板新建一个纸张规格,然后在打印机中选择这个纸张
设置横向打印-〉打印结果错误
设置纵向打印-〉提示纸张宽度不够如果:
程序里面设置横向打印-〉打印前的那个打印对话框里面再设置成纵向打印-〉打印结果正确。希望:
能不需要每次都人工去修改打印对话框里面的打印方向。
你仔细检查吧,这不是Datareport的问题
打印机纸张的设置一是在打印默认项中,一是在设备设置中,二者都要设置正确
打印预览正常-〉打印不正常
程序里面直接改好打印方向再打印的-〉提示宽度不够
打印预览后调出打印设置框-〉人工订正打印方向-〉打印才会正常
----------------------------------------
1.简单的方法是设计报表时,将打印机纸张设置为你设计的纸张
2.通常用宽度和高度来标识纸规格,当你打印机设置的纸张宽度小于你报表设计时定义的纸张宽度,就是你现在的错误。高度是用来控制打印机走纸的,并不只是一个参数
3.谢谢你提醒,我天天用着Datareport报表打印文件 :)
1 我设计报表的时候,默认打印机,默认纸张就是需要的21*11的规格
2 我Datareport里面的宽度只有19cm,纸张宽度有21cm,足够了,正常理解是不会有错误,但实际上就会提示这样的错误。我已经重复很多遍了,尽管我们设置了宽21,长11,但实际上打印的时候,VB始终认为宽11,长21,宽度为19的报表必须横向打印。
3 Datareport中能控制高度吗?在哪里设置?据我的理解,Datareport仅仅是控制宽度和打印方向。
4 我相信你经常使用Datareport,但你试过这种情况吗?我写VB已经五年了。
------------------
N,这个是有点郁闷了
不过会和VB相关吗?疑问
但就是每打印一次就要重设一次
解决:
先升级,vssp6
升级完后,Datareport下会多一个可以设置打印方向的属性.Or。的,我忘了
因为在datareport内改变打印方向的话就预览不出来了,所以就要等预览出来后再改变打印的方向
方法就是在调用datareport下的窗口中加个timer,在timer里改变打印的方向
然后在datareport下的active事件内将timer的enabled设为true就可以了
不打sp6补丁,Datareport没有Orientation属性,这个我到知道,
呵呵,没想到是这个问题
为什么要在timer中设置Orientation呢?可以在DataReport_Initialize设置啊?
---------------------------------------------------------------------------------
人事考勤工资系统88元!9天自助建站系统80元!VB项目毕业设计参考20元!100个商业网站源码热销中!
阳光软件网:
http://www.sun883.com
我现在只能另外再做一个打印菜单,直接进行打印。这时的打印机设置方向和系统的打印机打印方向是一致的,可以直接打印。但不能同时打开表格预览窗口又进行打印操作,否则会出错。
当然,那些要打印的那些数据,它们在纸上的位置仍旧不变,这样套打就不会有偏移了我一些自己写的打印都是这样的,直接打在纸上,不管是什么纸,都是按坐标为(0,0)来进行位置编排PS:不知道有没有用过VSPRINTER控件呢???
有个预览的问题想请教!
【原因】
在98中的自定义设置纸张仅需在打印机设置中设置好长和宽即可,因为98下的自定义打印纸被统一为Custom类型,编号是256(还是255?忘记了)。程序控制中也是使用Printer.Height和Printer.Weight进行修改即可,所以在98下设计自定义纸张一般没什么问题;在XP中,允许存在多个自定义纸张(使用打印纸的自定义名称进行选定),当系统中设定的自定义纸张的类型大于1种的时候,则可能发生早期的语言工具无法控制自定义纸张的问题,因为此时你要的自定义打印纸可能不是256这样的编号(早期语言工具主要都找这个编号来用),结果就是无法控制自定义纸张的大小。这样的问题不只存在于VB中,其他的语言,是98年代时髦起来的语言都可能存在这样的问题,例如:Delphi的QuickReport也是抓不准XP的自定义打印纸张。【解决方案】
按照XP的选纸方式进行:就是根据你在打印机的服务器属性内设定好的自定义纸张的名称,找到它的编号,然后修改打印机设置的纸张类型为这种编号。代码参考(一些API的声明就不写了,不然太长了):
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
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
ChangeDefault "mypage", OrientPortrait
rpt.Orientation = rptOrientDefault
rpt.PrintReport以上是我的解决方案,希望能给遇到同样问题的人有点帮助
借用了别的地方的API的声明,但总是提示类型不匹配,不知道为什么啊
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
2wuliao(无疗)快来救命啊。。