使用多個同名的變數
如果不同模組中的公用變數使用同一名字,則通過同時引用模組名和變數名就可以在代碼中區分它們。例如,如果有一個在 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
一般說來,當變數名稱相同而範圍不同時,局限性大的變數總會用“陰影”遮住局限性不太大的變數(即優先訪問局限性大的變數)。所以,如果還有名為 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
使用同名的變數和過程
專用模組層級變數和公用模組層級變數的名字也會和過程名衝突。模組中的變數不能和任何過程同名,也不能和模組中定義的類型同名。但可以和公用過程或其它模組中定義的類型或變數同名。在這種情況下,從別的模組訪問這個變數時,就必須用模組名來限定。
雖然上面討論陰影規則並不複雜,但是用陰影的方法可能會帶來麻煩,而且會導致難以尋找的錯誤。因此,對不同的變數使用不同的名稱才是一種好的編程習慣。在表單模組中應盡量使變數名和表單中的控制項名不一樣。