2013-02-22 26 views
3

说我有2个名为Form1和Form2的表单。我想从Form1的Form2中调用函数abc()。哪一个更好,为什么?什么是从另一种形式调用表单的更好方法

方法1:

'In Form1 
    Form2.abc() 

方法2:

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

您的方法1只适用于函数为Shared的情况,第二种方法适用于函数。 – 2013-02-22 19:58:56

+0

Sry。这是为vb6。 – Harke 2013-02-22 20:03:01

+0

@SLaks所以你说这两种方法没有太大的区别? – Harke 2013-02-22 20:08:18

回答

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()你正在呼吁的新创建的实例的ABC程序Form2表单(如果能帮助你理解,你可以用表单来替换表单)。

当需要退出程序时,您可以获得一种错误类型,其中程序在内存中悬停,但在屏幕上不可见,因为您关闭了所有可见窗体,但不是通过调用实例化的窗体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集合创建窗体2的实例或重用exisiting情况下,可能会给你意外的结果。

1

如果你仅会窗体2的一个实例,然后只使用方法1

如果你需要不止一个实例或预计需要超过1个实例,然后使用方法2.

+0

简短,甜美,实用的答案。 – JeffK 2013-02-23 14:29:46

+0

虽然不是很准确。 – 2013-02-25 09:09:12

+1

@ClaraOnager同意,下面的答案比较出色。你已经得到了我的赞赏。 – 2013-02-25 14:08:00

0

因为你是aski ng这个问题我假设你有form2已经加载,所以我会直接调用函数(选项1)

它也取决于你的函数的性质..它干扰form2?它使用form2的数据吗? ....如果这样我会调用该函数直接

如果它是一个全球性的功能,我不会把它放在窗口2,但在一个模块

如果要加载的Form2新实例,并有用户与之交互,然后我将选择2

0

如果您知道Form2已经加载,并且可以在任何上下文中全局调用F​​unctionName(),则第一种方法很好。第二种方法是最好的,如果你只需要在Form2中执行一个尚未加载的特定函数。但是,你需要注意的内存泄漏:


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

1-检查Form2装?如果不是,它将首先被加载。 2-执行FunctionName() 3- Form2将保留在内存中,直到它被明确卸载。

你将不得不清理,由

Unload Form2 

否则手动卸载窗体2,当你认为您已关闭Form1和你结束程序,Form2已加载和过程的可执行文件已经存在于TaskManager中。


使用

Dim oFrm as New Form2 
oFrm.FunctionName() 

将确保加载窗体2的实例(在你的代码的本地环境),然后执行函数调用FunctionName(),但你仍然需要卸载它,当你完成通过它:

Unload oFrm 

否则你的程序将泄漏内存,如第一种情况。

相关问题