【OS】 : Windows7
【Ver】 : VB6 ActiveReports 1.5J
【プリンター】: FUJITSU XL-9380_Pnav
【質問】: VB6からActiveReportにて印刷を行うと、「給紙トレイの設定サイズと違う用紙がセットされています」のエラーがでる為、困っています。
(プリンターから出ているエラーです。) 何か対応策が分かりましたら、ご教授願います。
【状況】
(1)Windows2000では【質問】のエラーはでません。
(2)用紙サイズはユーザー定義サイズ(105mm x 295mm)、給紙方法は給紙トレイで出力するようにVB側で指定をしています。
(3)プリンターダイアログ画面(ActiveReport名.Printer.SetupDialog)を表示させており、(2)の情報はダイアログ画面に表示されています。
(4)私が検証した結果、ダイアログ画面を表示させないようにVBを変更すれば、エラーがでません。正常に印刷されます。
しかし、ダイアログ画面を表示させ、OKボタンを押すと、正常に印刷はされますが、印刷後に【質問】のエラーがでます。
以上になります。どなたかよろしくお願いします。
まず、1.5J の最新バージョンの公開日は 2001/06/10 ですし、
1.5J は Windows 7 に非対応ではないかと思います。
2.0J のほうは、対応しているようですが
http://www.grapecity.com/tools/products/activereports2/whatsnew#info
2.0J のほうにも、プリンタダイアログに関する不具合があった※ので
1.5J では、修正されないまま不具合が残っている可能性は大です。
※ API フックをして観察してみたところ、PrintDlg で設定された DEVMODE
構造体の一部を書き換えて CreateDC に渡しているようでした。
コモンダイアログコントロール等を使って用紙に関する情報を取得し、
Printer オブジェクトに適用するのが良いのではないでしょうか。
トリッキーな対応としては、ActiveReports が呼び出している PrintDlg
および、CreateDC をフックし、正常な DEVMODE 構造体を CreateDC に渡す
ことが考えられますが、あまりお勧めできる方法ではありません。
コモンダイアログコントロールにてプリンター設定画面を表示させて対応したいと思っています。
With Me.CommonDialog1
.Flags = cdlPDPrintSetup
.ShowPrinter
END WITH
この場合、プリンター設定画面で用紙のサイズは「ユーザー定義サイズ」、
給紙方法は「給紙トレイ」を表示させたいのですが、可能ですか?
(既に決定されているので、画面で選択はしないです)
いろいろ調べたのですが、やり方は分かりませんでした。
何か良い方法はあるでしょうか?
その用途だと、コモンダイアログコントロールは不向きです。
プリンタのデフォルト用紙設定を、事前に目的のものに変えて
おくくらいしか出来ません。
API を使ってゴリゴリ書いていくしかなさそうです。
ちょっとさわりの部分だけ書いてみます。
Private Sub Command1_Click()
Dim hPrinter As Long
Dim nRet As Long
Dim nSize As Long
Dim lpDevMode As Long
Dim pd As typPRINTDLG
Dim dev As typDEVMODE
' PRINTDLG 構造体の初期化
With pd
.lStructSize = Len(pd)
.Flags = PD_PRINTSETUP
End With
' プリンタオープン
nRet = OpenPrinter(Printer.DeviceName, hPrinter, 0)
' 必要なサイズを求め、DEVMODE を取得
nSize = DocumentProperties(0, hPrinter, vbNullString, 0, 0, 0)
pd.hDevMode = GlobalAlloc(GHND, nSize)
lpDevMode = GlobalLock(pd.hDevMode)
nRet = DocumentProperties(0, hPrinter, vbNullString, lpDevMode, 0, DM_OUT_BUFFER)
' VB の構造体にコピー
Call CopyMemory(dev, ByVal lpDevMode, Len(dev))
' プリンタクローズ
nRet = ClosePrinter(hPrinter)
' VB の構造体を使って値をセット
With dev
.dmPaperSize = vbPRPSA3 '用紙をA3にする
End With
' 実際の DEVMODE ヘ書き戻す
Call CopyMemory(ByVal lpDevMode, dev, Len(dev))
nRet = GlobalUnlock(pd.hDevMode)
nRet = PrintDlg(pd)
' VB の構造体にセット
lpDevMode = GlobalLock(pd.hDevMode)
Call CopyMemory(dev, ByVal lpDevMode, Len(dev))
nRet = GlobalUnlock(pd.hDevMode)
nRet = GlobalFree(pd.hDevMode)
MsgBox dev.dmPaperSize 'セットされた用紙を表示
End Sub
API/定数の宣言です。
Private Const PD_PRINTSETUP As Long = &H40
Private Const GMEM_MOVEABLE As Long = &H2
Private Const GMEM_ZEROINIT As Long = &H40
Private Const GHND As Long = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
Private Const DM_OUT_BUFFER As Long = 2
Private Declare Function OpenPrinter _
Lib "winspool.drv" _
Alias "OpenPrinterA" _
(ByVal pPrinterName As String, _
phPrinter As Long, _
ByVal pDefault As Long) 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 Long, _
ByVal pDevModeInput As Long, _
ByVal fMode As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" _
(ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" _
(ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" _
(ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" _
(ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Type typPRINTDLG
lStructSize As Long
hWndOwner As Long
hDevMode As Long
hDevNames As Long
hdc As Long
Flags As Long
nFromPage As Integer
nToPage As Integer
nMinPage As Integer
nMaxPage As Integer
nCopies As Integer
hInstance As Long
lCustData As Long
lpfnPrintHook As Long
lpfnSetupHook As Long
lpPrintTemplateName As Long
lpSetupTemplateName As Long
hPrintTemplate As Long
hSetupTemplate As Long
End Type
Private Declare Function PrintDlg _
Lib "comdlg32.dll" _
Alias "PrintDlgA" _
(pPrintdlg As typPRINTDLG) _
As Long
Private Const CCHDEVICENAME As Long = 32
Private Const CCHFORMNAME As Long = 32
Private Type typDEVMODE
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 Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
ツイート | ![]() |