什么是从另一种形式调用表单的更好方法

时间:2013-02-22 19:56:52

标签: vb6

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

方法1:

 'In Form1
  Form2.abc()

方法2:

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

5 个答案:

答案 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,则第一种方法很好,并且可以在任何上下文中全局调用F​​unctionName()。如果您只需要在Form2中执行尚未加载的特定函数,则第二种方法是最好的。但是,您需要注意内存泄漏:


使用Form2Form2.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()