我目前正在使用VB,VB有一个叫做“默认表单实例”的恼人功能,当你引用表单类而不是表单实例时,它会创建一个表单对象的默认实例。
例如:
public class frmMain
Inherits System.Windows.Forms.Form
end class
private Sub Sub1
frmMain.Show()
end Sub
上面的代码编译并运行时没有错误,因为运行时在按类名调用时会为您提供frmMain的新实例。
问题是:
有没有办法用我创建的实例替换默认实例? 另一种说法:有没有办法将我创建的实例设置为默认实例?
对于那些想问“为什么你真的需要这样的东西?”的人:
我有这个应用程序,我们称之为MyApplication.exe
,这是一个Windows窗体应用程序,frmMain
是主窗体。
应用程序中对主窗体的许多引用都是通过默认实例,到目前为止工作正常。
我正在对应用程序进行一些更改。我不必直接运行MyApplication.exe
,而是必须动态加载程序集并通过反射运行它。我是这样做的:
Dim assembly As Reflection.Assembly = LoadAssembly("MyApplication.exe")
Dim frm As Object = assembly.CreateInstance("MyApplication.frmMain")
frm.Show()
我通过反射创建并显示frmMain
的实例。稍后,当应用程序尝试通过默认实例访问frmMain
时,运行时会创建一个新的frmMain
实例,因为它认为默认实例尚未存在。但现在默认实例和屏幕上的实例是不同的对象。
底线是:通过反射,我试图模仿直接运行MyApplication.exe的确切行为。
答案 0 :(得分:0)
这不能通过尝试将默认实例表单设置为其他内容来证明
Dim newForm As New frmMain
My.Forms.frmMain = newForm
此代码抛出ArgumentException,说“Property只能设置为Nothing”
您应该添加一个字段,然后查找并替换所有默认表单实例引用到显式引用
Private _myfrmMain as new frmMain
private Sub Sub1
_myfrmMain.Show()
end sub
答案 1 :(得分:0)
从PROJECT菜单中选择最后一项。
就像
WindowsApplication1属性...
在关闭模式下的应用程序 TAB上将其更改为
最后一个表单关闭时
然后你可以有一个新的frmMain实例并关闭默认的Form1或者调用默认的Form。
我希望这会有所帮助。 : - )
Public Class Form1
Friend WithEvents frmMain As New Form
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
frmMain.Text = "frmMain"
frmMain.Show()
Me.Close()
End Sub
End Class