この特集のトップページへ
>
Chapter 7:プレゼンテーション層の構築
7.7.8 明細処理
●明細処理フォームを開く
さて,InitDataプロシージャの86行目ではRefreshDataプロシージャを呼び出している。このRefreshDataプロシージャこそが,伝票の明細情報を階層フレキシブルグリッドコントロールに送り込むという役割を果たすルーチンである。RefreshDataプロシージャは,List 7-148のように実装する。
List 7-148に示したRefreshDataプロシージャは,Business.SlipコンポーネントのGetSlipDetailsメソッド(List 6-131)を呼び出し,伝票の明細を含むADODB.Recordsetオブジェクトを取得したのち,それをFLXGrid_SlipDetail階層フレキシブルグリッドに格納している。List 7-148を実装することにより,FLXGrid_SlipDetail階層フレキシブルグリッドには,Fig.7-94に示すようなレイアウトで明細を表示することができる。
Fig.7-94 FLXGrid_SlipDetail階層フレキシブルグリッドの表示例

階層フレキシブルグリッドコントロールの使い方を含め,以下ではその処理手順を説明する。
- (1)明細を取得する
-
16〜18行目において,Business.SlipコンポーネントのGetSlipDetailsメソッド(List 6-131)を呼び出し,伝票に付随する明細を含むADODB.Recordsetオブジェクトを取得する。取得したADODB.Recordsetオブジェクトは,あとで使うことができるようにするため,グローバル変数g_objRecに保存するようにした。
- (2)階層フレキシブルグリッドコントロールの初期化
-
20〜27行目は,FLXGrid_SlipDetail階層フレキシブルグリッドを初期化する部分である。21行目ではColsプロパティ(列数)を5に,22行目ではRowsプロパティ(行数)を0に,それぞれ初期化することで,FLXGrid_SlipDetail階層フレキシブルグリッドを5列0行として構成している。5列0行としたのは,FLXGrid_SlipDetail階層フレキシブルグリッドに左から順に「製品名」「数量」「単価」「価格」「摘要」という5つの項目を表示する予定であるからである。
23行目と24行目では,階層フレキシブルグリッドの固定行(見出しとなる行)を設定している。ここでは,FixedColsプロパティ(固定列の列数)とFixedRowsプロパティ(固定行の行数) をともに0とし,見出しはないものとして設定した。ただし実際には,後述の69行目で見出し行を設定し直す。ここでは単に,初期化処理だけを実行しているにすぎない。
26行目で呼び出されているClearメソッドは,階層フレキシブルグリッドコントロールの全セルをクリアする働きを持つ。Clearメソッドを呼び出すことにより,全セルの内容が初期化される。ただし,Clearメソッドはセルを初期化するだけであり,セルを削除するわけではない。つまり,ColsプロパティやRowsプロパティで設定した列数と行数には変化がない。
- (3)列見出しの設定
-
35行目は,列の見出しを設定する箇所である。いい換えれば,FLXGrid_SlipDetail階層フレキシブルグリッドに1行を追加する処理でもある。階層フレキシブルグリッドコントロールに行を追加する場合には,35行目にあるとおり,AddItemメソッドを呼び出す。AddItemメソッドの引数には,行に加えたい列の値をタブ区切り(Visual Basicにおいてタブ記号はvbTab定数(値はChr(9))で示される)で指定する。この35行目が実行されることにより,左から順に「製品名」「数量」「単価」「価格」「摘要」という列で構成された1行が追加され,FLXGrid_SlipDetail階層フレキシブルグリッドの行数(Colsプロパティの値)が1つ増えるということになる。
- (4)列の揃えの設定
-
37〜41行目の処理は,各列の揃えを指定するための処理である。37〜41行目にあるように,階層フレキシブルグリッドコントロールの各列の揃えは,“ColAlignment(列番号)”で示されるプロパティに設定する。値としては,Table 7-39に示すいずれかの値を指定することができる。今回は,ColAlignmentプロパティを使って列全体の揃えを指定したが,CellAlignmentプロパティを使えば,各セルごとに独立して揃えを設定することもできる。詳細はVisual Basicのリファレンスを参照してほしい。
- (5)明細の追加
-
46〜60行目は,18行目で取得した明細情報を含むADODB.Recordsetオブジェクトを読み込んで,その明細情報をFLXGrid_SlipDetail階層フレキシブルグリッドに行として追加する処理である。実際に行を追加しているのは,47行目で呼び出されているAddItemメソッドである。
48行目のRowDataプロパティにg_objRec.Fields("ID").Valueを設定しているのは,その行がどの明細番号を指すのかを記憶しておくための処理である。階層フレキシブルグリッドでは,RowData(行番号)プロパティを使うことで行に対して,ColData(列番号)プロパティを使うことで列に対して,それぞれ任意の値を保存しておくことができる。この機能は,ちょうどリストボックスコントロールやコンボボックスコントロールにおけるItemDataプロパティのようなもので,行や列を識別する値を格納しておくのに便利である。今回は,RowDataプロパティに明細番号を格納しておくことで,あとからユーザーが任意の行を選択したときに,その行がADODB.Recordsetオブジェクト上のどのレコードに対応するのかを調べるのに用いる。その処理の詳細は,「○アクティブセルの移動に合わせカレント行を移動する」にて説明する。
49〜57行目は,明細の状態が削除ずみであったならば,その行に取り消し線を引いて表示する処理である。取り消し線を引くためには,セルのCellFontStrikeThroughプロパティの値をTrueにする。このとき,階層データグリッドコントロールで選択対象になっているセルに対して取り消し線が引かれる(厳密には,フォントに対して取り消し線が有効になるため,セルの内容が空である場合には,取り消し線は引かれない)ということになる。
選択対象となるセルを設定するには,colプロパティ,rowプロパティ,ColSelプロパティ,RowSelプロパティを用いる。colプロパティとrowプロパティは,その時点で選択されているセルの位置を示すプロパティである(ともに0からカウントされる。つまり,1列目はcolプロパティの値が0に,1行目はrowプロパティの値が0に,それぞれ対応する)。 このcolプロパティとrowプロパティで示されるセルのことを,「アクティブセル」と呼ぶ。階層フレキシブルグリッドコントロールでは,座標を指定しないで操作するほとんどのプロパティは,アクティブセルに対する操作となる。
51行目と52行目では,colプロパティを0に,rowプロパティをcrow変数の値に,それぞれ設定している。プログラムを見るとわかるが,crow変数は「追加した行の行番号から1を引いた値」を指すようにループ内で増加させている。つまり,51行目と52行目の処理により,アクティブセルは追加した行の一番左の列(1列目)を指すようになる。
ColSelプロパティとRowSelプロパティは,セルの範囲を設定するための変数である。colプロパティ,rowプロパティに何か有効な値を設定したのち,ColSelプロパティに列番号を,RowSelプロパティに行番号を,それぞれ格納すると,アクティブセルを始点とし,ColSelプロパティとRowSelプロパティで指定したセルの場所を終点とする四角形全体が「選択されたセル」となる(Fig.7-95)。これはつまり,矩形選択を実現しているということである。なお,このとき必ずcolプロパティとrowプロパティを設定したのちに,ColSelプロパティとRowSelプロパティを設定しなければならないという点に注意してほしい。というのは,colプロパティやrowプロパティを設定すると,ColSelプロパティの値はcolプロパティの値に,RowSelプロパティの値はrowプロパティの値に,それぞれ再設定されてしまうからである。
55行目では,FillStyleプロパティの値を設定している。このプロパティは,指定された操作(この場合,56行目のCellFontStrikeThroughプロパティの操作を指す)をどのセルに対して実行するのかを設定するものである。FillStyleプロパティは,flexFillSingleかflexFillRepeatという,いずれかの定数をとることができる。flexFillSingle定数が設定されたときには,アクティブなセルのみを操作の対象とし,flexFillRepeat定数が設定されたときには,選択されているセル――つまり,セル(colプロパティ,rowプロパティ)とセル(ColSelプロパティ,RowSelプロパティ)で短形選択されるすべてのセル――を操作の対象とする。55行目では,flexFillRepeat定数を指定し,選択されているすべてのセルを対象としているから,56行目のCellFontStrikeThroughプロパティの設定は,51〜54行目で設定したセル範囲のすべて,つまり追加した行全体を示すことになる。結果として,追加した行のすべてに取り消し線が引かれる。
ここでは取り消し線だけを設定したが,それ以外にもTable 7-40に示す各プロパティを使うことで,フォントの色や大きさ,セルの背景色などを変更することができる。Table 7-40で示したプロパティを操作するときの対象となるのは,CellFontStrikeThroughプロパティと同様に,FillStyleプロパティの値によって選択されたアクティブセル,または選択されているセルのいずれかとなる。各プロパティの詳細については,Visual Basicのリファレンスを参照してほしい。
- (6)小計,消費税,合計の行追加
-
62〜66行目の処理は,小計,消費税,合計を,それぞれFLXGrid_SlipDetail階層フレキシブルグリッドに追加するという処理になる。小計,消費税,合計を取得するには,63行目にあるように,Business.SlipコンポーネントのGetSlipメソッド(List 6-112)を用いた。
- (7)列見出しの固定
- 69行目では,FixedRowsプロパティを1に設定し,1行分を見出し行として設定している。1行分とは何かといえば,35行目で追加した「製品名」「数量」「単価」「価格」「摘要」という列を含む見出し行のことである。
処理はかなり長く,またわかりにくいものとなっているが,階層フレキシブルグリッドコントロールを使うときの基本をまとめると,次のようになる。
- Colsプロパティ,Rowsプロパティを使って,セルの数を決める
-
ColsプロパティとRowsプロパティを使って,列数と行数をそれぞれ決定する。ただし,ColsプロパティとRowsプロパティの値は固定ではなく,あとから行を追加してゆけば自動的に増える。たとえば,AddItemメソッドを使って行を追加したときには,Rowsプロパティの値は1増える。また,AddItemメソッドを使って行を追加するときには,引数に指定されたタブの数に応じて,列数がColsプロパティで設定された列数を上回ることもあるが,その場合にはColsプロパティのほうが増加され,列も自動的に増える。
- 見出し列,見出し行
-
見出し列の列数と見出し行の行数は,それぞれFixedColsプロパティとFixedRowsプロパティで設定する。当然,FixedColsプロパティの値はColsプロパティの値を超えてはならず,またFiexedRowsプロパティRowsプロパティの値を超えてはならない。
- AddItemメソッドを使って行を追加する
-
行を追加するには,AddItemメソッドを用いる。このとき,AddItemメソッドの引数に列項目をタブ区切り形式で指定する。ちなみに,RemoveItemメソッドを用いると任意の行を削除することもできる。
- アクティブセル
-
アクティブセルは,colプロパティとrowプロパティで設定する。アクティブセルは,ユーザーが階層フレキシブルグリッドコントロールで選択したセルでもある。colプロパティとrowプロパティをプログラム側で参照すれば,ユーザーがその時点でどのセルを選択しているのかを知ることができる。
- 範囲選択
- 範囲選択するには,colプロパティとrowプロパティに加え,colSelプロパティとrowSelプロパティを用いる。セル(colプロパティ,rowプロパティ)とセル(colSelプロパティ, rowSelプロパティ)で囲まれる短形範囲が選択されることになる。これは,ユーザーがマウスなどで選択した範囲でもあり,colプロパティ,rowプロパティ,colSelプロパティ,rowSelプロパティをプログラム側で参照すれば,ユーザーがその時点でどの範囲を選択しているのかを知ることができる。なお,ユーザーが範囲選択していないときには,colSelプロパティの値はcolプロパティの値に,rowSelプロパティはrowプロパティの値に設定される。
なお,今回はADODB.Recordsetオブジェクトの各レコードを読み取って,その値を階層フレキシブルグリッドコントロールのセルの値として設定しているわけだが,階層フレキシブルグリッドコントロールにADODB.Recordsetオブジェクトを直接結び付けてしまうこともできる。その場合には,階層フレキシブルグリッドコントロールのDataSourceプロパティに,結び付けたいADODB.Recordsetオブジェクトを設定する。
しかしその場合,各セルの表示内容は,階層フレキシブルグリッドコントロールの内部ルーチンで自動的に処理された結果となる。そのため,プログラミングの手間は省けるものの,各セルの表示形式を変更するといった融通は利かない。今回のサンプルでは,階層フレキシブルグリッドコントロールの下3行に,「小計」「消費税」「合計」という行を描画しているが,ADODB.Recordsetオブジェクトと結び付けた場合には,このような細工はできない。ADODB.Recordsetオブジェクトと結び付けた場合には,表示内容がADODB.Recordsetオブジェクトで保持される内容とまったく同一になってしまうからである。
ADODB.Recordsetオブジェクトの全データを表形式で表示したいという場合には,DataSourceプロパティを使い,ADODB.Recordsetオブジェクトを割り当てるという手法は有効である。しかし,レイアウトの自由度は失われるため,複雑なレイアウトで描画できなくなると考えたほうがよい。
Table 7-39 階層データグリッドコントロールの揃えを設定する定数
| 定数 | 値 | 内容 |
|---|---|---|
| flexAlignLeftTop | 0 | 左上に配置 |
| flexAlignLeftCenter | 1 | 左中央に配置 |
| flexAlignLeftBottom | 2 | 左下に配置 |
| flexAlignCenterTop | 3 | 中央上に配置 |
| flexAlignCenterCenter | 4 | 中央に配置 |
| flexAlignCenterBottom | 5 | 中央下に配置 |
| flexAlignRightTop | 6 | 右上に配置 |
| flexAlignRightCenter | 7 | 右中央に配置 |
| flexAlignRightBottom | 8 | 右下に配置 |
| flexAlignGeneral | 9 | デフォルト。文字列は左中央,数値は右中央に配置 |
Fig.7-95 セルの選択

