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

7.7.8 明細処理
●明細の印刷

○階層フレキシブルグリッドコントロールの内容をプリンタに出力する
 フレームを印刷する処理を実装したところで,いよいよプレビュー画面を描画するDrawPreview2プロシージャを実装する。ここでは,List 7-175のように実装することにする。

 List 7-175で示したDrawPreview2プロシージャは,すでに「7.4.7 顧客の印刷処理」で実装したDrawPreviewプロシージャ(List 7-42)の階層フレキシブルグリッドコントロール版に相当する。そのため,ほとんどの処理はDrawPreviewプロシージャと同じである。以下,簡単にその処理を説明する。

余白情報の取得と印刷ページ数の取得
 26〜65行目の処理は,FormPrintPreviewフォーム(Fig.7-45)のTXT_UPテキストボックス,TXT_DOWNテキストボックス,TXT_LEFTテキストボックス,TXT_RIGHTテキストボックスから,それぞれ上余白,下余白,左余白,右余白を取得する処理となる。そして,続く70〜76行目では,表示(印刷)すべきページ番号を判定している。ここでは,プレビュー時であれば表示ページ内,印刷時であればユーザーが選択した印刷ページ範囲内に含まれていたら,drawFlag変数をTrueに設定し,含まれていなければFalseに設定するという処理をしている。drawFlag変数は,後続の処理において描画するか否かを指定する変数として用いる。これらの処理は,DrawPreviewプロシージャとまったく同じである。
 
列幅の計算
 78〜99行目の処理は,階層フレキシブルグリッドコントロールの列幅を調べ,印刷するときに横幅を「用紙横幅−左右余白」だけいっぱいに広げるよう,拡大率を計算する箇所である。基本的な処理はDrawPreviewプロシージャと同じであるが,93行目にあるように,階層フレキシブルグリッドコントロールで列幅を取得するためにはcolWidth(列番号)プロパティを用いる。また,79行目にあるように,階層フレキシブルグリッドコントロールが保持する列数を取得するためには,Colsプロパティを用いる。
 
フレームの印刷
 108〜111行目は,印刷するページが先頭ページであったならば,伝票の取引先や納入先などのラベルやテキストボックスを含むフレームを印刷する処理となる。ここでは,110行目にあるように先に実装しておいたDrawFrameプロシージャ(List 7-174)を使うことで,フレームを描画している。

 
各列の描画
 119〜274行目のForNextループは,階層フレキシブルグリッドコントロールの各行を描画するという処理になっている。119行目にあるように,ここではループ範囲をFixedRowsプロパティから「Rowsプロパティ−1」までの範囲とした。FixedRowsプロパティは,階層フレキシブルグリッドコントロールの見出し行の行数を保持するプロパティである。また,Rowsプロパティは,階層フレキシブルグリッドコントロールが保持する行数を保持するプロパティである。つまり,このループ設定によって,見出し行を含まないすべての行が,先頭から順にループ処理されることになる。
 127〜180行目は,ページの先頭であったときに見出し行を描画する処理になっている。ここではまず,146〜152行目の処理により,見出し行と同じフォントを描画対象となっているオブジェクト(ピクチャボックスもしくはPrinterオブジェクト)に設定している。146〜152行目で示したように,見出し行のフォントはFontFixedプロパティによって取得することができる。
 154〜178行目のループは,見出し行を1つずつループ処理し,描画している箇所である。159行目では,DrawBoxプロシージャ(List 7-42)を呼び出し,セルの内容を描画している。159行目にもあるように,各セルに格納されているテキストは,TextMetrix(列番号, 行番号)プロパティで取得することができる。ちなみに,TextMetrixプロパティは,読み取りだけでなく設定もできる。つまり,TextMetrixプロパティに文字列を設定すれば,任意の場所にあるセルの文字列を変更することもできる。
 なお,DrawBoxプロシージャの最後の引数でAlignConvという配列を用い,値を変換している点について補足説明をしておく。DrawBoxプロシージャの最後の引数は,描画時の揃えを指定するものであり,Table 7-15で示したとおり,dbgGeneral(文字ならば左揃え,数値ならば右揃え),dbgLeft(左揃え),dbgRight(右揃え),dbgCenter(センタリング)のいずれかの値のなかから1つを選択するように実装されている。しかし,階層フレキシブルグリッドコントロールの場合には,すでにTable 7-39で示したように,9種類もの揃えを設定することができる。そのため,DrawBoxプロシージャを流用して描画するには,Table 7-39の定数を,Table 7-15の定数へと変換する必要がある。この変換を実現するために導入したのが,AlignConv配列である。AlignConv配列は,24行目で初期化されており,Table 7-39に示した定数からTable 7-15に示した定数への変換を担当する。わざわざこのような変換をしなくても,DrawBoxプロシージャを改良し,Table 7-39に示したすべての定数を受け入れられるようにしてもよかったのだが,比較的手間がかかるため,今回はこのようなマッピング方式で誤魔化すことにした。
 さて,193〜213行目の処理は,階層フレキシブルグリッドコントロールの各行の値を描画する部分である。この処理は,154〜178行目にある見出しの描画処理とほぼ同じ内容だが,198〜203行目にあるフォントの設定部分がやや異なっている。すでにTable 7-40でも少し説明したが,セルのフォントや色などの設定は,アクティブセルが対象となる。そこでまず,121行目ではrowプロパティを,195行目ではcolプロパティを,それぞれ設定し,描画の対象となるセルをアクティブセルにしている。そして,198〜203行目では,CellFontNameCellFontBoldCellFontItalicCellFontSizeCellFontStrikeThroughCellFontUnderlineという各プロパティを用いて,カレントセルのフォント設定情報を取得し,それを描画対象となっているオブジェクト(ピクチャボックスまたはPrinterオブジェクト)のフォントとして設定している。

 以上で説明したように,処理そのものはデータグリッドコントロールの描画をサポートしたDrawPreviewプロシージャ(List 7-42)と大差ない。階層フレキシブルグリッドコントロールを用いた場合,TextMetrix(列番号, 行番号)プロパティで任意のセルの文字列を取得できることから,むしろデータグリッドコントロールよりも扱いやすいかもしれない。

Prev 118/134 Next