[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/06/26(Tue) 18:29
投稿者名:KenPAPA
Eメール:
URL :
タイトル:
MDIフォームで子フォームが閉じられた時親フォームでのイベント
お世話になります。
MDIフォームでいくつかの子フォームが有り、ユーザーが×ボタンで消せます。
子フォームが全てなくなった時に親フォームも消したいと思っています。

子フォームで、親フォームを消そうとすると、
Unload frmMain ←親フォーム
------------------------------------------------
実行時エラー'426'
複数のMDIフォームは使用できません。
------------------------------------------------
とエラーになります。

親フォーム側で、子フォームが閉じられた事を認識する方法・イベント等
何か良い方法は無いでしょうか?

宜しくお願い致します。

投稿時間:2007/06/26(Tue) 18:57
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: MDIフォームで子フォームが閉じられた時親フォームでのイベント
> 親フォーム側で、子フォームが閉じられた事を認識する方法・イベント等
> 何か良い方法は無いでしょうか?

「WithEvents」を使ってみては如何でしょう。

投稿時間:2007/06/26(Tue) 20:43
投稿者名:KenPAPA
Eメール:
URL :
タイトル:
Re^2: MDIフォームで子フォームが閉じられた時親フォームでのイベント
魔界の仮面弁士様、ご回答有り難うございます。

> 「WithEvents」を使ってみては如何でしょう。

WithEventsを使ったことが無かったので悪戦苦闘しています。

以下のコードでも「複数のMDIフォームは使用できません。」が出てしまいました。

■Class1
------------------------------------------------
Private WithEvents mForm As Form

Public Property Set MyForm(objForm As Form)
  Set mForm = objForm
End Property

Public Property Get MyForm() As Form
  Set MyForm = mForm
End Property

Private Sub mForm_Unload(Cancel As Integer)

'子フォーム無くなったら、親フォームも消す
Dim myAri As Boolean
Dim Fm As Form

For Each Fm In Forms
    If Not TypeOf Fm Is MDIForm Then
        If Fm.Caption <> mForm.Caption Then
            myAri = True
            Exit For
        End If
    End If
Next

If myAri = False Then
    Unload fMainForm
'    End←←Endなら終了出来ますが・・・
End If

End Sub
------------------------------------------------

■子フォーム 
------------------------------------------------
'General
Private objForm As Class1

Private Sub Form_Load()
    Set objForm = New Class1
    Set objForm.MyForm = Me
End Sub
------------------------------------------------

■Module1
------------------------------------------------
'General
Public fMainForm As frmMain

Sub Main()
    Set fMainForm = New frmMain
    fMainForm.Show
End Sub
------------------------------------------------


WithEventsの使い方がおかしいでしょうか?
Endで無理矢理終了なら出来ましたが、この場合何か問題が有るでしょうか?

宜しくお願い致します。

投稿時間:2007/06/27(Wed) 03:47
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
まずは、子フォームが一つだけの場合
とりあえず、子フォームを 1 個だけにして単純化した例。

1. 標準 EXE プロジェクトを新規作成。(Project1)
2. MDIForm を追加。(MDIForm1)
3. Form1 を MDIChild = True に変更。
4. MDIForm1 を AutoShowChildren = False に変更。
5. MDIForm1 に Timer コントロール追加。(Timer1)
6. MDIForm1 に下記コード。他にはコード無し。
7. スタートアップを MDIForm1 に変更。
8. 実行し、子フォームを閉じてみる。親フォームが閉じられれば成功。


---- MDIForm1 ----
Option Explicit

Private WithEvents ChildForm As Form

Private Sub MDIForm_Load()
    Set ChildForm = New Form1
    ChildForm.Show
End Sub

Private Sub ChildForm_Unload(Cancel As Integer)
    Set ChildForm = Nothing
    Timer1.Interval = 100
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
    Timer1.Enabled = False
    Unload Me
End Sub
----------------------

ChildForm_Unload 内で Unload Me すると、少々問題が出てくるので、
タイマーを使って、子のアンロード完了後に親をアンロードしています。