この特集のトップページへ
>
Chapter 7:プレゼンテーション層の構築
7.7.8 明細処理
●明細の印刷
DrawPreview2プロシージャを実装するまえに,まずは,フレーム上に配置されたラベルやテキストボックスなどをプリンタに出力するところから実装してゆく。ここでは,List 7-174に示すDrawFrameというプロシージャを用意する。DrawFrameプロシージャは,引数として順に,描画対象となるオブジェクト(プレビュー画面のピクチャボックスもしくはPrinterオブジェクト),描画するフレーム,上余白,左余白,下余白,右余白,描画するかどうかのフラグ(Trueであれば描画するFalseであれば描画しない)をとり,描画対象となるオブジェクトの幅から左右余白を引いたものだけを引き延ばしてフレームを描画するという機能を持つ。
フレームの内容をそのままプリンタに印刷するのは厄介なのではないか,と思われるかもしれない。しかし,印刷すべきものをラベルやテキストボックスなどに絞ってしまえば,さほど難しいことはない。
List 7-174は,全体としてフレーム上に配置されているコントロールを列挙するループとなっている。そのループが,18〜56行目のFor Each〜Nextである。とはいえ,フレーム上に配置されているコントロールを列挙する方法は,Visual Basicには用意されていない。用意されているのは,フォームに配置されているコントロールを列挙する方法だけである。フォームに配置されているコントロールを列挙するには,そのフォームに対してFor Eachループ処理をすればよい。そこで18行目では,描画対象となるフレームオブジェクトを指すobjFrame変数のParentプロパティに対して列挙している。この処理は,objFrame変数が指すフレームオブジェクトの親となっているフォームに対する列挙処理となる。この処理によって見つかったコントロールが,objChild変数に格納される。そして,19行目で列挙して見つかったobjChild変数が指すコントロールの親が,objFrame変数で示されているフレームであるかどうかを調べることにより,間接的にフレーム上に配置されているコントロールを列挙しているのである。いい換えれば,この処理は,フレームの親となるフォームが含む全コントロールを列挙し(これが18行目の処理),見つかったコントロールのうち親がフレームになっているものだけを描画の対象とする(これが19行目の処理)という処理をしているということになる。
18行目と19行目では,objFrame変数が指すフレームの親がフォームであることを前提としている。そのため,フレームの親が別のフレームであるといった入れ子構造になっている場合,このループは正しく動作しない。
さて,20〜54行目は,列挙して見つかったコントロールを描画する処理となっている。ここでは,TypeName関数を用いて見つかったコントロールが,どのような種類であるかを判定している。TypeName関数は,コントロール名を文字列として返すものである。コントロール名の文字列とは,Visual Basicの統合環境においてプロパティページの一番上に空白で区切られて表示されている文字列のことである(Fig.7-100)。
Fig.7-100 コントロール名の文字列

20〜54行目においては,TypeName関数を使い,どのようなコントロールなのかを調べている。21〜32行目はラベルであったときの処理,35〜46行目はテキストボックスであったときの処理,49〜53行目はラインであったときの処理となっている。ここで,ラベルであったときにはmyPrintプロシージャを呼び出してラベルの文字列を,テキストボックスであったときにはDrawBoxプロシージャを呼び出してテキストボックス内の文字列を,ラインであったときにはmyLineプロシージャを呼び出して線を,それぞれ描画するという処理をしている(各プロシージャは,すべてList 7-42にて実装ずみである)。
| 117/134 |
