VB6/VBAのメンテナンスで
久しぶりにVB6.0/VBAを使うと、イベントの名前や発生順序を忘れていて戸惑う。
「まぁ頻繁じゃないから…」と、テストコードを毎回書いてきたが、数も重なってきたので、さすがにまとめておくことにした。
ほんとうにネットにないんだよね、イベント順序。
VBは発売から20年を超えてるはずなのに.
ユーザーによる操作
Loadされているフォームに対するユーザーの操作
Form | 操作 | |||||
---|---|---|---|---|---|---|
最小化 | 最小から通常 | 最大化 | 最大から通常 | ×で閉じる | ||
イベント | Initialize | |||||
Load | ||||||
Resize | ・1 | ・1 | ・1 | ・1 | ||
Activate | *2 | *2 | *2 | |||
Paint | ・3 | ・3 | ||||
Deactivate | ||||||
QueryUnload | ・1 | |||||
Unload | ・2 | |||||
Terminate |
・通常は発生する
*条件によって発生する
(数字は発生するイベントの順序)
スタートアップフォーム
プロジェクトのスタートアップに指定されたフォーム。既定(暗黙)のインスタンスを持った状態で立ち上がる。
Startup Form | 操作 | |||||||
---|---|---|---|---|---|---|---|---|
起動(Startup)Form | 最小化 | 最大化 | 最大から通常 | Formの×で閉じる | Unload Me | End | ||
イベント | Initialize | ・1 | 発生しない ※b |
|||||
Load | ・2 | |||||||
Resize | ・3 | ・1 | ・1 | ・1 | ||||
Activate | ・4 | |||||||
Paint | ・5 | ・2 | ||||||
Deactivate | ||||||||
QueryUnload | ・1 | ・1 | ||||||
Unload | ・2 | ・2 | ||||||
Terminate | *3 ※a | *3 ※a |
・通常は発生する
*条件によって発生する
※a.
Loadされた他のFormが残っているとプログラムは終了しない。Terminateも発生しない。
※b.
Endステートメントは、その時点でただちにプログラムの実行を終了させる。中断と解釈してもよい。
(数字は発生するイベントの順序)
子フォーム
スタートアップでないフォーム、コード上でオブジェクトとして生成されたフォーム
Form | 操作 | |||||||
---|---|---|---|---|---|---|---|---|
Show | Set obj = New Form | obj.Show | Visible True →False |
Visible False →True |
Unload * | Set obj = New Form ↓ Set obj = Nothing |
||
イベント | Initialize | ・1 | ・1 | |||||
Load | ・2 | ・1 | ||||||
Resize | ・3 | ・2 | ||||||
Activate | ・4 | ・3 | ||||||
Paint | ・5 | ・4 | ・1 | |||||
Deactivate | ||||||||
QueryUnload | ・1 | |||||||
Unload | ・2 | |||||||
Terminate | *1 ※a |
Form | 操作 | |||||
---|---|---|---|---|---|---|
#既定フォームの パブリック変数を 外から初めて読む (A) |
(A)の状態で Set 既定フォーム=Nothing |
(A)の状態で スタートアップ フォームを Unload Me |
フォームの プロパティを 外から初めて読む (B) |
(B)の状態で スタートアップ フォームを Unload Me |
||
イベント | Initialize | ・1 | *1 | 発生しない ※c |
||
Load | ・2 | |||||
Resize | ||||||
Activate | ||||||
Paint | ||||||
Deactivate | ||||||
QueryUnload | ||||||
Unload | ||||||
Terminate | ・1 | ・1 ※b |
・通常は発生する *条件によって発生する (数字は発生するイベントの順序)
#既定フォームとは、VB/VBAではフォームをSet(インスタンス化)しなくてもそのまま呼び出せることを指す。次項の「既定のインスタンス・暗黙のインスタンス」を参照。
※a. obj が
インスタンスになっているだけで、LoadされていないのであればTerminateが発生する
※b.
スタートアップフォームのTerminate後に発生する
※c. この場合スタートアップフォームはUnloadされるが、Loadされた他のフォームは残留する。このためスタートアップフォームの終了処理は保留される。この状態から残留しているフォームをすべてUnloadしたとき、スタートアップフォームのTerminateが発生しプログラムは終了する。
既定のインスタンス・暗黙のインスタンス
「Set ~ = New」と「Dim ~As New」は、異なる
ボタン
フォーム上のコマンドボタンを押したときのイベント順
CommandButton | 操作 | |
---|---|---|
ボタンを押す | ||
イベント | MouseMove | ・1・5 (最初と終わりで発生する) |
MouseDown | ・2 | |
Click | ・3 | |
MouseUp | ・4 |
(数字は発生するイベントの順序)
クラス
クラスイベント(事実上のコンストラクタ/デストラクタ)
これ見るたびに、Newで引数を渡せたら可読性があがるのになぁと思う。
一般のClass | 操作 | ||
---|---|---|---|
Set obj = New Class | Set obj = Nothing | ||
イベント | Initialize | ・1 | |
Terminate | ・1 |
既定のインスタンスを 持ったClass |
操作 | ||
---|---|---|---|
クラス内の プロパティ・ ファンクション・ パブリック変数 を使用したとき |
プログラム が終了するとき |
||
イベント | Initialize | ・1 | |
Terminate | ・1 |