Microsoft Access 掲示板

サブフォームの値をすぐに計算など / 6

11 コメント
views
4 フォロー
6

それと”フォーカス喪失時”と”フォームの読み込み解除時”のイベントの違いを教えて頂けますでしょうか(知識不足でフォームの流れがわかっていないのですみません)。

一般論ではなく前回の回答の”フォーカス喪失時”と”フォームの読み込み解除時”についてということで回答します。

その前にメイン/サブフォーム形式のフォームのフォーカス関係のイベントについて。
まずフォームを開いた直後は、メインフォームのタブオーダーが1番目のコントロールにフォーカスがあります。
メインフォームの入力を終えてサブフォームの入力に移るためにサブフォームのコントロールをクリックしたとします。
フォーカス関係イベントは下記のように発生します。

メインフォーム上のサブフォームコントロールのフォーカス取得時(Enter)イベント

サブフォーム上のコントロールのフォーカス取得時(Enter)イベント

サブフォーム上のコントロールのフォーカス取得後(GotFocus)イベント

サブフォームの入力を終了してメインフォームのコマンドボタンやテキストボックスをクリックしてメインフォームへフォーカスを移動したとき

サブフォーム上のコントロールのフォーカス喪失時(Exit)イベント

サブフォーム上のコントロールのフォーカス喪失後(LostFocus)イベント

メインフォーム上のサブフォームコントロールのフォーカス喪失時(Exit)イベント※

クリックしたメインフォーム上のコントロールのフォーカス取得時(Enter)イベント

前回の回答では上記の※の時に、2つの合計をチェックして不一致の場合は、Cancel = Trueでイベントをキャンセルします。イベントがキャンセルされるとそれ以降のイベントは発生せずフォーカスはサブフォームから移動しません。

フォームの読み込み解除時イベントはフォームの右上のクローズボタンをクリックするなどフォームを閉じようとするアクションを起こすと発生します。サブフォームにフォーカスがある場合は、その前にメインフォームへフォーカスが移動することになります。イベントの発生順は下記のようになります。

サブフォーム上のコントロールのフォーカス喪失時(Exit)イベント

サブフォーム上のコントロールのフォーカス喪失後(LostFocus)イベント

メインフォーム上のサブフォームコントロールのフォーカス喪失時(Exit)イベント※

メインフォームの読み込み解除時(Unload)イベント

この場合も※のところで合計チェックをして不一致ならイベントをキャンセルしますが、読み込み解除時イベントは発生してしまいます。ということは合計が不一致のまま閉じてレコード保存されてしまうことになります。

それを防ぐために、読み込み解除時でも合計をチェックして不一致ならイベントをキャンセル(Cancel = True)してフォーカスをサブフォームへ戻しておきます。これで合計が不一致の場合はフォームを閉じることができなくなります。

通報 ...