この特集のトップページへ
Chapter 7:プレゼンテーション層の構築

7.4.7 顧客情報の印刷処理
●印刷処理

○印刷の中断処理を実現する
 以上で印刷処理を実現することができたわけだが,もう少し機能を追加したい箇所がある。それは,印刷の中断処理である。印刷は時間がかかる処理であるから,ユーザーの都合に応じて途中で中断できる機能は是非とも搭載したい。特に帳票の印刷においては,帳票が数百ページに渡ることも少なくない。もし,数百ページもあるデータを誤って印刷してしまって,それを取り消すことができないとすると,ユーザーはうんざりしてしまうだろう。

 印刷の中断処理を実現する方法はさまざまであるが,今回はFig.7-60に示すFormPrintingという名前のフォームを作り,印刷中にはこれを表示して,ユーザーが[キャンセル]ボタンを押したら,印刷を取り消すという仕組みを作ってみる。

Fig.7-60 FormPrintingフォーム
fig7_60

 FormPrintingフォームは,[キャンセル]ボタン(BTN_CANCELボタン)があるだけの非常にシンプルなフォームである。本当は,ここに印刷の進捗状況を示すプログレスバー(横棒グラフ)を付けたりすると面白いのだが,処理が煩雑になるので,それは割愛させてもらう。

 ユーザーが[キャンセル]ボタンを押したときの処理は,List 7-49のように実装する。

 List 7-49では,[キャンセル]ボタンが押されたときに,グローバル変数bCancelFlagTrueにする処理をしているだけである。

 さて,[印刷]ボタンが押されたときの処理であるBTN_PRT_Clickプロシージャ(List 7-47)において,印刷まえにFig.7-60に示したFormPringingフォームを表示し,印刷が終わったらフォームを消去するような処理を付け加える(List 7-50)。

 修正した部分は28〜32行目である。DrawPreviewプロシージャを呼び出して印刷するまえに,FormPringingフォームのShowメソッドを呼び出し,FormPringingフォーム(Fig.7-60)を表示している。なお,30行目にあるように,Showメソッドの引数には0を伴い,モードレスウィンドウとして表示する。もし1を伴いモーダルウィンドウとして表示してしまうと,ユーザーがFormPringingフォームを閉じないと31行目の処理には進まない。つまり,フォームを閉じない限り印刷されないということになってしまう。

 29行目では,FormPrintingフォームのグローバル変数bCancelFlagFalseに設定している。すでにList 7-49に示したように,ユーザーがFormPrintingフォームの[キャンセル]ボタンを押したときには,グローバル変数bCancelFlagTrueに設定される。つまり,印刷処理においてFormPrintingフォームのグローバル変数bCancelFlagを調べることで,ユーザーが[キャンセル]ボタンを押したかどうかを判断できるということを意味する。

 そこで,List 7-42に示したDrawPreviewプロシージャでこのグローバル変数bCancelFlagを調べ,Trueならば,その時点で印刷処理を中止するという処理を加える(List 7-51)。

 List 7-51において追加したのは,277〜286行目である。ここでは,FormPrintingフォームのグローバル変数bCancelFlagの値を調べ,TrueであったならばKillDocメソッドを呼び出して印刷を中断し,ループから抜けるという処理をしている。

 なお,279行目にあるDoEvents関数は,一時的に制御をWindowsに委ね,キー入力やマウス操作などを可能にするために利用している。もしこの呼び出しがないと,Fig.7-60に示したFormPrintingフォームでユーザーが[キャンセル]ボタンを押すなどの操作をしても,イベント処理が実行されずにキューに溜まるだけとなる。この場合,List 7-49に示したBTN_CANCEL_Clickプロシージャが呼び出されることはなくなり,グローバル変数bCancelFlagの値も変化しない。

 一般にDoEvents関数は,時間がかかる処理の最中にユーザーのキー入力やマウス操作,メニュー操作などを調べたいときに使われる。Windowsにおいては,ユーザーのキー入力やマウス操作,メニュー操作などは,いったんキューに溜められる。Visual Basicでは,キューの内容が定期的に調べられ,その操作に対応するイベントが発生することになる。キューの内容が定期的に調べられるという処理は,プロシージャの処理の途中では発生せず,プロシージャの処理が終わってから実行される。DoEvents関数は,キューの内容を定期的に調べるという処理を強制的にVisual Basicに実行させる関数である。つまり,プロシージャの途中で適宜DoEvents関数を呼び出せば,そこでキューが調べられるため,プロシージャの処理の途中でもユーザーのキー入力やマウス操作,メニュー操作を受け付けることができるようになるのである。


One Point!DoEvents関数の呼び出しは,処理の流れを変える可能性があるので利用にあたっては注意したい。通常,プロシージャに記述した処理は,上から下に向かって実行されるわけだが,DoEvents関数を呼び出すと,その時点でイベントが発生することになるから,一時的にプロシージャ外にあるイベントに対応するプロシージャへと処理が移動することになる。つまり,処理の流れが変わるので,常に上から下に向かって実行されることを想定しているプロシージャでは誤動作を引き起こす可能性がある。
Prev 56/134 Next