使用多個(gè)同名的變量
如果不同模塊中的公用變量使用同一名字,則通過(guò)同時(shí)引用模塊名和變量名就可以在代碼中區(qū)分它們。例如,如果有一個(gè)在 form1 和 module1 中都聲明了的公用 integer 變量 intx,則把它們作為 module1.intx 和 form1.intx 來(lái)引用便得到正確值。
為了看清這是如何工作的,在一個(gè)新工程中插入兩個(gè)標(biāo)準(zhǔn)模塊,并在窗體上畫(huà)上三個(gè)命令按鈕。
在第一個(gè)標(biāo)準(zhǔn)模塊 module1 之中聲明一個(gè)變量 intx。test 過(guò)程設(shè)置它的值:
public intx as integer ‘聲明 module1 的 intx。
sub test ()
’設(shè)置 module1 的 intx 變量的值。
intx = 1
end sub
在第二個(gè)標(biāo)準(zhǔn)模塊 module2 中聲明了第二個(gè)變量 intx,它有相同的名字。又是名為 test 的過(guò)程設(shè)置它的值:
public intx as integer ‘聲明了 module2 的 intx。
sub test ()
’設(shè)置 module2 的 intx 變量的值。
intx = 2
end sub
在窗體模塊中聲明了第三個(gè)變量 intx。名為 test 的過(guò)程又一次設(shè)置它的值。
public intx as integer ‘聲明了該窗體的 intx 變量。
sub test ()
’ 設(shè)置 form 中的 intx 變量值。
intx = 3
end sub
在三個(gè)命令按鈕的 click 事件過(guò)程中,每一個(gè)都調(diào)用了相應(yīng)的 test 過(guò)程,并用 msgbox 來(lái)顯示這三個(gè)變量的值。
private sub command1_click ()
module1.test ‘ 調(diào)用 module1 中的 test。
msgbox module1.intx ’ 顯示 module1 的 intx。
end sub
private sub command2_click ()
module2.test ‘ 調(diào)用 module2 中的 test。
msgbox module2.intx ’ 顯示 module2 的 intx。
end sub
private sub command3_click ()
test ‘ 調(diào)用 form1 中的 test。
msgbox intx ’ 顯示 form1 的 intx。
end sub
運(yùn)行應(yīng)用程序,單擊三個(gè)命令按鈕中的每一個(gè)按鈕。于是將看到三個(gè)公用變量被分別引用。注意在第三個(gè)命令按鈕的 click 事件過(guò)程中,在調(diào)用 form1 的 test 過(guò)程時(shí)不必指定 form1.test,在調(diào)用 form1 的 integer 變量的值時(shí)也不必指定 form1.intx 。如果多個(gè)過(guò)程或變量同名,則 visual basic 會(huì)取變化更受限制的值,在這個(gè)例子中,就是 form1 變量。
公用變量與局部變量的比較
在不同的范圍內(nèi)也可有同名的變量。例如,可有名為 temp 的公用變量,然后在過(guò)程中聲明名為 temp 的局部變量。在過(guò)程內(nèi)通過(guò)引用名字 temp 來(lái)訪(fǎng)問(wèn)局部變量;而在過(guò)程外則通過(guò)引用名字 temp 來(lái)訪(fǎng)問(wèn)公用變量。通過(guò)用模塊名限定模塊級(jí)變量就可在過(guò)程內(nèi)訪(fǎng)問(wèn)這樣的變量。
public temp as integer
sub test ()
dim temp as integer
temp = 2 ‘ temp 的值為 2。
msgbox form1.temp ’ form1.temp 的值為 1。
end sub
private sub form_load ()
temp = 1 ‘ 將 form1.temp 的值設(shè)置成 1。
end sub
private sub command1_click ()
test
end sub
一般說(shuō)來(lái),當(dāng)變量名稱(chēng)相同而范圍不同時(shí),局限性大的變量總會(huì)用“陰影”遮住局限性不太大的變量(即優(yōu)先訪(fǎng)問(wèn)局限性大的變量)。所以,如果還有名為 temp 的過(guò)程級(jí)變量,則它會(huì)用“陰影”遮住模塊內(nèi)部的公用變量 temp。
陰影窗體屬性和控件
由于陰影效應(yīng),窗體屬性、控件、常數(shù)和過(guò)程皆被視為窗體模塊中的模塊級(jí)變量。窗體屬性或控件的名稱(chēng)與模塊級(jí)變量、常數(shù)、自定義類(lèi)型或過(guò)程的名稱(chēng)相同是不合法的,因?yàn)樗鼈兊姆秶嗤?br>在窗體模塊內(nèi),和窗體中控件同名的局部變量將遮住同名控件。因此必須引用窗體名稱(chēng)或 me 關(guān)鍵字來(lái)限定控件,才能設(shè)置或者得到該控件的值或它的屬性值。例如:
private sub form_click ()
dim text 1 , backcolor
’假定該窗體有一個(gè)控件也叫做 text1。
text1 = “variable” ‘變量用“陰影”遮住控件。
me.text1 = “control” ’要得到控件,必須用‘me’限定。
text1.top = 0 ‘導(dǎo)致出錯(cuò)!
me.text1.top = 0 ’要得到控件,必須用‘me’限定。
backcolor = 0 ‘變量用“陰影”遮住屬性。
me.backcolor = 0 ’要得到窗體屬性,必須用‘me’限定。
end sub
使用同名的變量和過(guò)程
專(zhuān)用模塊級(jí)變量和公共模塊級(jí)變量的名字也會(huì)和過(guò)程名沖突。模塊中的變量不能和任何過(guò)程同名,也不能和模塊中定義的類(lèi)型同名。但可以和公用過(guò)程或其它模塊中定義的類(lèi)型或變量同名。在這種情況下,從別的模塊訪(fǎng)問(wèn)這個(gè)變量時(shí),就必須用模塊名來(lái)限定。
雖然上面討論陰影規(guī)則并不復(fù)雜,但是用陰影的方法可能會(huì)帶來(lái)麻煩,而且會(huì)導(dǎo)致難以查找的錯(cuò)誤。因此,對(duì)不同的變量使用不同的名稱(chēng)才是一種好的編程習(xí)慣。在窗體模塊中應(yīng)盡量使變量名和窗體中的控件名不一樣。





