この特集のトップページへ
>
Chapter 7:プレゼンテーション層の構築
7.7.8 明細処理
伝票そのものに対する処理を実装したところで,次に伝票に付随する明細に関わる処理を実装してゆく。
本節の冒頭でも説明したように,伝票管理処理においては,伝票情報ウィンドウ(Fig.7-77)と明細情報ウィンドウ(Fig.7-78)を連動させる。このうち前者のウィンドウは,すでにFormSlipフォーム(Fig.7-86)として実装したことになる。
そこで,明細処理を実装するにあたり,まずは明細情報ウィンドウをフォームとして作成する。明細情報ウィンドウは,FormSlipDetailという名前のフォームとして実装し,Fig.7-92のように各コンポーネントを配置することにする。なお,FormSlipDetailフォームは,MDI子ウィンドウではなく,通常のフォームとして実装するものとする。
Fig.7-92 FormSlipDetailフォームの画面構成
FormSlipDetailフォームは,いままで実装してきた顧客情報を表示するFormCustomerフォーム(Fig.7-16)や製品管理処理に使ったFormProductフォーム(Fig.7-67)とは少々異なる。大きな違いは,データベースのデータ一覧を表示するのに,データグリッドコントロール(DataGridコントロール)ではなく,階層フレキシブルグリッドコントロール(MSHFlexGridコントロール)を使ったという点である。Fig.7-92の画面下部に配置されているFLXGrid_SlipDetailという名前のコントロールが,階層フレキシブルグリッドコントロールである。
本節の冒頭で説明したように,データグリッドコントロールでは,データグリッドの各セルに対して個別に書式を設定することができない。そのため,より柔軟にセルの書式を設定できる,階層フレキシブルグリッドコントロールを使うようにした。
階層フレキシブルグリッドコントロールは,データグリッドコントロールに比べ,次の点において有利である。
- 各セルに任意のデータを格納できる
-
ADODB.Recordsetオブジェクトに結び付けるだけでなく,プログラム側の操作で任意のセルに任意のデータを格納することができる。ちょうど表全体が二次元配列として構築されるイメージになる。
- 各セルの書式を任意に設定できる
-
セルごとに文字の種類,色,背景色などを任意に設定することができる。
- セルに画像を配置できる
-
セルに文字だけではなく画像を配置することもできる。
- セルを連結できる
-
セルを連結させることができるため,表を柔軟に作成できる。
- 階層化できる
- 階層フレキシブルグリッドコントロールとADODB.Recordsetオブジェクトとを結び付けて利用する場合,結び付けるADODB.Recordsetオブジェクトが階層化されていると,その階層をツリー状にして表示することができる(階層化機能については,この連載では扱わない)。
反面,階層フレキシブルグリッドコントロールがデータグリッドコントロールに比べて不利な点は,次のとおりである。
- 結び付けたデータベースを編集できない
-
ADODB.Recordsetオブジェクトに結び付けたとき,その内容を表示することはできるものの,ユーザーが階層フレキシブルグリッドコントロールで編集した内容を自動的にADODB.Recordsetオブジェクトに反映させるような処理はできない(ただし,今回のアプリケーションの場合,そもそも結び付けるADODB.Recordsetオブジェクトが読み取り専用であるから,この弱点は問題とならない)。そのような機能を提供したい場合には,階層フレキシブルグリッドコントロールで選択されているセル位置が変わったときに発生するイベントを利用し,ADODB.Recordsetオブジェクトを更新する処理を自ら実装しなければならない。
- 列見出しの設定が面倒
- データグリッドコントロールでは,プロパティ画面を用いて,ADODB.Recordsetオブジェクトのどのフィールド列を,どういった見出しで,第何列目に,どのような書式で表示するのか,といった詳細を設定できる。しかし階層フレキシブルグリッドコントロールには,そのような機能はない。どの列にどのように表示するのかは,プログラム側で指定する必要がある。
階層フレキシブルグリッドコントロールは柔軟に表示できる分だけ多機能であることは事実であるが,手軽にありがちな機能を実装できる機能性とデータベースとの連動性は,データグリッドコントロールのほうが高い。よって,用途に応じて使い分けることが望ましい。
なお,階層フレキシブルグリッドコントロールを用いるには,Visual Basicのメニューから[プロジェクト]−[コンポーネント]を選択し,表示された[コンポーネント]ウィンドウで[Microsoft Hierachical FlexGrid Control 6.0]にチェックを付け,コントロールを読み込む必要がある(Fig.7-93)。
階層フレキシブルグリッドコントロールと似たものに,フレキシブルグリッドコントロール(MSFlexGrid)がある。フレキシブルグリッドコントロールと階層フレキシブルグリッドコントロールとの違いは,大きく2つある。1つはフレキシブルグリッドコントロールがデータを階層化して表示できないこと,もう1つは,フレキシブルグリッドコントロールはADODB.Recordsetオブジェクトと連結できず,DAOのオブジェクトとしか連結できないという点である。階層フレキシブルグリッドコントロールはフレキシブルグリッドコントロールと上位互換性を持つため,これから新しいアプリケーションを構築する場合には,階層機能を使わない場合でも階層フレキシブルグリッドコントロールを利用すべきである。なぜなら,フレキシブルグリッドコントロールはVisual Basic 5.0のときによく使われた古いコントロールであり,それを利用するメリットはほとんどないからである。
Fig.7-93 コントロールの設定
○フォームがロードされたときの処理
フォームの実装がすんだら,フォームがロードされたときの処理を実装しておく。
明細情報を編集できるのは,営業部に所属するユーザー――つまり,ROLE_ALLADMIN,ROLE_SALES,ROLE_SALESMANAGER,ROLE_SALESADMINといういずれかのロールに属するユーザー――のみである。そこで,フォームがロードされたときにはユーザーが属するロールを調べ,営業部に属していなければ,FormSlipDetailフォーム上の[新規]ボタン(BTN_NEWボタン),[編集]ボタン(BTN_EDITボタン),[削除]ボタン(BTN_DELETEボタン)を不可視にする。そのように実装したものが,List 7-145である。
○フォームのサイズが変更されたときの処理次に,フォームのサイズが変更されたときに,フォーム上のコンポーネントのサイズや位置を変更し,フォームいっぱいに広がるようにする処理を実装する。それにはFormオブジェクトのResizeイベントを処理すればよい。具体的には,List 7-146のようになる。
109/134 |