gpt4 book ai didi

oop - VB6 是否允许仅通过命名其数据类型来引用 Form 实例作为单例?或者发生了什么?

转载 作者:行者123 更新时间:2023-12-01 21:34:22 25 4
gpt4 key购买 nike

我看到类似“Unload 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 关键字中的奇怪之处:<​​/p>

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 中许多微妙编程错误的根源,尤其是当您尝试关闭时。

关于oop - VB6 是否允许仅通过命名其数据类型来引用 Form 实例作为单例?或者发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5118314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com