2011-11-07 7 views
0

다른 컨트롤에서 사용할 수있는 몇 가지 기본 기능 (예 : copy)을 사용하여 ContextMenuStrip을 만들려면 클래스 clsContextPopUpMenu이 있어야합니다.명시 적으로 사용자 정의 된 컨텍스트 메뉴를 처리해야합니까?

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 생성자 설명에 따라 MSDN에 따르면, 양식의 자식이 아니기 때문에 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 

광의의 질문이다 나 자신에 의해 개체/자원을 처리해야 할 때 :

내 질문은 내가 명시 적으로 디자이너에서 m_objPopUpMenu을 폐기해야합니까입니까? 물론, GC 수집기는 사용 가능한 모든 메모리를 해제하는 마술사가 아닙니다. 위에 표시된 것처럼 Dispose Sub에 항상 객체/리소스를 처리 할 수 ​​있습니까?

답변

1

개정 대답 문제의 더 나은 이해로 인해 :

ContextMenuStrip을들이는 IDisposable을 구현하므로, 양식에 의해 관리되는 구성 요소의 목록에 추가해야합니다 중 하나가 적절하게 자동으로 배치되도록 또는 원래의 질문에 제시된대로 처분을 직접 관리하십시오.

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 

부터이 새로운 생성자를 호출하기 : 여기

는 직접 양식에 ContextMenuStrip을 추가한다면 창문을 처리 할 것이라고 같은 방식으로 자동 처리를 지원하는 클래스의 개정이다 또한 생성자에 전달하기 전에 컨트롤을 캐스팅 할 필요가 없습니다하는 필요하지 않기 때문에 나는 또한 생성자에서 ByRef을 제거

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

참고 : 양식 또는 사용자 컨트롤 내에서.

참고 사항 : 구성 요소가 모든 양식이나 사용자 정의 컨트롤에 반드시 있어야하는 것은 아니 었습니다. 나는이 수정되었습니다/변경된 것을 생각하지만, 당신이 자신을없이 찾을 경우, 수동으로 쉽게 추가 할 수 있습니다 :

Private components As System.ComponentModel.IContainer 

당신의 생성자에서 :

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

당신의 폐기 방법에 (내가 추가 한 이미 존재하지 않는 경우를위한 전체 처리 메소드, 해당되는 경우 구성 요소 관련 코드 추가) :

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 
+0

감사합니다. 이 구현이 왜 여러 형태로 복잡 해지는 지 이해할 수 없습니다. clsContextPopUpMenu 클래스는 독립 클래스입니다. 각 양식은 clsContextPopUpMenu의 New를 호출하여 clsContextPopUpMenu의 자체 객체를 시작합니다. 그러나 각 형식에 대해 개체를 해제하는 방법은 무엇입니까? (앞에서 언급했듯이 폼 레벨 변수를 아무 것도 설정하지 마십시오. m_objPopUpMenu = nothing을 설정한다는 의미입니까? 객체를 처리하는 코드와 다른가요?) – Summer

+0

각 양식이 clsContextPopUpMenu를 인스턴스화 할 때 해당 참조를 양식 내의 변수에 저장합니까? 이렇게하면 추가 코드가 필요하지 않습니다. 표준 .Net GC 수집 프로세스가 모든 것을 처리합니다. 폼 외부에 참조를 저장하는 경우 (예를 들어 모듈에서 말하면), 항목의 삭제를 관리하기 위해 양식에 코드를 추가해야합니다. –

+0

clsContextPopUpMenu를 인스턴스화 할 때 양식 내의 변수에 참조를 저장합니다. GC는 관리되지 않는 리소스를 처리 할 수 ​​없습니다. 그래픽 객체이므로 컨텍스트 메뉴 스트립은 관리되지 않는 리소스라고 생각했습니다. 내 이해가 잘못 됐어? 시간 내 줘서 고마워! – Summer

관련 문제