позволяет ли VB6 ссылаться на экземпляр формы как на синглет, просто называя его тип данных? или что происходит?
Я вижу код типа "Unload frmMain", где из того, что я могу сказать frmMain-это имя типа/модуля, и я не думаю, что это также может быть одновременно имя переменной типа" ObjFrmMain". Тем не менее, эта команда успешно побуждает рассматриваемую форму к выгрузке.
Так используется ли тип данных в качестве псевдонима для его единственного существующего экземпляра? Или, может быть, для всех его экземпляров?
Делает ли VB6 аналогичные вещи с типами данных, отличными от производных от Форма?
2 ответов:
Да, 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 frmMainAs New, потому что это сбивает с толку и опасно. Он также имеет штраф за производительность, против этого:Dim newObject As MyClass Set newObject = New MyClass... но вы застряли с этим для форм.
То, что происходит при вызове
Unload frmMain, заключается в том, что он выгружает окно (и все элементы управления), поэтому все данные в них исчезли, но объектfrmMainвсе еще висит. Поэтому даже после его выгрузки вы все еще можете получить доступ к любым переменным-членам и свойствам. Однако, если что-либо ссылается на какой-либо элемент управления в форме, это вызовет неявноеLoad frmMain. Это является источником многих тонких ошибок программирования в VB6, особенно когда вы пытаетесь завершить работу.
Да, это специальная функциональность в VB6 и более ранних версиях. Обычно я старался этого не делать, так как видел в этом скорее источник замешательства, чем помощь.
Следующий комментарий в Visual Basic 6.0 и более ранних версиях для каждой формы автоматически создается специальный экземпляр по умолчанию, который позволяет использовать имя формы для доступа к этому экземпляру. взято с этой страницы MSDN: Работа с несколькими формами в Visual Basic .NET: обновление до .NET
Comments