VB.NET之旅(一)—失蹤的窗體。本站提示廣大學習愛好者:(VB.NET之旅(一)—失蹤的窗體)文章只能為提供參考,不一定能成為您想要的結果。以下是VB.NET之旅(一)—失蹤的窗體正文
很久沒有新作,架不住冤家們的訊問與诘問,只得拿些舊作來補上近日沒空寫 作的缺乏。羞愧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,愛你難道真的這麼難……