2009年4月22日水曜日

Access のフォームにおいて、イベントが呼出されるタイミングを知りたい

1. イベントが発生するタイミングを把握する必要がある

Access が分かりにくい理由は、フォームがどういう仕組みの上で動いているかをちゃんと理解せず、場当たりに作ってしまうことにある。フォームに配置できる部品のプロパティを把握しておくことは重要。

フォームのデザインにおいて、

  1. フォームの左上隅をクリックし、
  2. プロパティを表示させると、

色々なイベント処理に対応していることがわかる。

090422-006

しかし、その数があまりにも多く、どういうタイミングで何が呼出されているか理解していないと、簡単にイベント処理の森に迷いこんでしまう。 (@_@;)

イベントの意味、発生する順序について、以下の説明がわかりやすかった。

 

2. Debug.Print で力技

どういうタイミングでイベントが呼出されているのか知りたい。

イベント処理に対して、横からキャッチできないか調べてけれど、分からなかった… (+_+)

仕方がないので、フォームのイベント全部に Debug.Print 書いて、イミディエイト ウィンドウに出力させた。

Private Sub Form_Activate()
    Debug.Print "Activate"
End Sub

Private Sub Form_AfterDelConfirm(Status As Integer)
    Debug.Print "AfterDelConfirm"
End Sub

Private Sub Form_AfterFinalRender(ByVal drawObject As Object)
    Debug.Print "AfterFinalRender"
End Sub

Private Sub Form_AfterInsert()
    Debug.Print "AfterInsert"
End Sub

Private Sub Form_AfterLayout(ByVal drawObject As Object)
    Debug.Print "AfterLayout"
End Sub

Private Sub Form_AfterRender(ByVal drawObject As Object, ByVal chartObject As Object)
    Debug.Print "AfterRender"
End Sub

Private Sub Form_AfterUpdate()
    Debug.Print "AfterUpdate"
End Sub

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
    Debug.Print "ApplyFilter"
End Sub

Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
    Debug.Print "BeforeDelConfirm"
End Sub

Private Sub Form_BeforeInsert(Cancel As Integer)
    Debug.Print "BeforeInsert"
End Sub

Private Sub Form_BeforeQuery()
    Debug.Print "BeforeQuery"
End Sub

Private Sub Form_BeforeRender(ByVal drawObject As Object, ByVal chartObject As Object, ByVal Cancel As Object)
    Debug.Print "BeforeRender"
End Sub

Private Sub Form_BeforeScreenTip(ByVal ScreenTipText As Object, ByVal SourceObject As Object)
    Debug.Print "BeforeScreenTip"
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Debug.Print "BeforeUpdate"
End Sub

Private Sub Form_Click()
    Debug.Print "Click"
End Sub

Private Sub Form_Close()
    Debug.Print "Close"
End Sub

Private Sub Form_CommandBeforeExecute(ByVal Command As Variant, ByVal Cancel As Object)
    Debug.Print "CommandBeforeExecute"
End Sub

Private Sub Form_CommandChecked(ByVal Command As Variant, ByVal Checked As Object)
    Debug.Print "CommandChecked"
End Sub

Private Sub Form_CommandEnabled(ByVal Command As Variant, ByVal Enabled As Object)
    Debug.Print "CommandEnabled"
End Sub

Private Sub Form_CommandExecute(ByVal Command As Variant)
    Debug.Print "CommandExecute"
End Sub

Private Sub Form_Current()
    Debug.Print "Current"
End Sub

Private Sub Form_DataChange(ByVal Reason As Long)
    Debug.Print "DataChange"
End Sub

Private Sub Form_DataSetChange()
    Debug.Print "DataSetChange"
End Sub

Private Sub Form_DblClick(Cancel As Integer)
    Debug.Print "DblClick"
End Sub

Private Sub Form_Deactivate()
    Debug.Print "Deactivate"
End Sub

Private Sub Form_Delete(Cancel As Integer)
    Debug.Print "Delete"
End Sub

Private Sub Form_Dirty(Cancel As Integer)
    Debug.Print "Dirty"
End Sub

Private Sub Form_Error(DataErr As Integer, Response As Integer)
    Debug.Print "Error"
End Sub

Private Sub Form_Filter(Cancel As Integer, FilterType As Integer)
    Debug.Print "Filter"
End Sub

Private Sub Form_GotFocus()
    Debug.Print "GotFocus"
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Debug.Print "KeyDown"
End Sub

Private Sub Form_KeyPress(KeyAscii As Integer)
    Debug.Print "KeyPress"
End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
    Debug.Print "KeyUp"
End Sub

Private Sub Form_Load()
    Debug.Print "Load"
End Sub

Private Sub Form_LostFocus()
    Debug.Print "LostFocus"
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Debug.Print "MouseDown"
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Debug.Print "MouseMove"
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Debug.Print "MouseUp"
End Sub

Private Sub Form_MouseWheel(ByVal Page As Boolean, ByVal Count As Long)
    Debug.Print "MouseWheel"
End Sub

Private Sub Form_OnConnect()
    Debug.Print "OnConnect"
End Sub

Private Sub Form_OnDisconnect()
    Debug.Print "OnDisconnect"
End Sub

Private Sub Form_Open(Cancel As Integer)
    Debug.Print "Open"
End Sub

Private Sub Form_PivotTableChange(ByVal Reason As Long)
    Debug.Print "PivotTableChange"
End Sub

Private Sub Form_Query()
    Debug.Print "Query"
End Sub

Private Sub Form_Resize()
    Debug.Print "Resize"
End Sub

Private Sub Form_SelectionChange()
    Debug.Print "SelectionChange"
End Sub

Private Sub Form_Timer()
    Debug.Print "Timer"
End Sub

Private Sub Form_Undo(Cancel As Integer)
    Debug.Print "Undo"
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Debug.Print "Unload"
End Sub

Private Sub Form_ViewChange(ByVal Reason As Long)
    Debug.Print "ViewChange"
End Sub

あぁ~面倒だった。パタッ(o_ _)o~†

 

3. 試してみる

以下の処理をしたときに、どのようなイベントが発生するか試してみた。

  1. フォームを開く
  2. フィールドを修正
  3. フォームを閉じる

イミディエイト ウィンドウに、以下のように表示された。

Open
Load
Resize
Activate
Current
Dirty
BeforeUpdate
AfterUpdate
Unload
Deactivate
Close

close イベントの前に Before/AfterUpdate イベントが処理されている。Close イベントのときに、Me.Dirty が True でなかったのはこれが理由だったのか。

 

関連記事