循環(huán)結(jié)構(gòu)
循環(huán)結(jié)構(gòu)允許重復執(zhí)行一行或數(shù)行代碼。Visual Basic 支持的循環(huán)結(jié)構(gòu)有: 1.Do...Loop 2.For...Next 3.For Each...Next Do...Loop 用 Do 循環(huán)重復執(zhí)行一語句塊,且重復次數(shù)不定。Do...Loop 語句有幾種演變形式,但每種都計算數(shù)值條件以決定是否繼續(xù)執(zhí)行。如同 If...Thencondition 必須是一個數(shù)值或者值為 True(非零)或 False(零)的表達式。在下面的 Do...Loop 循環(huán)中,只要 condition 為 True 就執(zhí)行 statements。 Do While condition statements Loop 當 Visual Basic 執(zhí)行這個 Do 循環(huán)時會首先測試 condition。如果 condition為 False(零),則跳過所有語句。如果 condition 為 True(非零),則 VisualBasic 執(zhí)行語句,然后退回到 Do While 語句再測試條件。 因此,只要 condition 為 True 或非零,循環(huán)可以隨意執(zhí)行多少次。如果condition 一開始便為 False,則不會執(zhí)行語句。例如,以下過程將計算某一目標字符串在另一字符串中出現(xiàn)的次數(shù),只要發(fā)現(xiàn)目標串就執(zhí)行循環(huán): Function CountStrings (longstring, target) Dim position, count position = 1 Do While InStr (position, longstring, target) position = InStr(position, longstring, target)_ + 1 count = count + 1 Loop CountStrings = count End Function 如果目標字符串未出現(xiàn)在另一個字符串中,則 InStr 返回 0,而且不再執(zhí)行循環(huán)。 Do...Loop 語句的另一種演變形式是先執(zhí)行語句,然后在每次執(zhí)行后測試condition。這種形式保證 statements 至少執(zhí)行一次: Do statements Loop While condition 其它兩種演變形式類似于前兩個,所不同的是,只要 condition 為 False 而不是 True,它們就執(zhí)行循環(huán)。 For...Next000 在不知道循環(huán)內(nèi)需要執(zhí)行多少次語句時,宜用 Do 循環(huán)。但是,在知道要執(zhí)行多少次時,則最好使用 For...Next 循環(huán)。與 Do 循環(huán)不同, For 循環(huán)使用一個叫做計數(shù)器的變量,每重復一次循環(huán)之后,計數(shù)器變量的值就會增加或者減少。For 循環(huán)的語法如下: For counter = start To end [Step increment] statements Next [counter] 參數(shù) Counter、Start、end 和 increment 都是數(shù)值型的。 注意 increment 參數(shù)可正可負。如果 increment 為正,則 Start 必須小于等于end,否則不能執(zhí)行循環(huán)內(nèi)的語句。如果 increment 為負,則 Start 必須大于等于 end,這樣才能執(zhí)行循環(huán)體。如果沒有設置 Step,則 increment 缺省值為 1。 在執(zhí)行 For 循環(huán)時,Visual Basic 1. 設置 counter 等于 start。 2. 測試 counter 是否大于 end。若是的話,則 Visual Basic 退出循環(huán)。 (若 increment 為負,則 Visual Basic 測試 counter 是否小于 end。) 3. 執(zhí)行語句。 4. counter 增加一,或者增加 increment(如果已指定的話)。 5. 重復步驟 2 到步驟 4。 以下代碼打印出所有有效的屏幕字體名: Private Sub Form_Click () Dim I As Integer For i = 0 To Screen.FontCount Print Screen.Fonts (i) Next End Sub 在 VCR 示例應用程序中,HighlightButton 過程使用 For...Next 循環(huán),一步步經(jīng)過 VCR 窗體的控件集合,并顯示適當?shù)?Shape 控件: Sub HighlightButton (MyControl As Variant) Dim i As Integer For i = 0 To frmVCR.Controls.Count - 1 If TypeOf frmVCR.Controls (i) Is Shape Then If frmVCR.Controls (i).Name = MyControl Then frmVCR.Controls (i).Visible = True Else frmVCR.Controls (i).Visible = False End If End If Next End Sub For Each...Next For Each...Next 循環(huán)與 For...Next 循環(huán)類似,但它對數(shù)組或?qū)ο蠹现械拿恳粋€元素重復一組語句,而不是重復語句一定的次數(shù)。如果不知道一個集合有多少元素, For Each...Next 循環(huán)非常有用。 For Each...Next 循環(huán)的語法如下: For Each element In group statements Next elementt 例如,下面的子過程打開 Biblio.mdb,把每一個表的名字加到列表框中。 Sub ListTableDefs () Dim objDb As Database Dim MyTableDef as TableDef Set objDb = OpenDatabase("c:\vb\biblio.mdb", _ True, False) For Each MyTableDef In objDb.TableDefs () List1.AddItem MyTableDef.Name Next MyTableDef End Sub 請記住使用 For Each...Next 時的幾點限制: 1.對集合,element 只能是 Variant 變量,或一般的 Object 變量,或“對象瀏覽器”中列出的對象。 2.對數(shù)組,element 只能是 Variant 變量。 3.For Each...Next 不能與用戶自定義類型的數(shù)組一起使用,因為 Variant 不可能包含用戶自定義類型。 使用控制結(jié)構(gòu) 嵌套控制結(jié)構(gòu)可以把控制結(jié)構(gòu)放入另一個控制結(jié)構(gòu)之內(nèi)(例如在 For...Next 循環(huán)中的If...Then 塊)。一個控制結(jié)構(gòu)內(nèi)部包含另一個控制結(jié)構(gòu)叫做 nest(嵌套)。在 Visual Basic 中,控制結(jié)構(gòu)的嵌套層數(shù)沒有限制。按一般習慣,為了使判定結(jié)構(gòu)和循環(huán)結(jié)構(gòu)更具可讀性,總是用縮排方式書寫判定結(jié)構(gòu)或循環(huán)的正文部分。 例如,下面的過程要把打印機和屏幕共有的字體名全部打印出來: Private Sub Form_Click () Dim SFont, PFont For Each SFont In Screen.Fonts () For Each PFont In Printer.Fonts () If SFont = PFont Then Print SFont End If Next PFont Next SFont End Sub 注意,第一個 Next 關閉了內(nèi)層的 For 循環(huán),而最后一個 For 關閉了外層的 For 循環(huán)。同樣,在嵌套的 If 語句中,End If 語句自動與最靠近的前一個 If 語句配對。嵌套的 Do...Loop 結(jié)構(gòu)的工作方式也是一樣的,最內(nèi)圈的 Loop 語句與最內(nèi)圈的 Do 語句匹配。 退出控制結(jié)構(gòu) 用 Exit 語句可以直接退出 For 循環(huán)、Do 循環(huán)、子過程或函數(shù)過程。Exit 語句的語法很簡單:Exit For 在 For 循環(huán)中出現(xiàn)的次數(shù)沒有限制,Exit Do 在Do 循環(huán)中出現(xiàn)的次數(shù)也沒有限制。 For counter = start To end [Step increment] [statementblock] [Exit For] [statementblock] Next [counter[, counter] [,...]] Do [{While | Until} condition] [statementblock] [Exit Do] [statementblock] Loop Exit Do 語句可以在 Do 循環(huán)語法的所有版本中使用。 Exit For 和 Exit Do 非常有用,因為它有時適于立即退出循環(huán),而且不再執(zhí)行循環(huán)中的任何進一步迭代或者語句。例如,在前面的打印屏幕和打印機共有字體的例子中,程序不斷將打印機字體和給定的屏幕字體作比較,甚至在已經(jīng)找到了一個相符的打字機字體后還在繼續(xù)尋找。對這個函數(shù)有一個效率更高的改進版,在此,只要找到相匹配的字體后就立即退出循環(huán): Private Sub Form_Click () Dim SFont, PFont For Each SFont In Screen.Fonts () For Each PFont In Printer.Fonts () If SFont = PFont Then Print Sfont Exit For '退出內(nèi)圈循環(huán)。 End If Next PFont Next SFont End Sub 正如此例所表明的, Exit 語句幾乎總是出現(xiàn)在 If 語句或 Select Case 語句內(nèi)部,而 If 語句或 Select Case 語句在循環(huán)內(nèi)嵌套。 用 Exit 語句中斷循環(huán)時,計數(shù)器變量的值會因退出循環(huán)的方式而不同: 1.在完成循環(huán)時,計數(shù)器的值等于上限值加上步進值。 2.在提前退出循環(huán)時,計數(shù)器變量保持其值,并遵從有關取值范圍的一般規(guī)則。 3.在集合之外疊代時,如果計數(shù)器變量為 Object 類型,則其值為Nothing;如果計數(shù)器變量為 Variant 類型,則其值為 Empty。 退出子過程或函數(shù)過程 也可從控制結(jié)構(gòu)內(nèi)部退出過程。Exit Sub 和 Exit Function 的語法,和上一節(jié)“退出控制結(jié)構(gòu)”中的 Exit For 和 Exit Do 相似。Exit Sub 可以出現(xiàn)在子過程主體內(nèi)的任何地方,出現(xiàn)的次數(shù)隨需要而定。 當過程已完成每個任務并可直接返回時,Exit Sub 和 Exit Function 是非常有用的。例如,如果想改動前面的例子,使得對查找到的打印機和屏幕的共有字體,只打印其中的第一個,則可用 Exit Sub : Private Sub Form_Click () Dim SFont, PFont For Each SFont In Screen.Fonts () For Each PFont In Printer.Fonts () If SFont = PFont Then Print Sfont Exit Sub '退出過程。 End If Next PFont Next SFont End Sub |
|