假设我有两个名为Form1和Form2的表单。我想从Form1调用Form2中的函数abc()。哪一个更好,为什么?
方法1:
'In Form1
Form2.abc()
方法2:
'In Form1
Dim oFrm As New Form2
oFrm.abc()
答案 0 :(得分:5)
在程序运行的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替换为表单)。
当退出程序时,您可能会遇到一种错误,程序在内存中闲逛,但在屏幕上看不到,因为您已关闭所有可见的表单,但不是通过{{ {1}}。这导致流行的“关闭所有表单”代码被添加到许多VB6程序的退出过程中:
Form2.abc
当您为变量标注尺寸并为其指定新的Form2实例时,您将根据变量创建一个具有范围的新表单。实例不已添加到Forms集合中:
Private Sub cmdExit_Click()
Dim current As Form
Dim output As String
For Each current In Forms
Unload current
Next
End Sub
因此,您的第二个方法通常是更好的方法,因为它不会在Forms集合中创建Form2的实例,或者重用可能会给您带来意外结果的现有实例。
答案 1 :(得分:1)
如果您只有一个Form2实例,那么只需使用方法1.
如果您需要多个实例或预计需要多于1个实例,请使用方法2。
答案 2 :(得分:0)
因为你问这个问题我假设你已经加载了form2,所以我会直接调用该函数(选项1)
它还取决于你的功能的性质..它是否会干扰form2?它使用来自form2的数据吗? ....如果是这样我会直接调用函数
如果它是一个全局函数,我不会把它放在form2中,而是放在一个模块中
如果你想加载一个新的form2实例,让用户与之交互,那么我会选择2
答案 3 :(得分:0)
如果您知道已加载Form2,则第一种方法很好,并且可以在任何上下文中全局调用FunctionName()。如果您只需要在Form2中执行尚未加载的特定函数,则第二种方法是最好的。但是,您需要注意内存泄漏:
使用Form2
从Form2.FunctionName()
调用函数将执行以下操作:
1-检查是否已加载Form2
?如果没有,它将首先加载。
2-执行FunctionName()
<{1}}将保留在内存中,直到它被专门卸载。
您必须通过
手动卸载Form2来清理Form2
否则,当您认为已关闭Unload Form2
并且您已结束该程序时,Form1
已经加载,并且您的可执行文件的进程已经在任务管理器。
使用
调用Form2
FunctionName()
将确保加载Form2的一个实例(在代码的本地上下文中)然后执行该函数,但是当你完成它时仍然需要卸载它:
Dim oFrm as New Form2
oFrm.FunctionName()
否则你的程序会像第一种情况一样泄漏内存。
答案 4 :(得分:0)
将私有Sub Form_Load()
更改为公共Sub Form_Load()
,然后可以从第二种形式调用
例如,您要从form2调用form1 form_load()
应使用:致电form1.form_load()