關於Visual Basic 2005 Beta中窗體互訪技術的思索

每一天,都有VB6的程序員開始轉入.NET開發,而他們面臨的最首要的問題,便是要習慣.NET裏那些面向對象的金科玉律。因此,論壇上總會重複地聽到網友們討論如何在Visual Basic .NET 2003中進行窗體之間的互相訪問的問題。早些時候,我特地發表了一篇關於此問題解決方案的文章,通過重寫Sub New,利用Me關鍵字在新窗體中獲得另一個窗體的實例。現在VB2005的時代馬上要到來了,會不會有更簡單的方法呢?答案是肯定的,所有的奧祕都藏在了My.Forms命名空間裏!

其實這裏本沒有什麼值得大書特書的地方,維護任何一個窗體類的默認實例,在VB的早期版本就提供了這項功能了。在.NET 2003,VB爲了追求和其他面嚮對象語言風格上的一致,就忍痛把這個特性割掉。而VB2005在革新的同時,微軟似乎從更理性的角度去看待那些VB6裏被刪去的特性(存在即是有理,不是嗎?75_75.gif),維護窗體默認類便是被重新拾回的一項技術。只不過,現在所有窗體的默認實例都被統一在了My.Forms命名空間下(例如My.Forms.Form2),改變了VB6裏混亂之治的風格(Oops,涕淌魔獸玩得走火入魔了呵呵)。但是儘管如此,你在寫代碼時,仍然可以省略前面的My.Forms,比如你可以在Form2.vb裏這樣寫:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles Button1.Click
    Form1.Text = "Hello My.Forms"
End Sub

哈哈,是不是又找到了VB6的感覺了?

其實我剛接觸到2005裏的這個特性時,我還頗有些不適應呢。由於習慣了在2003下開發,我總是自己去New一個窗體。於是我曾經突發奇想,如果每次啓動程序,是不是My.Forms都爲我們自動生成一個默認的窗體實例,如果我們用不到這個實例,豈不是很浪費內存?其實不是這樣的,我覺得有必要在這裏說以下。

Visual Basic在執行你的代碼時,當遇到了對My.Forms下某一個實例的引用,say,Form2,那麼,它做的第一件事是先判斷Form2窗體的默認實例(注意,是默認實例而不是你自己New出來的實例)是否已被創建。如果是的話,就引用這個實例;否的話,就創建一個默認實例。也就是說,如果你的代碼里根本沒有出現My.Forms.Form2的話,Form2的默認實例就根本不會被創建!所以說,My.Forms命名空間只是自動維護窗體的默認實例,而不是自動創建。同樣地,My.Forms一般情況下也不負責默認實例的自動回收。

我在上面一直在強調“默認”二字,是因爲我想讓你記住,默認畢竟只是默認,它還是有一點點侷限性:比如你不得不自己New一個窗體實例時,它就不會被包含在My.Forms空間下。所以我想說,如果你的程序裏某一個窗體需要被創建很多實例的話,掌握一下VB2003裏的窗體互訪技術還是有些必要的。我從前的那篇文章寫得有點趕,沒有把代碼的細節寫出來,所以有些網友向我抱怨。趁着這個機會我細緻地講解一下:

我還是假設你的主窗體類名爲Form1,新窗體類名爲Form2,那麼你現在先重寫一下Form2的Sub New,使它能夠接受主窗體的實例。你恐怕已經發現你找不到原來的那個Sub New了吧?沒錯,VB 2005 Beta向程序員隱藏了Windows自動生成窗體的代碼。你是不是想起了VB6呀?哦,你和我產生同樣的錯覺了呵呵。其實這些代碼並沒有隱藏,只是被分離到Form2.Designer.vb文件下了(不信,你去打開看看teeth_smile.gif)。其實這是VB2005裏的一個新得令人稱奇的特性,稱之爲Partial Types或是部分類型。限於篇幅,關於部分類型的介紹,此處從略。

先在Form2.vb中定義一個Form1類型的全局變量:
Dim frmMain As Form1

然後再重寫Sub New,使frmMain指向傳入的Form1實例:
Sub New(ByVal frm As Form1)
    MyClass.New()
    frmMain = frm
End Sub

回到Form1.vb,我們這樣創建一個Form2的實例:
Dim frmNew As New Form2(Me)

現在,你就可以在Form2.vb中隨心所欲地調用主窗體實例了。

提到了Sub New,你也可以直接在Form2.Designer.vb裏重寫,不過既然微軟把這些代碼分離出來,一方面就是爲了避免它們遭到污染,所以除非你是老鳥,否則我不建議你這樣做。

篇末,讓我們再回到Visual Basic 2005的My關鍵字。My向我們展示了她朝氣蓬勃的一面,但你仔細看看,居然還能找出些返璞歸真的味道來呢,比如說窗體的互訪,就是如此。總之,My是VB2005裏一個值得大書特書的新特性。如果你現在想了解My關鍵字更多的內容,你可以先參考我的關於My的一篇很簡單的譯文,然後自己在智能感知下試一試。如果你想更詳細地瞭解My,包括上面提到的部分類型,就到我師兄Ninputer的blog裝配中的腦袋裏去找吧(那幾篇文章是我迄今見到的最詳細的)。我想,你每瞭解My的一項新功能,你一定會發出一聲感嘆:“Oh, My God!”
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章