다른 컨트롤에서 사용할 수있는 몇 가지 기본 기능 (예 : 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에 항상 객체/리소스를 처리 할 수 있습니까?
감사합니다. 이 구현이 왜 여러 형태로 복잡 해지는 지 이해할 수 없습니다. clsContextPopUpMenu 클래스는 독립 클래스입니다. 각 양식은 clsContextPopUpMenu의 New를 호출하여 clsContextPopUpMenu의 자체 객체를 시작합니다. 그러나 각 형식에 대해 개체를 해제하는 방법은 무엇입니까? (앞에서 언급했듯이 폼 레벨 변수를 아무 것도 설정하지 마십시오. m_objPopUpMenu = nothing을 설정한다는 의미입니까? 객체를 처리하는 코드와 다른가요?) – Summer
각 양식이 clsContextPopUpMenu를 인스턴스화 할 때 해당 참조를 양식 내의 변수에 저장합니까? 이렇게하면 추가 코드가 필요하지 않습니다. 표준 .Net GC 수집 프로세스가 모든 것을 처리합니다. 폼 외부에 참조를 저장하는 경우 (예를 들어 모듈에서 말하면), 항목의 삭제를 관리하기 위해 양식에 코드를 추가해야합니다. –
clsContextPopUpMenu를 인스턴스화 할 때 양식 내의 변수에 참조를 저장합니다. GC는 관리되지 않는 리소스를 처리 할 수 없습니다. 그래픽 객체이므로 컨텍스트 메뉴 스트립은 관리되지 않는 리소스라고 생각했습니다. 내 이해가 잘못 됐어? 시간 내 줘서 고마워! – Summer