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

7.7.8 明細処理
●明細処理フォームを開く

○明細処理フォームを開く
 以上で,FormSlipDetailフォーム(Fig.7-92)に対し,指定された伝票の情報ならびにその明細を描画する準備が整ったことになる。

 そこで,FormSlipフォーム(Fig.7-86)の[明細]ボタン(BTN_DETAILボタン)を押したときにFormSlipDetailフォームを開くよう,List 7-149に示すプログラムを実装する。

 List 7-149の3行目では,先に実装しておいたFormSlipDetailフォームのInitDataプロシージャ(List 7-147)を呼び出し,FormSlipDetailフォームに指定された伝票の情報ならびに明細を描画するという処理をしている。このとき,InitDataプロシージャの引数にはg_objRec.Fields("ID").Valueを渡しているから,FormSlipフォームのDGrid_Slipデータグリッドでカレント行となっている伝票の情報ならびに明細が描画されるということになる(DGrid_Slipデータグリッドに結び付けられているADODB.Recordsetオブジェクトを保持しているのが,グローバル変数g_objRecである)。そして,4行目でFormSlipDetailフォームのShowメソッドを呼び出し,FormSlipDetailフォームをユーザーに表示する。

○伝票と明細とを同期する
 ところで,List 7-149の4行目では,Showメソッドを呼び出すときに引数を省略しているため,FormSlipDetailフォームはモーダルウィンドウではなく,モードレスウィンドウとして表示される。つまり,ユーザーはFormSlipDetailフォームを表示したまま別のフォーム(ウィンドウ)で処理を継続することもできる。このような実装にした理由は,ユーザーが伝票の一覧(FormSlipフォーム)と明細の一覧(FormSlipDetailフォーム)の両方を見ながら操作できたほうが便利だろうと判断したためである。

 さて,このような場合に,ユーザーがFormSlipフォーム上のDGrid_Slipデータグリッドのカレント行(マーキーのある行)を動かしたとしよう。このとき,カレント行の明細がFormSlipDetailフォームに表示されるように,FormSlipフォームのDGrid_SlipデータグリッドとFormSlipDetailフォームの表示とが同期されると大変便利である。そこで,DGrid_Slipデータグリッドが表示するADODB.Recordsetオブジェクトのカレント行の位置が変わったときに,FormSlipDetailフォームの内容を更新するような処理を加えてみることにする。

 そのためには,ADODB.RecordsetオブジェクトのMoveCompleteイベントを処理して,カレント行の位置が変わったときに,先に実装しておいたFormSlipDetailフォームのInitDataプロシージャ(List 7-147)を呼び出せばよい。しかし,カレント行は常に有効であるとは限らない。たとえば,ユーザーがFormSlipフォームで絞り込みを設定したときなどには,DGrid_Slipデータグリッドが指すカレント行は存在しないかもしれない。

 そこで先に,FormSlipDetailフォームにList 7-150に示すDisableControlというプロシージャを用意しておく。

 DisableControlプロシージャは,FormSlipDetailフォームの各ラベルやテキストボックスの文字列を“---”に変更したのち,すべてのボタンやフレーム類を淡色表示にするというものである。そのため,DisableControlプロシージャを呼び出せば,FormSlipDetailフォームにおけるすべての操作が禁止されるようになる。つまり,FormSlipフォームのDGrid_Slipデータグリッドが指すカレント行が存在しないときには,DisableControlプロシージャを呼び出してFormSlipDetailフォームを無効にすればよい。


One Point! フォーム全体を淡色表示にするのとフォームの個々のコンポーネントを淡色表示にするというのは,若干意味が異なる。FormSlipDetailフォーム全体を無効にしたいのであれば,List 7-150に示したDisableControlプロシージャなど使わずに,FormSlipDetailフォームのEnabledプロパティをFalseに設定すればよい。しかし,FormSlipDetailフォームのEnabledプロパティをFalseにすると,フォーム全体を操作できなくなるため,フォームを移動したり閉じたりすることさえできなくなってしまう。

 実際にDGrid_Slipデータグリッドが指すカレント行が変更されたときにFormSlipDetailフォームの内容を更新するには,DGrid_Slipデータグリッドに割り当てられているADODB.Recordsetオブジェクトを保持するグローバル変数であるg_objRecMoveCompleteイベントを処理する。MoveCompleteイベントの処理は,すでにList 7-139で実装しているので,これをList 7-151のように修正する。

 List 7-151において変更した箇所は,84〜90行目である。ここでは,グローバル変数g_objRecのカレント行が存在し,かつFormSlipDetailフォームが可視である(VisibleプロパティがTrueである)ときには,InitDataプロシージャ(List 7-147)を呼び出し,FormSlipDetailフォームを更新している(85〜87行目)。また,カレント行が存在せず,かつFormSlipDetailフォームが可視であるときには,DisableControlプロシージャ(List 7-150)を呼び出し,FormSlipDetailフォームを無効にしている(89〜91行目)。

 List 7-151を実装することにより,ユーザーがDGrid_Slipデータグリッドでカレント行を変更すると,それに伴ってFormSlipDetailフォームが更新され,カレント行が指す伝票の明細を表示できるようになる。

○最新の情報に更新する処理
 ユーザーがFormSlipDetailフォーム上に配置された[最新の情報に更新]ボタン(BTN_REFRESHボタン)を押したときには,FormSlipDetailフォームを更新する必要があるだろう。そこで,List 7-152に示す処理を実装しておく。List 7-152は,単純にBTN_REFRESHボタンのClickイベントを処理し,先に実装しておいたRefreshDataプロシージャ(List 7-148)を呼び出すものである。

 ところで,顧客管理用のフォームであるFormCustomerフォーム(Fig.7-16),製品管理処理に使ったFormProductフォーム(Fig.7-67),伝票管理処理に使うFormSlipフォーム(Fig.7-86)は,[最新の情報に更新]ボタンを押したときに表示内容を更新し,かつ更新後もカレント行を保持するように実装されている。しかし,明細を表示するFormSlipDetailフォームでは,カレント行を特別に保持しないようにした。なぜなら,FormSlipDetailフォームはデータの表示にデータグリッドコントロールではなく階層フレキシブルグリッドコントロールを使っているため,更新後にカレント行へと復帰する処理が複雑になるためである。明細の一覧表示は,顧客情報や製品情報,伝票情報の一覧表示とは異なり,1つの伝票に多数の明細が記載されることはあまりない。よって,更新後にカレント行を同じ位置に合わせる処理をしなくても,実用上問題ないとも思われるため,このような処理を割愛している。また,同様の理由から,明細の検索や明細の並べ替えの処理も実装しないことにする(ただし,これは階層フレキシブルグリッドコントロールの制限というわけではなく,工程が多くかかるという手間の問題でしかなく,実装できないという意味ではない)。

Prev 112/134 Next