0

clsContextPopUpMenuさまざまなコントロールで使用できるいくつかの基本的な関数(egcopy)を使用してContextMenuStripを作成するクラスがあります。

    Friend Sub New(ByRef objControl As System.Windows.Forms.Control)

    m_objControlContainer = objControl
    m_mnuCopyCell2Clipboard = New ToolStripMenuItem("Copy Cell")
    m_PopupMenu = New ContextMenuStrip
    m_PopupMenu.Items.AddRange(New ToolStripMenuItem() {m_mnuCopyCell2Clipboard})
End Sub

たとえば、DataGridViewで使用できますDGVTable:

 Private m_objPopUpMenu As clsContextPopUpMenu
 m_objPopUpMenu = New clsContextPopUpMenu(CType(DGVTable, System.Windows.Forms.Control))

ただし、m_objPopUpMenu上記のdatagridviewを持つフォームには関連付けられていないことに注意してください。MSDNのContextMenuStripコンストラクターの説明によるとm_objPopUpMenu、フォームの子ではないため、自動的に破棄することはできないと思います。

私の質問は、m_objPopUpMenuデザイナーで明示的に処分する必要があるかどうかです。

    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    Try
        If disposing AndAlso components IsNot Nothing Then
            components.Dispose()
            **m_objPopUpMenu.Dispose()**
        End If
    Finally
        MyBase.Dispose(disposing)
    End Try
End Sub

より広い質問は、オブジェクト/リソースを自分でいつ処分する必要があるかということです。もちろん、gcコレクターは利用可能なすべてのメモリを解放するマジシャンではありません。上記のように、Dispose Subでオブジェクト/リソースを常に破棄できますか?

4

1 に答える 1

1

問題の理解が深まったため、回答を修正しました。

ContextMenuStripはIDisposableを実装しているため、フォームによって管理されるコンポーネントのリストに追加して、適切かつ自動的に廃棄されるようにするか、元の質問で提案されているように自分で廃棄を管理する必要があります。

これは、ContextMenuStripをフォームに直接追加した場合に、Windowsが自動破棄を処理するのと同じ方法で自動破棄をサポートするクラスのリビジョンです。

Friend Sub New(ByVal objControl As System.Windows.Forms.Control, ByVal components As System.ComponentModel.IContainer)

    m_objControlContainer = objControl
    m_mnuCopyCell2Clipboard = New ToolStripMenuItem("Copy Cell")
    m_PopupMenu = New ContextMenuStrip(components)
    m_PopupMenu.Items.AddRange(New ToolStripMenuItem() {m_mnuCopyCell2Clipboard})
End Sub

フォームまたはユーザーコントロール内からこの新しいコンストラクターを呼び出すには、次のようにします。

 Private m_objPopUpMenu As clsContextPopUpMenu
 m_objPopUpMenu = New clsContextPopUpMenu(DGVTable, Me.components)

は必須ではないため、コンストラクターからも削除したことに注意してくださいByRef。これにより、コントロールをコンストラクターに渡す前にキャストする必要もなくなります。

1つの追加の注意:コンポーネントが必ずしもすべてのフォームまたはユーザーコントロールに存在するわけではなかったのは(「昔」)でした。これは変更/修正されたと思いますが、それがない場合は、手動で追加するのは簡単です。

Private components As System.ComponentModel.IContainer

コンストラクター内:

Me.components = New System.ComponentModel.Container()

Disposeメソッドで(まだ存在しない場合に備えて完全なdisposeメソッドを追加しました。存在する場合は、コンポーネント関連のコードを追加しただけです):

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
    If disposing Then
        If Not (components Is Nothing) Then
            components.Dispose()
        End If
    End If
    MyBase.Dispose(disposing)
End Sub
于 2011-11-07T22:33:20.083 に答える