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