私はクラスclsContextPopUpMenu
を持っていて、異なるコントロールで使用できるいくつかの基本的な機能(例えば、コピー)を持つContextMenuStripを作成しています。例えば私は明示的にカスタマイズした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
、Iは、しかしのDataGridViewにDGVTable:
Private m_objPopUpMenu As clsContextPopUpMenu
m_objPopUpMenu = New clsContextPopUpMenu(CType(DGVTable, System.Windows.Forms.Control))
を使用することができm_objPopUpMenu
は、上記のDataGridViewを有するフォームに関連付けられていないことに注意してください。 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でオブジェクト/リソースをいつでも処分できますか?
ありがとうございました。私はなぜこの実装が複数のフォームで乱雑になるのか理解していません。クラスclsContextPopUpMenuは独立したクラスです。各フォームは、clsContextPopUpMenuのNewを呼び出すことによって、clsContextPopUpMenuの独自のオブジェクトを開始します。しかし、どのように各フォームのオブジェクトをリリースするには? (あなたが言及したように、フォームレベルの変数を何も設定しないでください。m_objPopUpMenu = nothingを設定するのはどうですか?これはオブジェクトを処理するコードと違うのですか?) – Summer
各フォームがclsContextPopUpMenuをインスタンス化するときに、その参照をフォーム内の変数に格納しますか?これを行うと、コードを追加する必要はありません。標準の.Net GC収集プロセスがすべてを処理します。フォームの外部に参照を格納する場合(たとえばModule内など)、フォームのコードを追加してアイテムの破棄を管理する必要があります。 –
私は、clsContextPopUpMenuをインスタンス化するときに、フォーム内の変数に参照を格納します。 GCはアンマネージドリソースを処理できないことに注意してください。グラフィックスオブジェクトなので、コンテキストメニューストリップは管理されていないリソースだと思っていました。私の理解は間違っていますか?御時間ありがとうございます! – Summer