国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

關于數據報表的打印設置

2019-11-18 17:49:09
字體:
來源:轉載
供稿:網友
數據報表(DataReport)是VB6新增功能之一。用過它的朋友對這個設計器可以說是既愛且恨。盡管它功能強大,但卻有個非常致命的缺點:無法在設計環境中改變紙張大小及走向。即使你在程序中使用PRinter對象改變紙張大小及打印走向,也解決不了問題。對于非A4紙的報表或是橫向打印的報表,連報表預覽都不行。

問題的原因是:DR基于系統默認的打印設置創建自己的內部設備環境。而這個設備環境是沒有向外界展現的。DR的內部設備環境與VB的Printer對象的內部設備環境是完全不同的,因此改變打印機對象的屬性對DR一點效果也沒有。

解決這個問題的笨辦法是,在預覽或打印時改變系統默認打印機的設置。使用這個方法連自己都會覺得麻煩,更何況是你的用戶。沒辦法,只能通過代碼強行改變系統默認打印機的設置來解決。將下面的代碼放入一個模塊中:

OptionExplicit

PublicEnumPrinterOrientationConstants
OrientPortrait=1
OrientLandscape=2
EndEnum
PrivateTypeDEVMODE
dmDeviceNameAsString*32
dmSpecVersionAsInteger
dmDriverVersionAsInteger
dmSizeAsInteger
dmDriverExtraAsInteger
dmFieldsAsLong
dmOrientationAsInteger
dmPaperSizeAsInteger
dmPaperLengthAsInteger
dmPaperWidthAsInteger
dmScaleAsInteger
dmCopiesAsInteger
dmDefaultSourceAsInteger
dmPrintQualityAsInteger
dmColorAsInteger
dmDuplexAsInteger
dmYResolutionAsInteger
dmTTOptionAsInteger
dmCollateAsInteger
dmFormNameAsString*32
dmUnusedPaddingAsInteger
dmBitsPerPelAsInteger
dmPelsWidthAsLong
dmPelsHeightAsLong
dmDisplayFlagsAsLong
dmDisplayFrequencyAsLong
EndType
PrivateTypePRINTER_DEFAULTS
pDataTypeAsString
pDevModeAsLong
DesiredaccessAsLong
EndType
PrivateTypePRINTER_INFO_2
pServerNameAsLong
pPrinterNameAsLong
pShareNameAsLong
pPortNameAsLong
pDriverNameAsLong
pCommentAsLong
pLocationAsLong
pDevModeAsLong
pSepFileAsLong
pPrintProcessorAsLong
pDataTypeAsLong
pParametersAsLong
pSecurityDescrphprinterAsLong,pDefaultAsAny)AsLong

PrivateDeclareFunctionClosePrinterLib"winspool.drv"(ByValhPrinterAsLong)AsLong

PrivateDeclareFunctionDocumentPropertiesLib"winspool.drv"Alias"DocumentPropertiesA"(ByValhWndAsLong,ByValhPrinterAsLong,ByValpDeviceNameAsString,pDevModeOutputAsAny,pDevModeInputAsAny,ByValfModeAsLong)AsLong

PrivateDeclareFunctionGetPrinterLib"winspool.drv"Alias"GetPrinterA"(ByValhPrinterAsLong,ByValLevelAsLong,pPrinterAsAny,ByValcbBufAsLong,pcbNeededAsLong)AsLong

PrivateDeclareFunctionSetPrinterLib"winspool.drv"Alias"SetPrinterA"(ByValhPrinterAsLong,ByValLevelAsLong,pPrinterAsAny,ByValCommandAsLong)AsLong

FunctionSetDefaultPrinterOrientation(ByValeOrientationasprinterOrientationConstants)AsBoolean

DimbDevMode()AsByte
DimbPrinterInfo2()AsByte
DimhPrinterAsLong
DimlResultAsLong
DimnSizeAsLong
DimsPrnNameAsString
DimdmAsDEVMODE
DimpdAsPRINTER_DEFAULTS
Dimpi2AsPRINTER_INFO_2

'獲取默認打印機的設備名稱
sPrnName=Printer.DeviceName
'由于要調用SetPrinter,所以
'如果是在NT下就要求PRINTER_ALL_ACCESS
pd.DesiredAccess=PRINTER_ALL_ACCESS

'獲取打印機句柄
IfOpenPrinter(sPrnName,hPrinter,pd)Then
'獲取PRINTER_INFO_2結構要求的字節數

CallGetPrinter(hPrinter,2&,0&,0&,nSize)
ReDimbPrinterInfo2(1TonSize)AsByte
lResult=GetPrinter(hPrinter,2,bPrinterInfo2(1),nSize,nSize)
CallCopyMemory(pi2,bPrinterInfo2(1),Len(pi2))
nSize=DocumentProperties(0&,hPrinter,sPrnName,0&,0&,0)
ReDimbDevMode(1TonSize)
Ifpi2.pDevModeThen
CallCopyMemory(bDevMode(1),ByValpi2.pDevMode,Len(dm))
Else
CallDocumentProperties(0&,hPrinter,sPrnName,bDevMode(1),0&,DM_OUT_BUFFER)
EndIf

CallCopyMemory(dm,bDevMode(1),Len(dm))
Withdm
'設置新的走向
.dmOrientation=eOrientation
.dmFields=DM_ORIENTATION
'.dmPaperSize=DMPAPER_A5將紙張大小設為A5,請自行更改所需大小
'.dmFields=DM_PAPERSIZE必須,否則無法設置紙張大小
EndWith
CallCopyMemory(bDevMode(1),dm,Len(dm))

CallDocumentProperties(0&,hPrinter,sPrnName,_
bDevMode(1),bDevMode(1),DM_IN_BUFFEROr_
DM_OUT_BUFFER)

pi2.pDevMode=VarPtr(bDevMode(1))

lResult=SetPrinter(hPrinter,2,pi2,0&)

CallClosePrinter(hPrinter)
SetDefaultPrinterOrientation=True
Else
SetDefaultPrinterOrientation=False
EndIf

EndFunction
在打印或預覽之前直接調用SetDefaultPrinterOrientation打印走向常數。注意:紅色注釋部分用于改變紙張的大小。

這個解決方案仍有兩個問題:

1。對有些型號的打印機不起作用,例如佳能的BJC-265SP
2。即使是在預瀏DR時,也必須改變打印機的設置。這時如果有其它使用打印機默認設置的程序(如Notepad)要進行打印作業,就可能造成混亂。


盡管如此,這個方法是目前唯一好用的方法。->


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 曲阳县| 隆德县| 夏邑县| 固原市| 吉林市| 曲靖市| 浦江县| 偃师市| 漾濞| 北票市| 瓦房店市| 平陆县| 阿克苏市| 晋城| 吉首市| 伊春市| 洛阳市| 信丰县| 濮阳市| 新河县| 贵州省| 南华县| 新密市| 郴州市| 文登市| 枝江市| 文安县| 边坝县| 西藏| 会东县| 河津市| 南康市| 清水县| 烟台市| 忻城县| 兰考县| 墨竹工卡县| 元阳县| 左权县| 卢湾区| 昌黎县|