![](/img/trans.png)
[英]In VB, is there a way to create an instance of the current type without naming it?
[英]does VB6 allow referencing Form instance as a singleton just by naming its data type? or what is happening?
我看到的代码如“卸载frmMain”,我可以告诉frmMain是类型/模块名称,我不认为它也可以同时是“ObjFrmMain”排序的变量名称。 尽管如此,此命令确实成功地导致有问题的表单卸载。
那么数据类型是否用作其单个现有实例的别名? 或者也许对于它的所有实例?
VB6是否对数据类型做了类似的事情,而不是从Form派生的数据类型?
是的,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中许多细微编程错误的根源,尤其是在您尝试关闭时。
是的,这是VB6及更早版本中的一项特殊功能。 我通常试图避免这样做,因为我把它看作是混乱的来源而不是帮助。
以下注释在Visual Basic 6.0和早期版本中,将自动为您创建每个表单的特殊默认实例,并允许您使用表单的名称来访问此实例。 取自此MSDN页面: 在Visual Basic .NET中使用多个表单:升级到.NET
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.