private sub button1_click(byval sender as system.object, _ 
byval e as system.eventargs) handles button1.click 
myform2 = new form2() 
myform2.show() 
end sub 
private sub button2_click(byval sender as system.object, _ 
byval e as system.eventargs) handles button2.click 
calculations.compoundinterestcalc(myform2) 
end sub 
end class 
無論是把窗體指針全局化,還是把它以參數(shù)的形式傳遞,都是可行的。然而,你必須根據(jù)項(xiàng)目的需要選擇最佳方案。當(dāng) .net 項(xiàng)目中只有少數(shù)幾個(gè)過程需要訪問特定窗體時(shí),我建議你給這些過程增加一個(gè)參數(shù),以在必要時(shí)接受窗體指針。當(dāng)你的項(xiàng)目有太多過程需要訪問該窗體時(shí),你就應(yīng)該考慮設(shè)置一個(gè)全局窗體指針變量。當(dāng)然了,你最好還是考慮調(diào)整項(xiàng)目代碼結(jié)構(gòu),使得真正訪問該窗體的類或者過程只有一個(gè)。如果你希望用窗體來顯示登錄信息,則你可以先創(chuàng)建一個(gè)類,把窗體實(shí)例保存為它的 shared 類成員,然后添加一個(gè) shared 方法 writetologwindow 來完成實(shí)際的窗體訪問。于是,項(xiàng)目中的任何代碼只需調(diào)用此 writetologwindow 方法就能間接訪問顯示登錄信息的窗體了: 
public class log 
private shared m_logform as form2 
public shared property logform() as form2 
get 
return m_logform 
end get 
set(byval value as form2) 
m_logform = value 
end set 
end property 
public shared sub writetologwindow(byval message as string) 
dim sb as new _ 
stringbuilder(m_logform.txtloginfo.text) 
sb.append(environment.newline) 
sb.append(message) 
m_logform.txtloginfo.text = sb.tostring() 
end sub 
end class 
讀取和改變窗體內(nèi)的信息 
到現(xiàn)在為止,我們討論的只是如何創(chuàng)建和訪問窗體實(shí)例,而沒有涉及如何讀取或改變窗體內(nèi)的信息。如果你的窗體已經(jīng)按照前述方法實(shí)例化,并且訪問窗體的代碼都位于窗體所在的項(xiàng)目中,則你可以直接操作窗體中的任何控件來讀取和改變窗體內(nèi)的信息。但我覺得這樣并不理想。與其直接訪問窗體中的文本框、按鈕等控件,還不如增加一個(gè) public 屬性,通過它來控制窗體中的控件。如果你有意嘗試這種特殊的窗體訪問方式,請(qǐng)跟我來: 
在 visual basic .net 中新建一個(gè) windows 應(yīng)用程序項(xiàng)目。 
此時(shí)項(xiàng)目中已經(jīng)自動(dòng)生成了一個(gè)窗體 form1 。現(xiàn)在添加另一個(gè)窗體 form2 :在“解決方案資源管理器”中按右鍵單擊項(xiàng)目名稱 -> “添加” -> “添加 windows 窗體” -> 點(diǎn)擊“打開”以接受默認(rèn)名稱 form2.vb 。 
在 form1 中添加兩個(gè)按鈕,分別按照默認(rèn)值命名為 button1 和 button2 ,并且調(diào)整它們?cè)诖绑w中的位置以免重疊。 
在 form2 中添加一個(gè)簡(jiǎn)單文本框,按照默認(rèn)值命名為 textbox1 
把下列代碼添加到 form2 的“end class”前面 (在“解決方案資源管理器”中按右鍵單擊 “form2”-> “查看代碼”,再粘貼下列代碼): 
public property customername() as string 
get 
return textbox1.text 
end get 
set(byval value as string) 
textbox1.text = value 
end set 
end property 
接下來要做的是: 
a. 切換到 form1 的代碼,在 “inherits system.windows.forms.form” 后面增加一行: 
dim myform2 as new form2() 
b. 在 form1 中雙擊button1 按鈕,在它的 click 事件處理程序代碼中輸入下列代碼: 
myform2.customername = "fred" 
myform2.show() 
c. 在 form1 中雙擊button2 按鈕,在它的 click 事件處理程序代碼中輸入下列代碼: 
messagebox.show(myform2.customername) 
myform2.customername = "joe" 
d. 按 f5 運(yùn)行項(xiàng)目,并點(diǎn)擊窗體中的 button1 和 button2 按鈕,以觀察代碼運(yùn)行情況。 
表面看來,通過 customername 屬性來訪問 form2 與直接訪問 form2 非常相似。然而,這種間接的窗體訪問方式能夠帶來很多好處,其中最重要的一點(diǎn)就在于它實(shí)現(xiàn)了更高的抽象性。換言之,哪怕你不知道 form2 中控件的任何細(xì)節(jié) (比如:窗體中是否包含 textbox 控件) ,也能與 form2 交換數(shù)據(jù);你所要做的只是讀取或設(shè)置 customername 屬性值而已。有了這種抽象,你就能在修改 form2 的實(shí)現(xiàn)時(shí)不影響項(xiàng)目中的其它代碼,因而大大簡(jiǎn)化了整個(gè)項(xiàng)目代碼的維護(hù)。單從本文的例子來看,這種基于屬性的窗體編程模式似乎并不比常規(guī)方式簡(jiǎn)單。然而,它以屬性的形式隱藏了窗體的全部細(xì)節(jié),故能用簡(jiǎn)潔、一致的代碼來訪問窗體。所以,它在一些相當(dāng)復(fù)雜的用戶界面編程中能夠大顯身手。總而言之,通過屬性值來訪問窗體及其控件的編程模式雖然不太直觀,卻對(duì)程序員很有價(jià)值:它不但比直接訪問窗體的編程模式來得更專業(yè),而且讓整個(gè)項(xiàng)目的代碼清晰易讀。 
在項(xiàng)目中我采用的是全局變量的方法,代碼如下:
public class myform
    private shared m_mainform as system.windows.forms.form
    public shared property mainform() as system.windows.forms.form
        get
            return m_mainform
        end get
        set(byval value as system.windows.forms.form)
            m_mainform = value
        end set
    end property
    end class
新聞熱點(diǎn)
疑難解答
圖片精選