[WR2.0]指定用紙のサイズにならない

HOME › フォーラム › 旧サポート掲示板 › [WR2.0]指定用紙のサイズにならない

  • このトピックは空です。
8件の投稿を表示中 - 1 - 8件目 (全8件中)
  • 投稿者
    投稿
  • #1050
    高坂 勝美
    ゲスト

    お世話になっております。
    レポートファイルの作成をwrCreateReport関数で行い、
    EPSON VP-1800のプリンターに対して
    縦15×4.5インチの連続用紙(上下余白0)で
    出力したいのですが、指定してもプレビュー
    及び結果が縦15×5 2/3インチの連続用紙で
    作成されてしまいます。
    ちなみにWrp32.exe(WR32 Designer)で作成して出力してみたら縦15×4.5インチの連続用紙(上下余白0)で出力できたのですがwrCreateReport関数を使って作成するとやはり前述のようになってしまいます。
    現象の確認を宜しくお願い致します。
    また、対応方法がございましたら教えて下さい。

    開発環境       windows98(SE) + VB6.0(SP3)
    使用プリンタ     EPSON VP-1800
    ドライバのバージョン EPSON VP-1800 Version 3.2
    WingReportのdllのバージョン
               Swsted32.dll(2,0,0,4)
               Wrmem32.dll(2,1,0,23)
               wrengn32.dll(2,6,0,25)
               SWRES32.dll(2,0,0,0)
               SWDRAW32.dll(2,1,0,4)

    #1051
    小島@ソフトウィング
    ゲスト

    お世話になっております。

    ●wrCreateReport関数
    HWREPORTswrCreateReport(pszReportTitle, nUnit, dbTopMargin, dbBottomMargin, dbLeftMargin, dbRightMargin, fMode, pDevnames, pDevmode )

    用紙サイズの指定はwrCreatePrinter関数の第9番目の引数[pDevmode]にて設定します。
    [pDevmode]にはレポートの印刷に使用するプリンタ情報のDEVMODE構造体を指定します。この時、DEVMODE構造体のメンバ[dmPaperSize]に設定されている用紙サイズがレポートの用紙サイズとして使用されます。

    もしよろしければ、wrCreateReportの呼び出し部分をどのように記述しているのかをお教え下さい。

    #1052
    高坂 勝美
    ゲスト

    お世話になります。
    wrCreateReport関数は以下のように記述しております。

    hReport = wrCreateReport(msReportName, WRP_UTMETRIC, PaperOffsetYU,PaperOffsetYD,PaperOffsetXL,PaperOffsetXR,
    mnPrintMode, msDeviceName, PrinterDevice)

    第9パラメータのプリンタ情報のDEVMODE構造体の情報は
    以下のようになっています。

    dmDevicename = EPSON VP-1800
    dmSpecVersion = 1024
    dmDriverVersion = 1025
    dmSize = 148
    dmDriverExtra = 186
    dmFields = 67134979
    dmOrientation = 1
    dmPaperSize = 288
    dmPaperLength = 1140
    dmPaperWidth = 3810
    dmScace = 0
    dmCopies = 1
    dmDefaultSource = 322
    dmPrintQuality = 180
    dmColor = 1
    dmDuplex = 1
    dmYresolution = 180
    dmTTOption = 1
    dmCollate = 0
    dmFormName =
    dmLogPixels = 0
    dmBitsPerPel = 0
    dmPelsWidth = 0
    dmPelsHeight = 0
    dmDisplayFlags = 0
    dmDisplayFrequency = 0
    dmICMMethod = 0
    dmICMIntent = 0
    dmMediaType = 0
    dmDitherType = 3
    dmReserved1 = 0
    dmReserved2 = 0

    構造体の内容で用紙の情報は
    dmPaperSize = 288   は[連続紙 15×4 1/2inch]
    dmPaperLength = 1140 は用紙長[114mm]
    dmPaperWidth = 3810 は用紙幅[381mm]
    なので送っている情報に間違いはないのですが、
    実際に出力すると用紙長はユーザー定義で指定可能な
    用紙長の最小値[1470mm]で出てしまうようです。
    その為、この最小値よりも小さな用紙長の用紙で
    連続紙 15×4inch
    連続紙 15×4 1/2inch
    連続紙 15×4 2/3inch
    連続紙 15×5 1/2inch
    のようなものは全て用紙の長さが[1470mm](5 2/3inch相当)と
    なってしまいます。

    現在の処理では
    wrSetPrintMode(hReport, WRP_MDPREVIEW) 及び
    wrSetPrintMode(hReport, WRP_MDNORMAL) で
    プレビュー表示とレポート指定のプリンタへの出力を
    行っていて発生している現象なのですが、
    wrSetPrintMode(hReport, WRP_MDDIALOG)で
    プリンタのダイアログを表示して設定後出力すると
    正しく[連続紙 15×4 1/2inch]に出力されます。

    宜しくお願い致します。

    #1053
    小島
    ゲスト

    お世話になります。

    DEVMODE構造体の取得はどのように行っていますか?
    dmDriverExtra=186
    となっていますが、この部分ですがこれはDEVMODE構造体の後ろにプリンタドライバ独自の情報が186バイト付加されていることを示します。
    そのため、その情報が正しくない場合プリンタドライバ側で無効な情報として扱われてしまう(デフォルトの設定が適用)可能性があります。

    プリンタドライバによりますが、dmDriverExtraを0として設定することで回避出来るものもあるようです。
    それ以外の場合は正式にDEVMODE構造体を取得してからその必要な情報だけを書き換えて使用する必要があります。

    #1054
    小島@ソフトウィング
    ゲスト

    お世話になっております。
    返答が遅くなり大変申し訳ございません。

    > 以下で手順を行っております。
    >
    > 1.プリンタのオブジェクトハンドルを取得(OpenPrinter関数)
    > 2.プリンタのバッファとして必要なサイズ及びプリンタ情報を
    >   取得(GetPrinter関数)
    > 3.取得したプリンタ情報をPRINTER_INFO_2構造体にコピーし、
    >   PRINTER_INFO_2構造体のpDevModeポインターから更にDEVMODE構造体に
    >   コピー(MoveMemory関数)
    > 4.プリンタ構造体のサイズを取得(DocumentProperties関数)
    >   ※DEVMODE構造体と拡張情報を含めた全サイズを取得
    >    注)DEVMODE構造体のdmSizeメンバ及びdmDriverExtraメンバを
    >      足したサイズには必ずしもならない。
    >      プログラム内でシステムのプリンタ設定には影響させずに
    >      アプリケーション上で独自にプリンタのプロパティの設定を
    >      行うようにする為、扱うプリンタ情報はDEVMODE構造体+拡張情報
    >      としている。拡張情報が無いとプリンタのプロパティの固有の
    >      情報が印刷結果へと反映されない。
    > 5.取得されたDEVMODE構造体に対して独自のプリンタプロパティに設定された
    >   用紙方向(dmOrientation)
    >   用紙サイズ(dmPaperSize)
    >   印刷枚数(dmCopies)
    >   用紙トレイ(dmDefaultSource)
    > を設定する。但しプリンタ側でそのような設定が有効な場合のみ設定する。
    > 6.用紙幅と用紙長を設定
    >   ※ユーザー指定用紙以外の場合は必要のない設定ではあるが、
    >    Windows2000で出力する場合には用紙幅と用紙長も設定しないと指定の用紙
    >    サイズでうまく出力されない
    > 7.独自のプリンタプロパティに設定されたプリンタ情報を保持したDEVMODE
    >   構造体+拡張情報をプリンタ情報としてWingReportへ引き渡す。
    >
    > 以上のようにプリンタ情報を取得しています。
    > 掲示板に返信した内容ですが、wrCreateReport関数の第9パラメータは
    > 実はDEVMODE構造体のみではなく、DEVMODE構造体+プリンタ固有の拡張情報の
    > 情報を送るようにしていました。(プリンタのプロパティ画面で設定されるプリ
    > ンタ固有の情報も反映させるため)
    >
    > hReport = wrCreateReport(msReportName,WRP_UTMETRIC,
    >      PaperOffsetYU,PaperOffsetYD,PaperOffsetXL,
    >      PaperOffsetXR, mnPrintMode,msDeviceName,
    >      bytDEVMODE(0)) ←プリンタの固有情報を含めたプリンタ情報
    >
    > ※wrCreateReport関数の宣言は第9パラメータはAny型としました。
    >  DEVMODE構造体のみを使用する方法だと各プリンタ共通の設定は可能ですが
    >  本アプリケーション上の話だけ(システムのプリンタ情報には影響させない)で
    >  プリンタのプロパティ画面を呼び出して設定を可能にしている関係上プリンタ
    >  固有の情報等の保持及び印刷結果への反映がされません。そのために拡張情報
    >  も含めたプリンタ情報を取得しWingReportへと送っています。
    >  (これは実際に拡張情報を含めた情報を送って印刷のテストを行い反映される
    >  事を確認しました。)
    >  拡張情報を含めたサイズをDocumentProperties関数を使用して現在そのプリンタ
    >  情報に必要なサイズを求めていますが、DEVMODE構造体のdmSizeメンバ(基本
    >  サイズ)とdmDriverExtraメンバ(拡張情報サイズ)を足すと実際に
    >  DocumentProperties関数で求められたサイズより大きくなってしまう場合が
    >  あります。一度取得した基本情報+拡張情報は必要に応じて取得元のメモリに
    >  戻す(プリンタのプロパティは設定後保持し、プリンタのプロパティを開く度に
    >  メモリに戻して反映させる。そうしないとプリンタのプロパティ画面は開く度に
    >  システムで設定されている内容でしか表示されない)必要がある為、メモリ破壊
    >  等の可能性がより少ないとの結論の元、DocumentProperties関数で実際に
    >  プリンタ情報を格納するのに必要なバイト数を求めてそのサイズでプリンタ情報
    >  の取得/設定を行っています。

    DEVMODEを取得する手順は上記の方法で良いかと思われます。

    DEVMODEに設定している情報ですが、いろいろと試してみたところ
    dmFields = 67134991
    dmPaperLength = 1143
    dmPaperWidth = 3810
    とすることで指定した用紙サイズ(15インチ×4.5インチ)に変更されるようです。
    (当社には実機がないため、プレビューにて確認しました)

    dmFieldsの値は取得したDEVMODEのdmFieldsにDM_PAPERLENGTHとDM_PAPERWIDTHを
    プラスしたものです。
    dmPaperLengthは1インチを25.4ミリとして計算したものです。
    プリンタドライバ側の仕様なのかと思われますが、dmPaperLengthを1140としてしまうと
    用紙サイズがユーザー定義用紙の最小値になってしまうようです。

    以上、よろしくお願い致します。

    #1055
    高坂 勝美
    ゲスト

    お世話になります。
    wrCreateReport関数で用紙サイズ(dmPaperSize)が256を超えるプリンタ情報(DEVMODE構造体)を受け渡して実行した後、
    wrGetReportPrinter関数でレポートに設定されているプリンタ
    情報を参照すると用紙サイズ(dmPaperSize)が全て256に置き換わってしまいます。
    wrSetReportPrinter関数でプリンタ情報の再設定を行った場合は正常にセットされます。
    プリンタのDEVMODE構造体の後ろにはdmDriverExtraのサイズで
    示されたドライバ独自の情報も付加するようにしております。
    (その時のサイズはdmSize+dmDriverExtraのサイズです。)
    最初のwrCreateReport関数のみで用紙サイズ(dmPaperSize)が256を超えるものも正常に設定(現在は全て256に置き換わってしまう)出来ないものでしょうか?
    宜しくお願い致します。

    #1056
    小島@ソフトウィング
    ゲスト

    お世話になります。

    同一バージョンのWingReportDLL及びプリンタドライバ(VP-1800 ver3.2)を使用してWin95,98にてテストを行いましたが現象を確認することが出来ませんでした。

    もしよろしければ処理手順(関数の呼び出し順序)をお教え下さい。
    または印刷処理部分のソースコードをそのままお送り下さい。
    (動作しなくても結構です)

    以上、よろしくお願い致します。

    #1057
    小島
    ゲスト

    お世話になります。

    お送り頂いたソースコードにてwrCreateReport後にdmPaperSizeが256番に
    なってしまう現象を確認することができました。
    これはWingReport側でdmPaperSizeを256番に設定しているためです。

    wrCreateReport時には渡されたDEVMODE構造体を元にレポートを作成します。
    その時にdmPaperSizeが257番以上に設定されている場合はプリンタ独自の用紙に
    なるため、まずそのプリンタで有効な用紙を列挙します。
    列挙された用紙のサイズと、dmPaperLength,dmPaperWidthを比較して一致する
    用紙が見つかった場合は、そのままの用紙番号を使用しますが、
    無い場合は256番(ユーザー定義用紙)として扱います。
    この処理は、他のプリンタで印刷等をする場合に必要になる為に行われます。

    上記の処理は、wrLoadReportを使用した場合にも行われていますが、wrLoadReport
    の場合は、既にデザインされているレポートがあるので用紙のサイズがWingReport側
    で把握することが出来るため、自動的にdmPaperLength,dmPaperWidthが設定されます。

    前回、こちらで現象が確認出来なかったのはdmPaperSizeとdmPaperWidthを
    設定し指定した用紙のサイズに合わせていたためでした。

    wrSetReportPrinterでは上記のような処理が行われない為、指定されたDEVMODEの
    内容がそのまま使用されます。

    wrCreateReport関数のDEVMODEは引数に[ByVal vbNullString]と指定することで
    省略することが出来ます。(省略した場合は通常使用するプリンタになります)
    wrCreateReport関数でDEVMODEの設定を省略し、wrSetReportPrinter関数を使用する
    ことでDEVMODEを二度設定する必要は無くなりますので、この方法で
    対応頂けますでしょうか?

    以上、よろしくお願い致します。

8件の投稿を表示中 - 1 - 8件目 (全8件中)
  • フォーラム「旧サポート掲示板」には新規投稿および返信を追加できません。