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

Har*_*rke 3 vb6

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

方法1:

 'In Form1
  Form2.abc()
Run Code Online (Sandbox Code Playgroud)

方法2:

 'In Form1
  Dim oFrm As New Form2
  oFrm.abc()
Run Code Online (Sandbox Code Playgroud)

Car*_*ger 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
Run Code Online (Sandbox Code Playgroud)

因此,当您调用Form2.abc()时,您正在新创建的Form2表单实例上调用abc过程(如果它有助于您理解,则可以将单词class替换为表单).

当退出程序时,你可以得到一种错误,程序在内存中闲逛,但在屏幕上看不到,因为你已经关闭了所有可见的表单,但没有关闭通过调用实例化的表单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
Run Code Online (Sandbox Code Playgroud)

当您为变量标注尺寸并为其指定新的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
Run Code Online (Sandbox Code Playgroud)

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