• ベストアンサー

プリンタの状態を知る方法

只今、VB6のDataReportを使って帳票を作成しています。1つの雛型を使って、 複数のレポートを連続印刷しようとしていますが、DataReportとFormが非同期で あるため、DataReportがまだ帳票をプリンタに吐き出し終わっていないうちに、次の帳票を作ろうとしてしまい、エラーが出てしまいます。 色々調べて、MoveMemoryなるAPIを使ってプリンタの状態(印刷中、とかスプール中とか)を取得しようとしていますが、それもエラーがでてしまいます。 どうしたら、上手にプリンタの状態を知ることが出来るでしょうか? もしくは、非同期で動いているもの同士の同期を取るような方法がありましたら ぜひ教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

こんにちは VBが実行させたモジュールと自分を同期させる方法がWin32APIでありますので 参考にして下さい。 .bas '起動プロセスのオープン(状態の取得準備) Public Declare Function OpenProcess Lib "KERNEL32" _ (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long '起動プロセスとのシンクロ(待機する) Public Declare Function WaitForSingleObject Lib "KERNEL32" _ (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long '起動プロセスのクローズ(終了) Public Declare Function CloseHandle Lib "KERNEL32" _ (ByVal hObject As Long) As Long '起動プロセスが実行中か調べる(状態の取得) Public Declare Function GetExitCodeProcess Lib "KERNEL32" _ (ByVal hProcess As Long, lpExitCode As Long) As Long Public Const SYNCHRONIZE = &H100000 Public Const INFINITE = &HFFFF .frm Dim IDProcess As Long Dim hProcess As Long Dim ret As Long IDProcess = 起動プロセス hProcess = OpenProcess(SYNCHRONIZE, 1, IDProcess) ret = WaitForSingleObject(hProcess, INFINITE) ret = CloseHandle(hProcess) 起動プロセスをControl.PrintReportで試してください。

kanakokanako
質問者

補足

アドバイス、どうもありがとうございます! 起動プロセスについてなのですが、DataReportでも起動プロセスは得られるのでしょうか?

その他の回答 (3)

回答No.4

No.3の補足についての回答です。 MSDNのヘルプでPrintReportメソッドを調べたら 最後の行に "PrintReport メソッドは、非同期の操作を実行します。PrintReport メソッドは、非同期の操作を示す "クッキー" の識別子を返します。" とあります。 私はやったことが無いので一度試してください。 よろしく。

kanakokanako
質問者

お礼

どうもありがとうございます! ヘルプで調べて頂いたんですね。 本当にありがたいです。 是非試してみようと思います!

  • sienna
  • ベストアンサー率35% (51/145)
回答No.2

DataReportは使用したことが無いのですが 要するに印刷処理中に再度印刷ボタンをクリックされてしまう事が 問題なのではないですか? 印刷が終了するまで印刷ボタン等を押せなくしたり 雛型を増やしてはダメですか?

kanakokanako
質問者

補足

雛型を作るとしたら、400個ほど作らないといけないので、それはちょっと避けたいところなのです。 再印刷についてですが、『ボタンを押す』という形ではなくて、前の印刷の続きで印刷されてしまうので、ボタンでの制御は出来ないのです…。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 どういうエラーが出るのかわからないので、何とも言えませんが、とりあえずプリンタの印刷ジョブを列挙するサンプルのURLを紹介します。 このvbvbvb.comにはたくさんサンプルがあるので探してみてはどうでしょうか。 では。

参考URL:
http://www.vbvbvb.com/jp/gtips/0351/gEnumJobs.html
kanakokanako
質問者

補足

早速のお返事、ありがとうございます。 vbvbvb.comを拝見させて頂いたのですが、同じような処理をしても、どうもエラーが出てきてしまいます。 エラーの内容は「メモリが"read"になることはありませんでした」というものです。 どうやらMOVEMEMORYの箇所でエラーが発生するようです。 どうしたら出来るんでしょうか…。 どうかアドバイスよろしくお願いします。 ちなみにOSはWin2000です。

関連するQ&A

  • プリンターエラーの判定

    プリンターの用紙切れやオフライン等の検出をしたいのですが、APIかなにかで出来るのでしょうか? Printerオブジェクト出力ならならON ERRORで判定は出来るみたいですが、帳票ツール(アクティブレポートOCX等)のときに判定する方法はあるのでしょうか? お解りになられる方がいらっしゃればお教え願います。 宜しくお願いいたします。

  • 出力するプリンタを指定したい。

    現在、VB6.0で開発を行い、帳票をACCESSのレポートを使用しています。 レポートを印刷した際に、VB側より指定したプリンタに出力したいのですが、決まって通常使うプリンタに出力されてしまいます。 プリンタは指定できない物なのでしょうか? ちなみに指定している方法は、デバイス名を記述し、設定されているプリンタを検索し、合うプリンタがあれば、その番号(?)を Set Printer = XXX(番号)          ↑忘れました、ごめんなさい。 と言うような形でコーディングしています。

  • プリンタの状態を取得したいです

    お世話になります。 パラレルポートを使って接続したローカルプリンタの 状態を取得する処理を作っています。 すぐに印字できる状態かどうかをチェックし、 印字可能であれば、印刷処理を行う、 ということをしたいのですが、APIがよくわかりません・・・ GetPrinterや、EnumJobs等をサンプルを見ながら、試してみました。 しかし、プリンタの電源を落としても、オフラインになりません。 [設定]-[プリンタ]で詳細表示にして状態を見ても「準備完了」となっています。 どうすれば、オフラインや、その他のエラー情報が取れるのでしょうか? OSはWindows2000Proです。 よろしくお願いいたします。

  • VB2005によるプリンタ制御について

    現在、VB6⇒VB2005のコンバージョン作業を行っています。 そこで、今まで使っていたプリンタ制御用のAPIで「OpenPrinter」「EnumJobs」「SetPrinter」を利用し、 対象プリンタのエラー等で溜まったジョブの削除を行っていました。 しかし、VB2005になり、これらのAPIをうまく使う事が出来ないでいます。 今回、やりたい事は、「指定したプリンタのジョブを削除する」という処理を行いたいと思っています。 VB2005でこれらのAPIの使い方を教えて頂けないでしょうか? 又は、.NETのクラスでプリンタのジョブ削除をやってくれる機能が あれば教えて頂きたいと思っています。 よろしくお願いします。

  • ネットワーク プリンター

    こんにちは。 ネットワーク に接続されたサーバープリンターが印刷エラーになります。 WINXP 正常にプリンターは作動します。 WINME エラーで印刷できません(すべてのソフトから) 今までは正常に作動していました (XP、ME) ネットワークにプリントサーバーアイコンは有ります。 プリンタのTCP/IP プリンター名も有りますが認識していないようです。 印刷を実行するとプリンタのスプールしていますがその状態でエラーです。 XPにファイアウォールを設定してから作動しなくなった???? でも 設定を解除しても MEのプリンターは上記の状態で印刷できません セキュリティーの関係で認識していないような感じなのですがよくわからないので 教えてください。

  • 古いプリンター・PC-PR201/65Aなんですが

    PC-PR201/65Aという古い型のプリンターを長年大切に使っている者です。つい先日、いつものように送り状(連続伝票)を印刷しようと後ろから伝票を入れましたが、「フィードエラー」と表示されプリンターのどのスイッチを押しても変化しなくなりました。PC9801RA21を使用しています。シートフィーダーを取り付けてありますがこちらからは紙は入っていくのですが、切替も出来ない状態になりました。また、手動にてノブを回しても後ろにある連続帳票用のフィーダーが動きません。どなたか対処方法をご伝授いただけませんでしょうか?よろしくお願いいたします。

  • VB6.0でのプリンタ設定について

    はじめまして。 現在VB6.0にて、プリンタダイアログを表示させずに、プリンタの変更~印刷を行うプログラムを作成しています。(とある印刷は別のプリンタで印刷のイメージです) 方法はWIN32APIとWMIの2通りがあるようですがなかなか作成することができません。 WIN32API使用に関しては特に??で勉強中です。 イメージの流れでは以下を考えています。 (1)通常使用プリンタのバックアップ (2)通常使用プリンタの変更 (3)印刷 (4)通常使用プリンタを戻す すいませんがご教授いただけませんでしょうか?

  • クリスタルレポートのプレビュー画面を常に手前に表示しておく

    VB6.0 SP5 で クリスタルレポートの帳票を 作っています。 今、プレビュー画面が開いているFormのうしろに回り込んでしまうという現象が起きていて、これを防ぎたいのですが、どなたか良い方法を知りませんでしょうか?

  • プリンタアイコンが消える

    OS:Win2000SP2・SP3 メモリ:128MB プリンタ:CanonLBP-910 WordやExcelの印刷をしようとすると、『プリンタが見つかりません』というエラーメッセージが出て印刷が出来ません。その後、[スタート]-[設定]-[プリンタ]を確認するとプリンタアイコンが全て消えてしまっていました。 メモリかスプールの障害かと考えたんですが、どうにもわかりません。 何か情報をお持ちでしたら、教えていただければと思います。 よろしくお願い致します。

  • Access2000で同一レポートを複数のプリンタに切り替えて印刷する方法

    ネットワーク上にプリンタが複数あります。仮に「プリンタA」と「プリンタB」とします。「プリンタA」と「プリンタB」は、同じ機種です。 Access2000のレポート作成時に設定したプリンタは「プリンタA」です。 このレポートを印刷したいときに、「プリンタA」が他の印刷中で使用できません。 こういったケースでVBAを使って、「プリンタB」から印刷するようなことができますか? VBAはみようみまねでやっているような素人なので、いろんな本を読んでみるのですが、こういった事例が見当たりません。 もし、ご存知の方がいらっしゃいましたら、ご指導いただけないでしょうか。 よろしくお願いいたします。

専門家に質問してみよう