Vb6 从另一个窗体调用窗体的更好方法是什么

Vb6 从另一个窗体调用窗体的更好方法是什么,vb6,Vb6,假设我有两个表单,分别命名为Form1和Form2。我想从Form1调用Form2中的函数abc()。哪一个更好,为什么 方法1: 'In Form1 Form2.abc() 方法2: 'In Form1 Dim oFrm As New Form2 oFrm.abc() 如果只有一个Form2实例,那么就使用方法1 如果您需要多个实例,或者预期需要多个实例,请使用方法2。因为您要问这个问题,我假设您已经加载了form2,所以我会直接调用函数(选项1) 这还取决于你的职能性质。

假设我有两个表单,分别命名为Form1和Form2。我想从Form1调用Form2中的函数abc()。哪一个更好,为什么

方法1:

 'In Form1
  Form2.abc()
方法2:

 'In Form1
  Dim oFrm As New Form2
  oFrm.abc()

如果只有一个Form2实例,那么就使用方法1


如果您需要多个实例,或者预期需要多个实例,请使用方法2。

因为您要问这个问题,我假设您已经加载了form2,所以我会直接调用函数(选项1)

这还取决于你的职能性质。。它会干扰form2吗?它是否使用来自form2的数据。。。。如果是这样,我会直接调用函数

如果它是一个全局函数,我不会把它放在表单2中,而是放在一个模块中


如果您想加载form2的一个新实例,并让用户与之交互,那么我将使用选项2。如果您知道form2已经加载,并且可以在任何上下文中全局调用FunctionName(),那么第一种方法很好。如果您只需要执行Form2中尚未加载的特定函数,则第二种方法是最好的。但是,您需要注意内存泄漏:


使用
Form2.FunctionName()
Form2
调用函数将执行以下操作:

1-检查是否加载了
Form2
?如果没有,将首先加载它。 2-执行
FunctionName()
3-
Form2
将保留在内存中,直到它被专门卸载

您必须通过手动卸载Form2来进行清理

Unload Form2
否则,当您认为已关闭
Form1
并结束程序时,
Form2
已加载,可执行文件的进程已存在于TaskManager中


使用调用
FunctionName()

Dim oFrm as New Form2
oFrm.FunctionName()
将确保加载Form2的实例(在代码的本地上下文中),然后执行该函数,但在通过以下方式完成操作时,仍需要卸载该函数:

Unload oFrm

否则,您的程序将像第一种情况一样泄漏内存。

在VB6中,当程序运行时,只要您通过窗体名称引用窗体,VB6就会创建该窗体的实例。该实例也被添加到表单集合中

您可以发现使用此代码或其适当变体实例化了哪些表单:

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过程(如果有助于理解的话,您可以用word类替换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的新实例时,您正在根据变量创建一个具有作用域的新表单。实例未添加到表单集合中:

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

因此,您的第二个方法通常是更好的方法,因为它不会在表单集合中创建Form2的实例,也不会重用可能会给您带来意外结果的现有实例。

将private
Sub Form\u Load()
更改为public
Sub Form\u Load()
,然后可以从第二个表单调用它

例如,在form2中,您希望调用form1
form\u load()


应该使用:call
form1.form\u load()

您的方法1仅在函数共享的情况下有效,第二种方法是例如函数。@SLaks So r u表示这两种方法之间没有太大区别???@SLaks Ok。那么哪一个更好呢?对于您定义的每个表单的默认实例,没有什么“邪恶”的。有人需要小睡一会儿。方法2更好,因为它允许您同时看到多个
Form2
实例。方法1是一种与MS Access兼容的遗留功能,用于处理表单,您可以在查询中引用应用程序表单中的控件,例如
where Name=Form2!txtName
——纯粹邪恶地违反了应用层分离。简短、甜蜜、实用的答案。@ClaraOnger同意,相比之下,你下面的答案是非常好的。我投你一票。