1. イベントが発生するタイミングを把握する必要がある
Access が分かりにくい理由は、フォームがどういう仕組みの上で動いているかをちゃんと理解せず、場当たりに作ってしまうことにある。フォームに配置できる部品のプロパティを把握しておくことは重要。
フォームのデザインにおいて、
- フォームの左上隅をクリックし、
- プロパティを表示させると、
色々なイベント処理に対応していることがわかる。
しかし、その数があまりにも多く、どういうタイミングで何が呼出されているか理解していないと、簡単にイベント処理の森に迷いこんでしまう。 (@_@;)
イベントの意味、発生する順序について、以下の説明がわかりやすかった。
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. 試してみる
以下の処理をしたときに、どのようなイベントが発生するか試してみた。
- フォームを開く
- フィールドを修正
- フォームを閉じる
イミディエイト ウィンドウに、以下のように表示された。
Open Load Resize Activate Current Dirty BeforeUpdate AfterUpdate Unload Deactivate Close
close イベントの前に Before/AfterUpdate イベントが処理されている。Close イベントのときに、Me.Dirty が True でなかったのはこれが理由だったのか。
0コメント:
コメントを投稿