2011-02-18 66 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