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

7.4.7 顧客情報の印刷処理
●印刷処理
 いよいよ,残す部分は[印刷]ボタン(BTN_PRTボタン)を押したときの処理のみとなった。すでにDrawPreviewプロシージャ(List 7-42)では,第1引数にPrinterオブジェクトを渡せばプリンタに出力されるように作ってある。よって,印刷処理をするのはさほど難しいことではない。たとえば,全ページを印刷するのであれば,次のようにDrawPreviewプロシージャを呼び出せばよい。

DrawPreview Printer, 1, g_MaxPage

 しかし,いつも全ページをユーザーが出力したいとは限らない。一部のページしか出力したくないかもしれない。そこで,[印刷]ボタンが押されたときには,Fig.7-58に示すウィンドウを表示し,何ページから何ページまでを印刷するのかをまず問い合わせることにする。

Fig.7-58 印刷範囲の問い合わせ
fig7_58

 Fig.7-58に示したウィンドウは,FormPageSettingという名前のフォームとし,Fig.7-59のように各コンポーネントを配置するものとする。なお,UPDOWN_FROMアップダウンコントロールはTXT_FROMテキストボックスと,UPDOWN_TOアップダウンコントロールはTXT_TOテキストボックスと,それぞれ連携するようBuddyControlプロパティとBuddyPropertyプロパティで設定するものとする。その設定については「○表示ページ設定部分」や実際のソースファイルを参照してほしい。

Fig.7-59 FormPageSettingフォーム
fig7_59

 Fig.7-58において,ユーザーが[すべてのページ]を選択したときには,次のようにDrawPreviewプロシージャを呼び出して全ページを印刷する。

DrawPreview Printer, 1, g_MaxPage

 そうではなく,[以下のページのみ]を選択したときには,TXT_FROMテキストボックスで指定されたページからTXT_TOテキストボックスで指定されたページまで出力するよう,次のようにDrawPreviewプロシージャを呼び出して印刷する。

DrawPreview Printer, TXT_FROM.Value, TXT_TO.Value

 このような機能を実現するために,FormPageSettingフォームに,GetPageプロシージャ(List 7-46)と,[OK]ボタンを押したときの処理であるBTN_OK_Clickプロシージャ,[キャンセル]ボタンを押したときの処理であるBTN_CALCEL_Clickプロシージャを実装する。

 FormPrintPewviewフォーム(Fig.7-45を参照)において,ユーザーが[印刷]ボタン(BTN_PRTボタン)を押したときには,GetPageプロシージャを呼び出し,ユーザーに対してどのページを出力するのかを問い合わせてから印刷する。実際に[印刷]ボタンを押したときの処理を記述すると,List 7-47のようになる。

 List 7-47では,まず6行目で自分自身を閉じ,12行目でList 7-46に示したGetPageプロシージャを呼び出す。すぐあとに説明するように,GetPageプロシージャを呼び出すとFig.7-58で示したウィンドウが表示され,ユーザーに印刷範囲を問い合わせる。ユーザーが入力した印刷範囲は,それぞれ次の引数に格納されて戻ってくる。

  • 第1引数
    開始ページ番号

  • 第2引数
    終了ページ番号

  • 第3引数
    ユーザーが[すべて印刷]を選択したときにはTrue,そうでなければFalse

 また,GetPageプロシージャは,ユーザーが[OK]ボタンを押してFig.7-58に示したウィンドウを閉じたならばTrueを,そうでなければFalseを返すようにしてある。そこで,12行目でGetPageプロシージャの戻り値がTrueであるかどうかを確かめ(つまり[OK]ボタンが押されたかどうかを調べ),そうであれば13〜28行目を実行し,印刷処理をする。

 実際に印刷している箇所は,27〜28行目である。まず27行目でPrinterオブジェクトのScaleModeプロパティをvbTwipsに設定し,Printerオブジェクトの単位をTwip単位に変更する。そして,DrawPreviewプロシージャにPrinterオブジェクトを渡すことで,Printerオブジェクトに対して描画する。すなわち,印刷が実行されることになる。

 では次に,簡単にList 7-46GetPageプロシージャの処理について説明しておく。GetPageプロシージャは,Fig.7-58のウィンドウを表示してユーザーに印刷範囲を問い合わせるというものである。

 GetPageプロシージャでは,まずList 7-46の17〜24行目にあるように,各種テキストボックスやラジオボタンなどの初期値,入力できる最大値などを設定する。そして,25行目でbButton変数をFalseにしてから,26行目で引数1を指定してMeオブジェクト(自分自身)のShowメソッドを呼び出すことで,自分自身をモーダルウィンドウ表示とする。これにより,FormPageSettingフォームはユーザーに表示される。


