2011-02-18 46 views
2

我现在正在使用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

这不能做就证明了尝试设置默认实例形式到别的

Dim newForm As New frmMain 
    My.Forms.frmMain = newForm 

该代码将引发ArgumentException说:“属性只能设置为Nothing”

您应该添加然后查找并替换所有默认表单实例引用以显式引用

Private _myfrmMain as new frmMain 
private Sub Sub1 
_myfrmMain.Show() 
end sub 
0

从PROJECT菜单中选择最后一项。

它会像

WindowsApplication1属性...

应用选项卡下关断模式当最后一个窗体关闭

将其更改为

然后你就可以有frmMain的新实例,并关闭默认的Form1上或任何默认的表单被调用。

我希望这会有所帮助。 :-)

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