ActiveReportにて印刷を行うと、「給紙トレイの設定サイズと違う用紙がセットされています」のエラーがでる


specoutレイジ  2012-10-17 18:17:27  No: 103374  IP: 192.*.*.*

【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ボタンを押すと、正常に印刷はされますが、印刷後に【質問】のエラーがでます。

以上になります。どなたかよろしくお願いします。

編集 削除
Koz  2012-10-18 00:02:14  No: 103375  IP: 192.*.*.*

まず、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 に渡す
ことが考えられますが、あまりお勧めできる方法ではありません。

編集 削除
specoutレイジ  2012-10-18 12:55:55  No: 103376  IP: 192.*.*.*

コモンダイアログコントロールにてプリンター設定画面を表示させて対応したいと思っています。

With Me.CommonDialog1
     .Flags = cdlPDPrintSetup
     .ShowPrinter
END WITH

この場合、プリンター設定画面で用紙のサイズは「ユーザー定義サイズ」、
給紙方法は「給紙トレイ」を表示させたいのですが、可能ですか?
(既に決定されているので、画面で選択はしないです)

いろいろ調べたのですが、やり方は分かりませんでした。

何か良い方法はあるでしょうか?

編集 削除
Koz  2012-10-19 02:57:16  No: 103377  IP: 192.*.*.*

その用途だと、コモンダイアログコントロールは不向きです。
プリンタのデフォルト用紙設定を、事前に目的のものに変えて
おくくらいしか出来ません。

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

編集 削除
Koz  2012-10-19 02:58:39  No: 103378  IP: 192.*.*.*

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

編集 削除