加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

vb.net – 何时创建默认表单实例?

发布时间:2020-12-17 07:13:51 所属栏目:百科 来源:网络整理
导读:在VB.NET中,表单实例的启动顺序和处理非常奇怪.当您引用表单时,例如Form2.Textbox1.Text =“Foo”,然后CLR自动使用在后台创建的表单实例,并可以通过My.Forms.Form2直接访问. 我正在使用通过自定义Sub Main()启动的WinForms应用程序.这里通过调用Application.
在VB.NET中,表单实例的启动顺序和处理非常奇怪.当您引用表单时,例如Form2.Textbox1.Text =“Foo”,然后CLR自动使用在后台创建的表单实例,并可以通过My.Forms.Form2直接访问.

我正在使用通过自定义Sub Main()启动的WinForms应用程序.这里通过调用Application.Run(frmMain)来运行应用程序.

由于我有多个需要初始化的表单,我想确切地知道真正的表单实例创建的位置.它们都是在Application.Run中创建的,还是仅在我调用Form2.Show()时创建的?我的启动顺序如下:

> Sub Main()
> Sub Main()调用Application.Run(frmMain)
> frmMain.Load调用frmNotMain.Show()

我现在可以找到像My.Forms.frmNotMain = New frmNotMain这样的行,所以在创建实例的地方并不明显.

先感谢您.

解决方法

According to MSDN:

When you access Form through My.Forms.Form1,the factory method checks to see if an instance of Form1 is already open. If it is,that instance is returned. Otherwise,an instance of Form1 is created and returned.

所以基本上它是在创建之前创建的并且Sub New在它被显示之前调用(不是在某处创建并保持直到需要).该链接包含此代码,显示它如何创建这些默认实例:

'Code ... generated by the compiler
Public m_Form1 As Form1
Public Property Form1() As Form1
    Get
        m_Form1 = Create__Instance__ (Of Form1)(m_Form1) 
        Return m_Form1 
    End Get
    Set(ByVal Value As Form1)
     If Value Is m_Form1
    Return
       End If
       If Not Value Is Nothing Then
          Throw New ArgumentException("Property can only be set to Nothing.")
       End If
       Dispose__Instance__ (Of Form1)(m_Form1)
    End Set
End Property

但是,您正在谈论默认(“奇怪”)实例方法,这种方法一开始是不明智的.这很大程度上是为了提供与VB6类型代码的兼容性,你只需要对实例执行myForm.Show()并显示一个表单(可能对于那些并不真正理解实例化或OOP的修补程序).

表单是类,应该通过显式创建实例来处理;所以,一般来说:

Dim frm As New frmMain                ' NEW creates the instance
frm.Show

您可以在表单的Sub New中的InitializeComponent上设置断点,以查看何时调用它.要创建对它的全局引用,就像使用任何其他类一样:

Friend frmMain As MainForm          ' no instance yet
Friend myMain As MainClass

Public Sub Main

    ' do this before any forms are created
    Application.EnableVisualStyles()

    myMain = New MainClass()
    myMain.DoStuff()

    frmMain = New MainForm()         ' instanced (NEW)

    Application.Run(frmMain)
End Sub

同样:

Dim frm2 = New frmNotMain       ' declare and instance

' short for:
Dim frm2 As frmNotMain          ' declare  frm2
frm2 = New frmNotMain           ' create instance

frm2.Show

在所有情况下,当您使用New运算符创建新表单时,将调用表单的Sub New. VB尝试通过重复使用New来清除这一点,但是使用默认实例,所有这些实际上都隐藏在表单工厂中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读