说我有2个名为Form1和Form2的表单。我想从Form1的Form2中调用函数abc()。哪一个更好,为什么?什么是从另一种形式调用表单的更好方法
方法1:
'In Form1
Form2.abc()
方法2:
'In Form1
Dim oFrm As New Form2
oFrm.abc()
说我有2个名为Form1和Form2的表单。我想从Form1的Form2中调用函数abc()。哪一个更好,为什么?什么是从另一种形式调用表单的更好方法
方法1:
'In Form1
Form2.abc()
方法2:
'In Form1
Dim oFrm As New Form2
oFrm.abc()
在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情况下,可能会给你意外的结果。
如果你仅会窗体2的一个实例,然后只使用方法1
如果你需要不止一个实例或预计需要超过1个实例,然后使用方法2.
简短,甜美,实用的答案。 – JeffK 2013-02-23 14:29:46
虽然不是很准确。 – 2013-02-25 09:09:12
@ClaraOnager同意,下面的答案比较出色。你已经得到了我的赞赏。 – 2013-02-25 14:08:00
因为你是aski ng这个问题我假设你有form2已经加载,所以我会直接调用函数(选项1)
它也取决于你的函数的性质..它干扰form2?它使用form2的数据吗? ....如果这样我会调用该函数直接
如果它是一个全球性的功能,我不会把它放在窗口2,但在一个模块
如果要加载的Form2新实例,并有用户与之交互,然后我将选择2
如果您知道Form2已经加载,并且可以在任何上下文中全局调用FunctionName(),则第一种方法很好。第二种方法是最好的,如果你只需要在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
否则你的程序将泄漏内存,如第一种情况。
您的方法1只适用于函数为Shared的情况,第二种方法适用于函数。 – 2013-02-22 19:58:56
Sry。这是为vb6。 – Harke 2013-02-22 20:03:01
@SLaks所以你说这两种方法没有太大的区别? – Harke 2013-02-22 20:08:18