- このトピックは空です。
-
投稿者投稿
-
2021年6月30日 10:21 AM #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)2021年6月30日 10:21 AM #1051小島@ソフトウィング
ゲストお世話になっております。
●wrCreateReport関数
HWREPORTswrCreateReport(pszReportTitle, nUnit, dbTopMargin, dbBottomMargin, dbLeftMargin, dbRightMargin, fMode, pDevnames, pDevmode )用紙サイズの指定はwrCreatePrinter関数の第9番目の引数[pDevmode]にて設定します。
[pDevmode]にはレポートの印刷に使用するプリンタ情報のDEVMODE構造体を指定します。この時、DEVMODE構造体のメンバ[dmPaperSize]に設定されている用紙サイズがレポートの用紙サイズとして使用されます。もしよろしければ、wrCreateReportの呼び出し部分をどのように記述しているのかをお教え下さい。
2021年6月30日 10:21 AM #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]に出力されます。宜しくお願い致します。
2021年6月30日 10:21 AM #1053小島
ゲストお世話になります。
DEVMODE構造体の取得はどのように行っていますか?
dmDriverExtra=186
となっていますが、この部分ですがこれはDEVMODE構造体の後ろにプリンタドライバ独自の情報が186バイト付加されていることを示します。
そのため、その情報が正しくない場合プリンタドライバ側で無効な情報として扱われてしまう(デフォルトの設定が適用)可能性があります。プリンタドライバによりますが、dmDriverExtraを0として設定することで回避出来るものもあるようです。
それ以外の場合は正式にDEVMODE構造体を取得してからその必要な情報だけを書き換えて使用する必要があります。2021年6月30日 10:22 AM #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としてしまうと
用紙サイズがユーザー定義用紙の最小値になってしまうようです。以上、よろしくお願い致します。
2021年6月30日 10:22 AM #1055高坂 勝美
ゲストお世話になります。
wrCreateReport関数で用紙サイズ(dmPaperSize)が256を超えるプリンタ情報(DEVMODE構造体)を受け渡して実行した後、
wrGetReportPrinter関数でレポートに設定されているプリンタ
情報を参照すると用紙サイズ(dmPaperSize)が全て256に置き換わってしまいます。
wrSetReportPrinter関数でプリンタ情報の再設定を行った場合は正常にセットされます。
プリンタのDEVMODE構造体の後ろにはdmDriverExtraのサイズで
示されたドライバ独自の情報も付加するようにしております。
(その時のサイズはdmSize+dmDriverExtraのサイズです。)
最初のwrCreateReport関数のみで用紙サイズ(dmPaperSize)が256を超えるものも正常に設定(現在は全て256に置き換わってしまう)出来ないものでしょうか?
宜しくお願い致します。2021年6月30日 10:22 AM #1056小島@ソフトウィング
ゲストお世話になります。
同一バージョンのWingReportDLL及びプリンタドライバ(VP-1800 ver3.2)を使用してWin95,98にてテストを行いましたが現象を確認することが出来ませんでした。
もしよろしければ処理手順(関数の呼び出し順序)をお教え下さい。
または印刷処理部分のソースコードをそのままお送り下さい。
(動作しなくても結構です)以上、よろしくお願い致します。
2021年6月30日 10:23 AM #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を二度設定する必要は無くなりますので、この方法で
対応頂けますでしょうか?以上、よろしくお願い致します。
-
投稿者投稿
- フォーラム「旧サポート掲示板」には新規投稿および返信を追加できません。