tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。