我正在使用通过自定义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来清除这一点,但是使用默认实例,所有这些实际上都隐藏在表单工厂中.