假设我有 2 个名为 Form1 和 Form2 的表单。我想从 Form1 调用 Form2 中的函数 abc()。哪个更好,为什么?
方法一:
'In Form1
Form2.abc()
方法二:
'In Form1
Dim oFrm As New Form2
oFrm.abc()
假设我有 2 个名为 Form1 和 Form2 的表单。我想从 Form1 调用 Form2 中的函数 abc()。哪个更好,为什么?
方法一:
'In Form1
Form2.abc()
方法二:
'In Form1
Dim oFrm As New Form2
oFrm.abc()
在 VB6 中,当程序运行时,只要您通过表单名称引用表单,VB6 就会创建该表单的实例。该实例也被添加到 Forms 集合中。
您可以发现使用此代码或其合适的变体实例化了哪些表单:
Dim frmCurrent As Form
Dim output As String
For Each frmCurrent In Forms
output = output & frmCurrent.Name & vbCrLf
Next
MsgBox output
因此,当您调用 Form2.abc() 时,您是在对新创建的 Form2 表单实例调用 abc 过程(如果有助于理解,您可以将单词 class 替换为 form)。
当需要退出程序时,您可能会遇到一种错误,即程序在内存中徘徊,但在屏幕上不可见,因为您已关闭所有可见表单,但未关闭通过调用实例化的表单,例如Form2.abc
. 这导致流行的“关闭所有表单”代码被添加到许多 VB6 程序的退出过程中:
Private Sub cmdExit_Click()
Dim current As Form
Dim output As String
For Each current In Forms
Unload current
Next
End Sub
当您标注一个变量并为其分配一个新的 Form2 实例时,您正在根据该变量创建一个具有范围的新表单。该实例未添加到 Forms 集合中:
Dim frmNew As New frmTest
frmNew.abc
Dim frmCurrent As Form
Dim output As String
For Each frmCurrent In Forms
output = output & frmCurrent.Name & vbCrLf
Next
MsgBox output 'Does not include frmNew aka frmTest
因此,您的第二种方法通常更好,因为它不会在 Forms 集合中创建 Form2 的实例或重用可能会给您带来意外结果的现有实例。
如果您只有一个 Form2 实例,那么只需使用方法 1。
如果您需要多个实例或预计需要多个实例,请使用方法 2。
因为您在问这个问题,所以我假设您已经加载了 form2,所以我会直接调用该函数(选项 1)
它还取决于您的功能的性质..它会干扰form2吗?它使用来自form2的数据吗?....如果是这样我会直接调用该函数
如果它是一个全局函数,我不会把它放在 form2 中,而是放在一个模块中
如果你想加载一个新的 form2 实例,并让用户与之交互,那么我会选择选项 2
如果您知道 Form2 已经加载,则第一种方法很好,并且可以在任何上下文中全局调用 FunctionName()。如果您只需要在 Form2 中执行尚未加载的特定功能,则第二种方法最好。但是,您需要注意内存泄漏:
Form2
从using调用函数Form2.FunctionName()
将执行以下操作:
1-检查是否Form2
已加载?如果没有,它将首先加载。2-FunctionName()
被执行 3-Form2
将保留在内存中,直到它被专门卸载。
您必须通过手动卸载 Form2 来清理
Unload Form2
否则,当您认为 您已经关闭Form1
并结束程序时,Form2
已经加载并且您的可执行文件的进程已经存在于TaskManager中。
调用FunctionName()
使用
Dim oFrm as New Form2
oFrm.FunctionName()
将确保加载 Form2 的实例(在代码的本地上下文中)然后执行该函数,但是当您完成它时仍然需要卸载它:
Unload oFrm
否则你的程序会像第一种情况一样泄漏内存。
将 private 更改Sub Form_Load()
为 public Sub Form_Load()
,然后可以从第二种形式调用它
例如,您想从 form2 调用 form1form_load()
应该使用:调用form1.form_load()