예, 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에서 많은 미묘한 프로그래밍 오류의 원인입니다. 특히 종료하려고 할 때 그렇습니다.
각 클래스의 양식에 대해서만 암시적인 전역'Dim frmMain As New frmMain'이 있습니다. 이것은'SELECT ... WHERE Field LIKE frmMain! TextBox.Text' 쿼리를 사용할 수있는 MS Access 스타일의 코딩과의 호환성을 위해 남아 있습니다. – wqw