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

7.4.7 顧客情報の印刷処理
●プレビュー処理

・余白の取得
 まず,168〜204行目では余白を取得している。Fig.7-45で示したように,余白はTXT_UPテキストボックス,TXT_DOWNテキストボックス,TXT_LEFTテキストボックス,TXT_RIGHTテキストボックスを使ってユーザーが設定する。そこでまず,上余白,下余白,左余白,右余白をそれぞれ,これらのテキストボックスから取得し,変数MUpMDownMLeftMRightに格納する。その処理をしているのが168〜199行目である。ユーザーがテキストボックスに数値以外の値を入力する可能性もあるため,168〜199行目ではIsNumeric関数を使って入力された文字が数値でなければエラーメッセージを表示するという処理もしている。なお,今回は余白の数値範囲によるエラー処理はしていないが,必要であれば,余白は負にならないとか,用紙サイズよりも大きな値は指定できない,といったエラー処理を実装してもよいだろう。

 203〜207行目は,数値の単位をミリメートルからTwip単位に変換しているところである。ユーザーは,テキストボックスでミリメートル単位の数値を入力するわけだが,すでに説明したようにPicDocピクチャボックスの単位はTwip単位に設定してある(「○FormPrintPreviewフォームが表示されようとしているときの処理」を参照)。よって,ミリメートル単位で設定された余白の値をそのまま使うわけにはゆかず,Twip単位に変換する必要がある(プリンタへの出力時にはPicDocピクチャボックスではなくPrinterオブジェクトに出力するわけだが,そのときには事前にPrinterオブジェクトのScaleModeプロパティをvbTwipsに設定し,強制的にTipw単位に合わせるものとする。詳細は,「●印刷処理」で説明する)。

 203〜207行目にもあるように,単位を変換するには,ScaleXメソッドとScaleYメソッドを用いる。ScaleXメソッドは横方向(X軸方向)で単位変換するメソッド,ScaleYメソッドは縦方向(Y軸方向)で単位変換するメソッドである。基本的には横方向と縦方向の単位は同じであるが,設定によって横方向と縦方向の単位設定を変更することもできる。そのため,Visual BasicではScaleXメソッドとScaleYメソッドの2つのメソッドを用意している(たとえば,プリンタのなかには縦方向と横方向の解像度が異なるものもある)。

ScaleX(変換したい値, 変換まえの単位, 変換後の単位)
ScaleY(変換したい値, 変換まえの単位, 変換後の単位)

 変換まえの単位変換後の単位には,Table 7-14に示したいずれかの定数を指定する。たとえば,204行目では,次のようにしてMUp変数の内容をミリメートル単位からTwip単位に変換している。

MUp = objPic.ScaleY(MUp, vbMilimeters, vbTwips)

 なお,ミリメートル単位からTwip単位など,あらかじめ決まっている単位で変換する場合には,ScaleXプロパティやScaleYプロパティを使わずに直接計算してしまってもよい。Twip単位では1インチ(正確には1論理インチ)が1440twipであり,1インチは25.4ミリメートルである。つまり,1ミリメートル=1440÷25.4≒56.692twipとなる。よってScaleXメソッドやScaleYメソッドを使わずに次のように書いてもよい。

MUp = MUp * 56.692

 しかし,わかりやすくするためにも,ScaleXメソッドやScaleYメソッドを使ったほうがよいだろう。

・データグリッドが指し示すADODB.Recordsetオブジェクトの取得
 209行目では,データグリッドコントロールが指し示すADODB.RecordsetオブジェクトをobjRec変数に代入している。すでに「●印刷プレビューフォームを表示するまでの処理」で説明したように,SetTitleプロシージャ(List 7-36)の引数として受け取った印刷対象のデータグリッドコントロールは,グローバル変数g_DGridに格納するようにしてある。209行目ではグローバル変数g_DGridが指すデータグリッドコントロールのDataSourceプロパティを参照し,それをobjRec変数に格納している。

 DataSourceプロパティには,データグリッドコントロールが表示しているADODB.Recordsetオブジェクトが格納されている。そのため,objRec変数はデータグリッドコントロールが指し示しているADODB.Recordsetオブジェクトを指すようになる。よって,以降の処理ではobjRec変数を通じてADODB.Recordsetオブジェクトに格納されている各行を取得することができるようになる。


One Point! ただし,データグリッドコントロールにADOデータコントロール(ADODCコントロール)を結び付けたときには,DataSourceプロパティはADODB.Recordsetオブジェクトではなく,ADOデータコントロールを指す。
Prev 48/134 Next