什么更好的方法,从另一个窗体调用形式

问题描述 投票:3回答:5

说我有2种形式命名,Form 1和Form。我想从在Form1窗体2调用一个函数ABC()。哪一个更好,为什么?

方法1:

 'In Form1
  Form2.abc()

方法2:

 'In Form1
  Dim oFrm As New Form2
  oFrm.abc()
vb6
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()你正在呼吁Form 2窗体的新创建的实例的ABC程序(可以替代形式词类如果它可以帮助你理解)。

当谈到时间,退出程序,你可以得到一个类型的错误,该程序是挂在内存中,但因为你已经关闭了所有可见的形式,但不是通过像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
投票

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

这也取决于你的函数的性质..它与窗口2干涉?它从窗口2使用数据? ....如果让我将直接调用该函数

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

如果要加载的Form2新实例,并让用户与交互,那么我会去的选项2


0
投票

第一种方法是好的,如果你知道窗体2已经加载,并使用functionName()可以在任何情况下全球范围内调用。第二种方法是最好的,如果你只需要执行哪些尚未加载Form2的特定功能。但是,你需要注意的内存泄漏:


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

1-检查Form2装?如果不是,它会首先装载。 2- FunctionName()执行-3- Form2将保留在存储器中,直到它被具体地卸载。

你将不得不清理,通过手动卸载窗体2

Unload Form2

否则,当你认为你已经关闭Form1和你结束程序,Form2已装入,并且您的可执行文件的过程中已经存在的任务管理器。


调用FunctionName()使用

Dim oFrm as New Form2
oFrm.FunctionName()

将确保加载窗体2的实例(在你的代码的本地环境),然后执行此功能,但你仍然需要卸载它,当你被用它做:

Unload oFrm

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


0
投票

改变私人Sub Form_Load()公共Sub Form_Load(),则可以从第二个形式调用它

例如,从窗口2要拨打Form1中form_load()

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

© www.soinside.com 2019 - 2024. All rights reserved.