One Point! モーダルウィンドウから,さらに別のモーダルウィンドウを開くことはできない。List 7-47の6行目において,GetPageプロシージャを呼び出すまえに自分自身を閉じているのは,その問題を避けるためである。FormPrintPreviewフォームは,モーダルウィンドウとして表示されているので,それを表示したままFormPageSettingフォームをモーダルウィンドウとして開くことができないのである。

 bButton変数は,ユーザーが[OK]ボタンを押したかどうかを調べるのに使う変数で,ユーザーが[OK]ボタンを押したときにはbButton変数をTrueに設定する。

 さて,26行目で引数1を伴ってShowメソッドが実行されると,モーダルウィンドウとして表示されるので,27行目以下は,このウィンドウが閉じるまで実行されない。

 ユーザーが[キャンセル]ボタンを押したときの処理は41〜45行目に記した。このときには,bButton変数をFalseに設定し,Hideメソッドを使って自分自身を閉じるようにしてある。よって,ユーザーが[キャンセル]ボタンを押すと,自分自身が閉ざされるので,27行目以下の処理に進むことになる。

 また,[OK]ボタンを押したときの処理は,47〜60行目に示した。ここでは,TXT_FROMテキストボックスとTXT_TOテキストボックスに入力された文字が数値であるかどうかを確かめ,数値であったならばbButton変数をTrueにしてから,Hideメソッドを使って自分自身を閉じるようにしてある。よって,ユーザーが[OK]ボタンを押すと,自分自身が閉ざされるので,27行目以下の処理に進むことになる。

 このように,27行目以下の処理が実行されるのは,フォームが閉ざされたあとということになる。27行目以下では,28〜36行目でユーザーが[すべて印刷](OPT_ALLラジオボタン)を選択していたら,bAll引数(第3引数)をTrueに設定し,そうでなければbAll引数をFalseに,またfromPage引数(第1引数)をTXT_FROMテキストボックスに入力された値に,toPage引数(第2引数)をTXT_TOテキストボックスに入力された値に,それぞれ設定している。

 そして最後に,38行目で戻り値としてbButton変数の内容を設定したあと,プロシージャを終了するようになっている。bButton変数の内容は,[OK]ボタンを押したときにTrueにするようにしてある(58行目)。よって,このGetPageプロシージャは,ユーザーが[OK]ボタンを押したときには戻り値がTrueになり,そうでなければ戻り値がFalseになるということになる。


One Point! 以上の説明では,26行目でShowメソッドを呼び出してモーダルウィンドウ表示としているため,ユーザーが[OK]ボタンか[キャンセル]ボタンを押したときにしか27行目以降の処理は実行されず,GetPageプロシージャから戻らないように見受けられるが,実際はそうではない。ユーザーがウィンドウのタイトルバーに表示されている閉じるボタン([×]のボタン)を押したときには,ウィンドウが閉ざされるから,27行目以下の処理に進むことになる。よって,その場合にもGetPageプロシージャは終了する。

 ところで,Fig.7-58においてユーザーが[すべてのページ]を選択したときには,下の開始ページと終了ページを入力するテキストボックス(TXT_FROMボックスとTXT_TOテキストボックス)は,淡色表示にして入力できないようにしたほうが,Windowsのユーザーインタフェースとして望ましい。そこで,OPT_ALL_Clickプロシージャ(OPT_ALLラジオボタンが押されたときの処理)とOPT_SELECT_Clickプロシージャ(OPT_SELECTラジオボタンが押されたときの処理)を,List 7-48のように実装しておく。

Prev 55/134 Next