Table 7-40 セルの設定を変更する主なプロパティ
| プロパティ | 解説 |
|---|---|
| CellBackColor | セルの背景色 |
| CellForeColor | セルの前面色 |
| CellFontBold | 太字にするかどうか |
| CellFontItalic | 斜体にするかどうか |
| CellFontName | フォント名 |
| CellFontSize | フォントサイズ |
| CellFontStrikeThrough | 取り消し線表示するかどうか |
| CellFontUnderline | 下線を引くかどうか |
| CellFontWidth | フォントの幅 |
| CellHeight | セルの高さ |
| CellLeft | セルのX座標 |
| CellTop | セルのY座標 |
| CellWidth | セルの幅 |
| CellPicture | セルに配置する画像 |
| CellPictureAlignment | 配置する画像の揃え |
| CellTextStyle | テキストを立体表示するかどうか |
| COLUMN 書式文字列の設定 | ||
|
List 7-148の47行目では,各セルの文字書式を設定するため,Format関数を利用している。Format関数を用いると,数値を3桁ごとにカンマで区切ったり,日付や時刻の表示方式などを柔軟に設定したりすることができる。 しかし,Visual Basicのリファレンスを見ても,Format関数の書式設定文字列(第2引数に渡す文字列)は非常に難解である。もし簡単に書式設定文字列を調べたいのであれば,Visual Basicのプロパティページを使うという手がある。 まずは,ラベルやテキストボックスなど,ダミーのコントロールをフォーム上に配置する。ほとんどのコントロールには,DataFormatというプロパティがあるので,[...]ボタンを押す(Fig.7-96)。すると,Fig.7-97に示すプロパティページが表示され,任意の書式を選択できるようになる。このとき,プロパティページの左下に「Format$:」という項目が表示される。この文字列こそが,Format関数の書式設定文字列として使う文字列である。つまり,この欄を参照すれば,日付や数値など,比較的複雑な表示形式の書式設定文字列も,容易にわかるというわけである。 Fig.7-96 適当なコントロールのDataFormatプロパティを開く
Fig.7-97 DataFormatのプロパティページ
|
| 111/134 |


