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

7.4.4 顧客の編集
●カレント行がないときの処理

○イベントを結び付けるための設定
 ADODB.Recordsetオブジェクトのイベント処理を記述するには,ADODB.Recordsetオブジェクトを格納する変数をWithEventsを伴って宣言する。

 今回のアプリケーションでは,ADODB.Recordsetオブジェクトを保存する変数をList 7-12の1行目にあるように,g_objRecという名前のグローバル変数として宣言した。

Private g_objRec As ADODB.Recordset

 これを,WithEventsを伴う次のような形式に変更する。

Private WithEvents g_objRec As ADODB.Recordset

 このようにWithEventsを伴って宣言すると,“変数名_イベント名”というプロシージャを用意することで,そのイベントに対応するプロシージャがイベントが発生したときに呼び出されるようになる。たとえば,MoveCompleteイベントに対応するプロシージャは,g_objRec_MoveCompleteという名前となる。

 WithEventsを伴って宣言された変数は,Visual Basucのコードウィンドウの最上位にあるオブジェクト部分にも表示されるので,そこからイベントの記述を選択することもできる(Fig.7-34)。

Fig.7-34 Visual Basicのコードウィンドウの表示
fig7_34

MoveCompleteイベントに対応する処理を実装する
 では,MoveCompleteイベントに対応する処理を実装してゆくことにする。すでに説明したように,ADODB.Recordsetオブジェクトを保持する変数名がg_objRecであるとき,MoveCompleteイベントに対応するプロシージャの名前はg_objRec_MoveCompleteとなる。MoveCompleteイベントの書式は次のようになっている(これはVisual Basicのオンラインヘルプで確認できる)。

Private Sub g_objRec_MoveComplete( _
    ByVal adReason As ADODB.EventReasonEnum, _
    ByVal pError As ADODB.Error, _
    adStatus As ADODB.EventStatusEnum, _
    ByVal pRecordset As ADODB.Recordset)

 各引数の意味は,次のとおりである。

  • adReason
     MoveCompleteイベントが発生した理由。Table 7-11に示すいずれかの値。

  • pError
     エラーを示すエラーオブジェクト。adStatusの値がadStatusErrorsOccueredの場合にエラーの詳細を示すエラーオブジェクトが格納される。

  • adStatus
     エラーの状態。adStatusOK(エラーなし)かadStatusErrorsOccuered(エラーあり)のいずれか。

  • pRecordset
     カレント行の移動対象となったADODB.Recordsetオブジェクト。

Table 7-11 EventReasonEnum列挙型
解説
adRsnMoveFirst先頭に移動した
adRsnMoveLast末尾に移動した
adRsnMoveNext次の行に移動した
adRsnMovePreviousまえの行に移動した
adRsnMove任意の場所に移動した
adRsnRequeryクエリーが再実行された

 MoveCompleteイベントでは,カレント行の移動対象となったADODB.Recordsetオブジェクトが一番最後の引数に渡される。イベント内の処理では,この一番最後の引数で受け取れるADODB.Recordsetオブジェクトが指すカレント行がどのような状態であるかを調べ,[編集]ボタンを淡色表示にしたり,通常表示に戻したりといった処理をすればよい。

 ただし,カレント行の状態によって,ボタンの淡色表示と通常表示とを切り替えたいのは,[編集]ボタンだけではない,[削除]ボタンや[復帰]ボタンの状態についても変更したい。

  • [編集]ボタン
     カレント行が何らかのレコードを指しているときに通常表示,どのレコードも指していないときに淡色表示とする。先に説明したように,ADODB.RecordsetオブジェクトのEOFプロパティとBOFプロパティの値を参照すれば,カレント行が有効なレコードを指しているのかを調べることができる。

  • [削除]ボタン
     [編集]ボタンと同じ。カレント行が何らかのレコードを指しているときに通常表示,どのレコードも指していないときに淡色表示とする。

  • [復帰]ボタン
     [復帰]ボタンは,削除ずみのレコードを復活する操作をするためのボタンである。よって,該当レコードのDELETEDFLAGフィールドの値がTrueであるレコードのみが操作の対象となる。つまり,カレント行のDELETEDFLAGフィールドの値がTrueであれば[復帰]ボタンを通常表示とし,そうでなければ淡色表示とする。

 実際に上記のような処理をするようg_objRec_MoveCompleteプロシージャを実装したものが,List 7-28である。

 List 7-28では,まず5〜10行目で引数pRecordsetに渡されたADODB.Recordsetオブジェクト(g_objRec変数が示すADODB.Recordsetオブジェクトと同じものが渡される)のEOFプロパティとBOFプロパティを調べ,カレント行が何らかの行を指しているかどうかを調べている。何らかの行を持っていれば,12行目においてBTN_EDITボタン,つまり[編集]ボタンを通常表示にし,そうでなければ淡色表示にするという処理をする。

 次の15〜18行目は,[削除]ボタンの表示状態を設定する処理である。[削除]ボタンは,ユーザーが属するロールによって使用を制限するために,15行目でAllAdminSalesSalesAdminSalesManagerのいずれかのロールに属するときだけ,[編集]ボタンと同じように表示するという処理をしている。

 20〜36行目は,[復帰]ボタンの表示状態を設定する処理である。[復帰]ボタンはカレント行が指すDELETEDFLAGフィールドの値がTrueであるときにだけ通常表示にし,それ以外の場合には淡色表示にしたい。そこで,21行目でDELETEDFLAGフィールドの値がTrueであるかどうかを調べている。また,[復帰]ボタンはAllAdminロールかSalesAdminロールに属するユーザーにしか使えないようにするため,24行目において,そのロールも判定している。

 このように,MoveCompleteイベントの処理を記述することによって,カレント行の状態によってボタンの表示方法を変更することができる。

 ADODB.Recordsetオブジェクトのイベントは,本格的なアプリケーションを構築するときにはよく使われる。今回はMoveCompleteイベントを処理し,カレント行を移動したときの処理を実装しただけだが,たとえば,WillChangeFieldイベントを利用して,ユーザーがデータを書き換えるまえにその内容を確認したり,RecordChangeCompleteイベントを利用して,レコードの内容が書き変わったときにフォーム上のラベルのキャプションを変更したりする,といった処理は比較的多用される。

prevpg.gif Chapter 7 26/65 nextpg.gif