タイトル : Re^4: じゃんぬさんの要求も満たしてると… 投稿日 : 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 |