Да, у VB6 странное поведение объекта.Это дает вам несколько ярлыков для работы с объектами формы.
Load frmMain
... загрузит один экземпляр этой формы под именем этой переменной.Фактически:
frmMain.lblSomeLabel.Caption = "some caption"
... загрузит этот экземпляр.Однако:
frmMain.SomeStringMember = "some value"
... не будет загружать объект формы (то есть само окно), но вы можете получить доступ к этим переменным, поэтому, по сути, имя формы являетсяглобальная переменная.
Однако вы можете создавать новые экземпляры:
Dim newForm As MyForm
Set newForm = New MyForm
newForm.Show vbModal
Это фактически создаст новый экземпляр MyForm
, загрузит его и покажет, чтобы вы могли иметь несколькоэкземпляры одной формы.
Также остерегайтесь странности в ключевом слове New
:
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, особенно когда вы пытаетесь завершить работу.