3

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

方法一:

 'In Form1
  Form2.abc()

方法二:

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

5 回答 5

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 替换为 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 的实例或重用可能会给您带来意外结果的现有实例。

于 2013-02-25T09:49:42.407 回答
1

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

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

于 2013-02-22T21:38:13.947 回答
0

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

它还取决于您的功能的性质..它会干扰form2吗?它使用来自form2的数据吗?....如果是这样我会直接调用该函数

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

如果你想加载一个新的 form2 实例,并让用户与之交互,那么我会选择选项 2

于 2013-02-23T12:41:56.383 回答
0

如果您知道 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

否则你的程序会像第一种情况一样泄漏内存。

于 2013-02-25T09:04:17.110 回答
0

将 private 更改Sub Form_Load()为 public Sub Form_Load(),然后可以从第二种形式调用它

例如,您想从 form2 调用 form1form_load()

应该使用:调用form1.form_load()

于 2019-02-03T22:16:09.913 回答