VB6 позволяет ссылаться на экземпляр Form как на одиночный, просто называя его тип данных?или что происходит? - PullRequest
4 голосов
/ 25 февраля 2011

Я вижу код типа «Unload frmMain», где, как я могу сказать, frmMain - это имя типа / модуля, и я не думаю, что оно также может быть одновременно именем переменной сортировки «ObjFrmMain». Тем не менее, эта команда успешно вынуждает данную форму выгружаться.

Так что тип данных используется в качестве псевдонима для его единственного существующего экземпляра? Или, может быть, для всех его случаев?

Делает ли VB6 аналогичные типы данных, кроме тех, которые получены из формы?

Ответы [ 2 ]

7 голосов
/ 25 февраля 2011

Да, у 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, особенно когда вы пытаетесь завершить работу.

2 голосов
/ 25 февраля 2011

Да, это особый функционал в VB6 и более ранних версиях.Обычно я старался избегать этого, так как воспринимал это скорее как источник путаницы, а не как помощь.

Следующий комментарий В Visual Basic 6.0 и более ранних версиях - специальный экземпляр по умолчанию для каждой формысоздается автоматически и позволяет использовать имя формы для доступа к этому экземпляру. взято с этой страницы MSDN: Работа с несколькими формами в Visual Basic .NET: обновление до .NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...