2011-02-25 2 views
4

"frmMain 언로드"와 같은 코드를 볼 수 있습니다. 여기서 frmMain은 형식/모듈 이름이며, "ObjFrmMain"정렬의 변수 이름이 될 수도 있습니다. 그럼에도 불구하고,이 명령은 언로드 할 문제의 양식을 성공적으로 유도합니다.VB6에서는 데이터 유형의 이름을 지정하여 양식 인스턴스를 싱글 톤으로 참조 할 수 있습니까? 또는 무슨 일이 일어나고있는가?

데이터 유형이 기존의 단일 인스턴스에 대한 별칭으로 사용됩니까? 아니면 모든 인스턴스에 대해?

VB6은 양식에서 파생 된 데이터 형식 이외의 데이터 형식과 유사한 기능을 수행합니까?

+0

각 클래스의 양식에 대해서만 암시적인 전역'Dim frmMain As New frmMain'이 있습니다. 이것은'SELECT ... WHERE Field LIKE frmMain! TextBox.Text' 쿼리를 사용할 수있는 MS Access 스타일의 코딩과의 호환성을 위해 남아 있습니다. – wqw

답변

7

예, VB6에서 이상한 개체 동작이 있습니다. 그것은 폼 객체를 다루기위한 몇 가지 단축키를 제공합니다.

Load frmMain 

... 해당 변수 이름으로 해당 양식의 단일 인스턴스를로드합니다. 사실 :

frmMain.lblSomeLabel.Caption = "some caption" 

...이 인스턴스를로드합니다. 그러나 :

frmMain.SomeStringMember = "some value" 

...하지 않습니다 부하 양식 객체 (창 자체를 의미)하지만, 본질적으로, 양식의 이름은 전역 변수입니다 있도록, 이러한 변수에 액세스 할 수 있습니다.

당신은, 그러나, 새로운 인스턴스를 생성 할 수 있습니다 : 당신이 한 형태의 여러 인스턴스를 가질 수 있도록 실제로 그것을, MyForm의 새 인스턴스를 만들로드 및 표시됩니다

Dim newForm As MyForm 
Set newForm = New MyForm 
newForm.Show vbModal 

.

는 또한 New 키워드에 oddness의주의 : 이것은없이 작동

Dim newObject As New MyClass 
Set newObject = Nothing 
newObject.SomeStringProperty = "some value" 

"개체 참조를 설정하지 ..."오류입니다. As New 구문을 사용하여 참조 변수를 선언하면 개체를 Nothing으로 설정하여 삭제하고 해당 변수를 다시 참조하면 은 새 인스턴스을 만듭니다.

사실 그것이 양식에서 실제로 진행되고 있습니다. 암시가있다 :

Dim frmMain As New frmMain 

개인적으로 나는 혼란스럽고 위험하기 때문에 As New 구문을 사용하지 않으. 또한 성능에 대한 패널티가 있습니다 :

Dim newObject As MyClass 
Set newObject = New MyClass 

...하지만 양식에 대해서는 문제가 있습니다.

Unload frmMain으로 전화 할 때 무슨 일이 발생하는지는 창 (및 모든 컨트롤)이 모두로드되어 해당 데이터가 모두 사라 지지만 frmMain 개체가 계속 걸어 다니는 것입니다. 따라서 언로드 한 후에도 멤버 변수 및 속성에 계속 액세스 할 수 있습니다. 그러나 양식의 모든 컨트롤을 참조하면 암시 적으로 Load frmMain이 트리거됩니다. 이것은 VB6에서 많은 미묘한 프로그래밍 오류의 원인입니다. 특히 종료하려고 할 때 그렇습니다.

+0

사실이지만,이 답변은보다 일반적인 "싱글 톤 객체 다루기"가 아니라 "폼 다루기"를 나타 내기 위해 수정되어야합니다. 지금까지 내가 아는 한, VB6에서이 동작은 양식에만 해당됩니다. 새로운 프로그래머를 위해 단순화하려는 의도 였지만 문제를 많이 혼동하는 경향이있었습니다. 일반적으로 필자는 필자가 필요로하는 양식을 항상 인스턴스화하는 데 찬성하기를 피했습니다. 그냥 .net 시도하고 여전히 양식 유형을 직접 참조 할 수 있습니다. 그래도 그 문법에서 멀리 떨어져 있다고 말할 수 있습니다. – DarinH

+0

@drventure : 폼의 싱글 톤 특성은 숙련 된 VB6 개발자가 기대하는 행동입니다. 폼에 애플리케이션에서 싱글 톤 의미론이 있어야하는 이유는 없습니다. 사실, VB6를 배우고 싶다면이 내용을 자세히 이해해야하며 일단 그렇게하면 큰 문제가되지 않습니다. –

+2

이것은 싱글 톤이 아니지만 (Form) 클래스와 동일한 이름의 기본 글로벌 인스턴스입니다. IDE 외부에서 .CLS 파일을 편집해야하지만 VB6 클래스에서도 동일한 작업을 수행 할 수 있습니다. 두 경우 모두 원하는만큼 많은 클래스 인스턴스를 만들 수 있으므로 싱글 톤이 아닙니다. http://en.wikipedia.org/wiki/Singleton_pattern – Bob77

2

예, VB6 및 이전 버전의 특수 기능입니다. 나는 대체로 도움이 아닌 혼란의 원천으로 보았 기 때문에 나는 그것을하지 않으려 고 노력했다.

다음 주석 Visual Basic 6.0 및 이전 버전에서는 각 폼의 특별한 기본 인스턴스가 자동으로 만들어지고 폼의 이름을 사용하여이 인스턴스에 액세스 할 수 있습니다.은이 MSDN 페이지에서 가져온 것입니다. Working with Multiple Forms in Visual Basic .NET: Upgrading to .NET

관련 문제