表示しているフォームを一度に閉じる |
閉じる又は×をクリックしたら開いているフォームをすべて閉じる (029) | |
使用例 次のサブルーチンを標準モジュールに作成する Public Sub sAllEnd()
Dim myObject As Object For Each myObject In Forms Unload myObject Set myObject = Nothing Next End Sub 各フォームの Unload イベント からサブルーチンを呼ぶ Private Sub Form_Unload(Cancel As Integer) Call sAllEnd Unload Me End Sub 又はForm1だけに書く Private Sub Form_Unload(Cancel As Integer) Dim myObject As Object For Each myObject In Forms Unload myObject Set myObject = Nothing Next Unload Me End Sub |
|
マイクロソフト推奨のやり方(FAQ集より) (029) Private Sub Form_Unload(Cancel As Integer) Dim i As Integer While Forms.Count > 1 '自分以外のフォームを探します i = 2 While Forms(i) Is Me i = i + 1 Wend Unload Forms(i) Wend '自分自身もアンロードし、アプリケーションは終了します Unload Me 'End 消しておく(使用しない方が良い) End Sub |
|
ゆう(U)さんに投稿頂いた分 (029) '========================================================== '全てのフォームを解放する sFormAllUnload '========================================================== ' Call sFormAllUnload ' 引数 なし '---------------------------------------------------------- 'MDI親・子フォームのUnload順を考慮しています。 'しかしSDIフォームの親子は考慮していないので、その辺は '不安ですが・・・(frmXXX.Show vbModeless, Me などの場合 '親が消されるとUnloadMode=5で子もUnloadされます) '(Forms.Count - 1 To 0)でUnloadの方が良いかも? '---------------------------------------------------------- Public Sub sFormAllUnload() Dim myForm As Form ' フォームの解放 For Each myForm In Forms If Not (TypeOf myForm Is MDIForm) Then Unload myForm End If Next myForm ' MDIフォームの解放(MDI親フォーム以外はないはず) For Each myForm In Forms Unload myForm Next myForm End Sub |
|
一部使い方が間違っておりました。 99.02.20 訂正 上記のような終了処理は、Command ボタン等に記述しておりましたが、フォームの Unload イベントに記述し、メニュー等の終了には Unload Me と記述して下さい 又、私もそうでしたが、マイクロソフトや書籍の多くに終了に End ステートメントを使用していますが、End を書くとそれ以降の処理を一切しなくなりUnload としても Unload イベントなども動作しなくなり、ファイルクローズやメモリ解放が正常に行われ るかは疑問です・・・単体のEXEでは問題はあまり見えないでしょうが今後を考えると End は使用しない方が良いと思います。 と ゆう(U)さんに教えて頂きました。 私のように旧のBasicからVisual Basicに移行したものは特に注意したい記述かと思います。 終了イベント発生順序は次のようになっています。 1.QueryUnload このイベントは終了の原因が取得できます。そこでUnloadするかCancel するかを記述するような時に使用します。 2.Unload 通常の終了処理を記入します。 3.Terminate Unload イベントの後に発生しますが!!!!Help参照 |
02/01/01