關于Visual Basic 2005窗體互訪技術的思索
2024-07-21 02:20:54
供稿:網友
每一天,都有vb6的程序員開始轉入.net開發,而他們面臨的最首要的問題,便是要習慣.net里那些面向對象的金科玉律。因此,論壇上總會重復地聽到網友們討論如何在visual basic .net 2003中進行窗體之間的互相訪問的問題。早些時候,我特地發表了一篇關于此問題解決方案的文章,通過重寫sub new,利用me關鍵字在新窗體中獲得另一個窗體的實例。現在vb2005的時代馬上要到來了,會不會有更簡單的方法呢?答案是肯定的,所有的奧秘都藏在了my.forms命名空間里!
其實這里本沒有什么值得大書特書的地方,維護任何一個窗體類的默認實例,在vb的早期版本就提供了這項功能了。在.net 2003,vb為了追求和其他面向對象語言風格上的一致,就忍痛把這個特性割掉。而vb2005在革新的同時,微軟似乎從更理性的角度去看待那些vb6里被刪去的特性(存在即是有理,不是嗎?),維護窗體默認類便是被重新拾回的一項技術。只不過,現在所有窗體的默認實例都被統一在了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文件下了(不信,你去打開看看)。其實這是vb2005里的一個新得令人稱奇的特性,稱之為partial types或是部分類型。限于篇幅,關于部分類型的介紹,此處從略。
先在form2.vb中定義一個form1類型的全局變量:
dim frmmain as form1
然后再重寫sub new,使frmmain指向傳入的form1實例:
sub new(byval frm as form1)
mybase.new()
initializecomponent()
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!”
本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。