| | タイトル | : Re^4: じゃんぬさんの要求も満たしてると… |  | 記事No | : 1742 |  | 投稿日 | : 2005/05/25(Wed) 14:46 |  | 投稿者 | : るしぇ | 
 勉強していただく事を前提で、普通に勉強していたら見落としがちなテクニックを1つ。
 親フォームで参照変数に子フォームの参照を入れた後、子フォームを閉じると、
 親フォームで参照変数に既に閉じられた(破棄された)子フォームの参照が残り、
 開放されません。子フォームが閉じた事を検知して参照変数に Nothing を設定し、
 開放する必要があります。
 
 あとは下記サンプルで勉強してみて下さい。じゃんぬさんの要求も満たしてると
 思います。子フォームの参照変数はメンバとして公開してませんが。
 
 ※プロジェクトに Form1 Form2 Form3 を追加。Form2 に Botton1 を貼り付けて下さい。
 [VB.NET]
 '/////////////////////////
 Option Explicit On
 '/////////////////////////
 '/// Form1.vb
 '/////////////////////////
 Public Class Form1
 Inherits System.Windows.Forms.Form
 
 (省略)" Windows フォーム デザイナで生成されたコード "
 
 Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu
 Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem
 Private WithEvents ChildForm2 As Form2
 Private WithEvents ChildForm3 As Form3
 
 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
 Handles MyBase.Load
 Me.IsMdiContainer = True
 
 Me.MainMenu1 = New System.Windows.Forms.MainMenu
 Me.MenuItem1 = New System.Windows.Forms.MenuItem
 Me.MainMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.MenuItem1})
 Me.MenuItem1.Index = 0
 Me.MenuItem1.Text = "Form2.Show"
 Me.Menu = Me.MainMenu1
 End Sub
 
 Private Sub ChildForm2_Closing(ByVal sender As Object, ByVal e As
 System.ComponentModel.CancelEventArgs) Handles ChildForm2.Closing
 Me.ChildForm2 = Nothing
 End Sub
 
 Private Sub ChildForm3_Closing(ByVal sender As Object, ByVal e As
 System.ComponentModel.CancelEventArgs) Handles ChildForm3.Closing
 Me.ChildForm3 = Nothing
 End Sub
 
 Private Sub MenuItem1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles
 MenuItem1.Click
 If Me.ChildForm2 Is Nothing Then
 Me.ChildForm2 = New Form2
 Me.ChildForm2.MdiParent = Me
 End If
 Me.ChildForm2.Show()
 End Sub
 
 Public Sub Form3_Show()
 If Me.ChildForm3 Is Nothing Then
 Me.ChildForm3 = New Form3
 Me.ChildForm3.MdiParent = Me
 End If
 Me.ChildForm3.Show()
 Me.ChildForm3.Activate()
 End Sub
 End Class
 
 '/////////////////////////
 Option Explicit On
 '/////////////////////////
 '/// Form2.vb
 '/////////////////////////
 Public Class Form2
 Inherits System.Windows.Forms.Form
 
 (省略)" Windows フォーム デザイナで生成されたコード "
 
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
 Handles Button1.Click
 Try
 If TypeOf Me.MdiParent Is Form1 Then
 Call DirectCast(Me.MdiParent, Form1).Form3_Show()
 End If
 Catch ex As Exception
 MessageBox.Show(ex.Message)
 End Try
 End Sub
 
 Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
 Handles MyBase.Load
 Me.Button1.Text = "Form3.Show"
 End Sub
 End Class
 
 |