很久沒有新作,架不住朋友們的詢問與追問,只得拿些舊作來補上近日沒空寫 作的不足。慚愧ing!這一系列與Henry手記系列不同,是一個角色形式的情景故事 ,最初發表於《計算機世界》,適用於VB.net初學者,老鳥們就不用在我這一系 列的文章上浪費時間了。我希望自己有時間以後,能不斷繼續這一系列的文章, 加入大量的工程解決方案。同時,我的Henry手記也會繼續寫下去,以回報長期以 來支持我的所有朋友。
背景:我叫Henry,剛從大學計算機專業畢業,新 加入索易公司的.NET開發小組;負責帶我的頭目是大李,.NET高手,是個幽默又有 耐心的家伙;老白是我們部門的頭頭,經常帶給我們古怪又難纏的需求。
第一天上班,白經理就帶著我去.NET技術小組報到。“大李,這是新來的同 事,你要多幫幫他。”老白指著我對一個眼鏡後面透著閃閃目光的年輕人說 。
“沒問題,他會做得很好的。”大李難道會看相不成?還是 人家客氣呀?不管了,我只要自己努力就對了。
20分鐘後,我已經在分配 給我的一台P4電腦,WindowsXP平台下打開了Visual Studio.NET的集成編譯環境 (IDE)開始欣賞了。一個多漂亮的編譯環境呀,可以自選使用時的風格是VB6的還 是VC6的。我選擇的是RAD性能好的VB6風格。
“你剛開始接觸.NET, 在系統培訓之前先加深點印象,看看VB.NET與VB6有什麼不同吧。你創建兩個窗體 ,每個窗體上各有一個按鈕,點擊時隱藏其所在的那個窗體,切換出另一個窗體 來。”大李的聲音在耳邊響起,打斷了我對IDE的欣賞。但他提的要求也太 簡單了吧,在VB6中只需要兩句寫在按鈕的單擊響應中的語句就行了:
兩 個窗體:Form1與Form2。Form1上的按鈕為: Command1,Form2上的按鈕為: Command2
Private Sub Command1_Click() Me.Hide Form2.Show End Sub Private Sub Command2_Click() Me.Hide Form1.Show End Sub
於是,我毫不猶豫地在VS.NET中內開始我的第一個VB.NET的項 目了。首先,新建了一個VB.NET的Windows應用程序項目,自動生成了一個 Windows Form:Form1,在其上加入一個按鈕控件:Button1;然後,添加了一個 Windows Form:Form2,在其上加入了一個按鈕控件:Button2。
在設計窗口 雙擊Button1後,編譯器會切換到代碼窗口的Button1的單擊響應代碼中。
在代碼段中故計重施,當我想寫Form2.Show時,在Form2之後打個點,出現的智能 感知菜單中,卻沒有Show這一方法。真奇怪,這怎麼可能?難道VB.NET改動有這 麼大。我抬頭看了看站在我身旁的大李。
大李立刻面露微笑,看來是正中 他的圈套。他手指向屏幕,點了點Form1中的代碼的開頭處:
Public Class Form1 Inherits System.Windows.Forms.Form
不笨的我立刻就明白 了,現在的Form1是一個從System.Windows.Forms.Form繼承下來的類了,調用的 時候當然需要先實例化了,哈,也不難嘛。馬上動手:
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Me.Hide() Dim frm2 As New Form2() ‘實例化Form2類,得到 一個對象 frm2.Show() End Sub
在Form2的Button2的單擊事件中也相似地寫了一段代碼,運行 一下,和VB6的效果差不多了。正在得意中,大李走過來,在我的Form1中添加了 一個文本框textbox1,清空其中的文字。然後運行了一下程序。在運行中,他在 文本框裡寫了幾個字:“Henry的作品”,然後點擊Button1切換到 Form2,接著點擊Button2,重新出現的Form1的文本框中卻變成了空白。
“這……”我一時語塞,慢慢地想起點什麼, “應該是程序通過New構造方法,每次點擊按鈕都會重新實例化一次Form類 吧?所以每次重新出現的窗體都不是以前曾經出現過的那個。那以前的窗體也就 失蹤了,調不出來了。”
“失蹤?”大李不禁笑了起來 ,“對呀,失蹤在內存中。你每實例化一次,系統就會開辟一塊內存給一個 對象,並會有相應的線程對其進行控制與管理。如果作為進程中主線程的第一個 Form1被Hide起來,沒有關閉它,那麼即使你關閉後來新創建的所有窗體,進程也 不會被中止。那麼,用什麼方法去找回你失蹤的窗體,或者說怎麼樣就只使用一 個對象,不再每次實例化呢?”
“全局對象!”我脫口 而出,感覺到大李不置可否,只好硬著頭皮繼續說:“利用全局變量,使 Form1與Form2只實例化一次,這樣就可以了。”
然後,在大李的注 視下,我開始實施我的計劃:
再創建一個模塊文件:module1.vb,並且同 時在:
解決方案管理器-〉項目名.sln -〉右點鼠標 -〉屬性 -〉通用屬 性->常規->啟動對象 -〉改為Module1。讓程序啟動後先運行Module1中的 代碼指令,然後編寫代碼如下:
'Module1.vb Module Module1 Public frm1 As New Form1() ‘定義Form1的公用變量實 例 Public frm2 As New Form2() ‘定義Form1的公用變量實例 Sub Main() Application.Run(frm1) ‘這句話表明程序啟動了 modele後,會接下來運行frm1,即form1的一個實例。 主線程就成為運行期的frm1了。 End Sub End Module
這樣一來,frm1、frm2就成為全局變量了,在Button1與 Button2的單擊響應代碼中只要寫:frm1.show就可以了。
再運行程序,可 以了,“Henry的作品”一直都會保持在Form1中的文本框裡。
大李老哥沒等我歡笑起來就再次出手,在frm1隱藏起來的時候,關閉了Form2窗口 (frm2實例),桌面上什麼窗體都沒有了,進程又一次被陷入在無法中止的情況 下。My God,面向對象的VB.NET,愛你難道真的這麼難……