Q48:プレビューなしで印刷のダイアログを出し、その後でキャンセルしましたが、その後に印刷処理がされていました。キャンセルされたかどうかを判別する方法はありますでしょうか?
Q48-1:
印刷ダイアログからキャンセルボタンをクリックしても、印刷が行われてしまう。
A48-1:
ご質問のありました、印刷ダイアログからキャンセルボタンをクリックしても印刷が行われてしまうという現象についてご報告いたします。
付属のサンプル等を用いて確認を行いましたが、キャンセルボタンをクリックしたときには印刷は行われず、ご質問の現象は確認できませんでした。
可能性としましては、帳票コンポーネントは印刷がキャンセルされたときにイベント番号0の処理完了イベントを発生する仕様になっておりますので、その接続先に印刷処理が設定されていることや、印刷プレビュー画面表示後に別の印刷処理が設定されていること(この場合には、印刷プレビューの表示/終了のみで印刷が行われることになりますが)などが考えられます。
Q48-2:
私の質問ミスで、実際はプレビューなしで印刷のダイアログを出し、その後でキャンセルでした。その後に印刷処理がされていました。そこでキャンセルされたかどうかを判別する方法はありますでしょうか?
A48-2:
印刷がキャンセルされたかどうかは帳票コンポーネントが発生する処理完了イベントのイベント番号で判別できますので(0: キャンセル、1: 印刷、-1: 異常終了)、印刷処理を帳票コンポーネントが発生する処理完了イベントにカット&ペーストし、そのイベント番号を1に指定することでキャンセルの場合には印刷しないようにできるのではないかと思います。
ところで、お問い合わせのように、印刷ダイアログを表示した後に印刷処理が記述されているのであれば、印刷ダイアログで[印刷]ボタンをクリックした場合には、印刷ダイアログによる印刷が実行された後、その後に記述されている処理による印刷が実行されることになりますが、同じ帳票が複数印刷されるという現象は発生していないのでしょうか?
Q48-3:
一応試してみたのですが、自分の理解力が足りないようで、上手く動作せず、どうして良いのか分からなかったので、実際のプログラムを簡単にしたプログラムを作成したので、見て頂いてよろしいでしょうか。
A48-3:
帳票のメソッド「印刷設定画面を表示して設定を行う()」は、印刷設定のみを行うためのメソッドで、実際の印刷の実行/キャンセルとは連動しておらず、また、[印刷]/[取消し]のいずれのボタンがクリックされたのかを判別する方法はございません。
印刷設定画面から条件設定を行った後に印刷を行う場合には、メソッド「帳票を印刷する(boolean)」の引数をtrueとして実行し、帳票コンポーネントが発生する処理完了イベントにその後の印刷ループを接続すればよろしいかと存じます。
このとき、1部目はすでに印刷されることになりますので、「帳票を最後に指定した印刷設定で印刷する()」の対象になるのは2部目以降となることにご注意ください。
また、印刷ループでの印刷実行でも処理完了イベントが発生しますので、単に処理完了イベントに印刷ループを接続すると無限ループに陥ります(実際には、無限ループ回避のための再帰呼び出しエラーが発生します)。したがって、印刷ループでの印刷実行により発生した処理完了イベントからは印刷ループを呼び出さないようにしておくことが必要です。
参考までに、お送りいただいたアプリケーションを上述のように修正しましたので、ご覧ください(印刷サンプル2.mzax)。ここではイベント伝播制御コンポーネントを使い、印刷ループでの印刷実行により発生した処理完了イベントを遮断することで、無限ループを回避しています。
関連ファイル:印刷サンプル.mzax、印刷サンプル2.mzax
Q48-4:
頂いたプログラムを参考に実際のプログラムに組み込んだ所、印刷のダイアログ部分からの取り消し処理は問題なくできました。
多分、回答されている部分に関係するかと思いますが、
> このとき、1部目はすでに印刷されることになりますので、「帳票を最後に指定した印刷設定で
> 印刷する()」の対象になるのは2部目以降となることにご注意ください。
前回印刷した最後のデータで次回出すときに最初に印刷されて言われる様に2枚目からが指定したデータになります。これを回避する方法はあるのでしょうか?
A48-4:
ご質問の意味を分かりかねていますので、申し訳ありませんが、まず内容を確認させてください。
ご質問は、
「1回印刷を行った後、同じ印刷設定(例えば同じプリンタ)で内容の異なるデータを印刷しようとすると、前回印刷した内容が最初に印刷され、新しく指定したデータの印刷は2枚目以降となる。前回印刷した内容が最初に印刷されることのないようにするには、どうしたらよいか。」
ということでしょうか?
状況を詳しく、できれば前回のように、実際のプログラムを簡単化したものを用いてご説明いただけると助かります。
Q48-5:
実際のプログラムを簡素化したものです(印刷サンプル3.mzax)。実際にやりたいのは、プレビュー表示なしで必要なデータのみを印刷したいです。もしまた不明な点がありましたらご連絡ください。宜しくお願いします。
A48-5:
お気づきのように、等価演算[ID:5]に接続されている帳票の「帳票を印刷する(boolean)」を起動し、表示された印刷ダイアログで[印刷]ボタンをクリックすると、その時点で帳票に設定されているデータが印刷されます。
帳票には、起動後初回印刷時には空データ、2回目以降は最後に印刷したデータが残っていますので、それが印刷されてしまうことになります。これを回避するには、「帳票を印刷する(boolean)」の起動直前に1枚目のデータを設定しておき、イベント伝播制御[ID:8]に接続されている繰り返し制御[ID:10]で2枚目以降を印刷するようにすることが必要です。
そのように修正を行ったアプリケーション"印刷サンプル3a.mzax"を掲載しましたので、ご覧ください。"印刷サンプル3a.mzax"では、印刷対象項目のデータ設定処理をファンクションとしてまとめ、それを「帳票を印刷する(boolean)」の起動直前および繰り返し制御[ID:10]で呼び出しています。
また、印刷設定ダイアログを表示せずに現在の設定で印刷を実行する処理も追加しましたので、合わせてご覧ください。
関連ファイル:印刷サンプル3.mzax、印刷サンプル3a.mzax