程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB6 >> vb變量、常數和數據類型及過程概述(二)

vb變量、常數和數據類型及過程概述(二)

編輯:VB6

模塊內部使用的變量
按照缺省規定,模塊級變量對該模塊的所有過程都可用,但對其它模塊的代碼不可用。可在模塊頂部的聲明段用 Private 關鍵字聲明模塊級變量,從而建立模塊級變量。例如:
Private intTemp As Integer
在模塊級,Private 和 Dim 之間沒有什麼區別,但 Private 更好些,因為很容易把它和 Public 區別開來,使代碼更容易理解。

所有模塊使用的變量
為了使模塊級的變量在其它模塊中也有效,用 Public 關鍵字聲明變量。公用變量中的值可用於應用程序的所有過程。和所有模塊級變量一樣,也在模塊頂部的聲明段來聲明公用變量。例如:
Public intTemp As Integer
注意 不能在過程中聲明公用變量,只能在模塊的聲明段中聲明公用變量。
詳細信息 有關變量的其它信息,請參閱 “高級變量主題”。

高級變量主題

使用多個同名的變量
如果不同模塊中的公用變量使用同一名字,則通過同時引用模塊名和變量名就可以在代碼中區分它們。例如,如果有一個在 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 。如果多個過程或變量同名,則 VisualBasic 會取變化更受限制的值,在本例中就是 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

使用同名的變量和過程
專用模塊級變量和公共模塊級變量的名字也會和過程名沖突。模塊中的變量不能和任何過程同名,也不能和模塊中定義的類型同名。但可以和公用過程或其它模塊中定義的類型或變量同名。在這種情況下,從別的模塊訪問這個變量時,就必須用模塊名來限定。
雖然上面討論陰影規則並不復雜,但是用陰影的方法可能會帶來麻煩,而且會導致難以查找的錯誤。因此,對不同的變量使用不同的名稱才是一種好的編程習慣。在窗體模塊中應盡量使變量名和窗體中的控件名不一樣。

靜態變量
除范圍之外,變量還有存活期,在這一期間變量能夠保持它們的值。在應用程序的存活期內一直保持模塊級變量和公用變量的值。但是,對於 Dim 聲明的局部變量以及聲明局部變量的過程,僅當過程在執行時這些局部變量才存在。通常,當一個過程執行完畢,它的局部變量的值就已經不存在,而且變量所占據的內存也被釋放。當下一次執行該過程時,它的所有局部變量將重新初始化。
但可將局部變量定義成靜態的,從而保留變量的值。在過程內部用 Static 關鍵字聲明一個或多個變量,其用法和 Dim 語句完全一樣:
Static Depth
例如,下面的函數將存儲在靜態變量 Accumulate 中的以前的運營總值與一個新值相加,以計算運營總值。
Function RunningTotal (num)
Static ApplesSold
ApplesSold = ApplesSold + num
RunningTotal = ApplesSold
End Function
如果用 Dim 而不用 Static 聲明 ApplesSold,則以前的累計值不會通過調用函數保留下來,函數只會簡單地返回調用它的那個相同值。
在模塊的聲明段聲明 ApplesSold,並使它成為模塊級變量,由此也會收到同樣效果。但是,這種方法一旦改變變量的范圍,過程就不再對變量排他性存取。由於其它過程也可以訪問和改變變量的值,所以運營總值也許不可靠,代碼將更難於維護。

聲明所有的局部變量為靜態變量
為了使過程中所有的局部變量為靜態變量,可在過程頭的起始處加上 Static關鍵字。例如:
Static Function RunningTotal (num)
這就使過程中的所有局部變量都變為靜態,無論它們是用 Static、Dim 或Private 聲明的還是隱式聲明的。可以將 Static 放在任何 Sub 或 Function過程頭的前面,包括事件過程和聲明為 Private 的過程。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved