Presentation is loading. Please wait.

Presentation is loading. Please wait.

第 7 章 流程控制 ─ 重複執行同一段程式.

Similar presentations


Presentation on theme: "第 7 章 流程控制 ─ 重複執行同一段程式."— Presentation transcript:

1 第 7 章 流程控制 ─ 重複執行同一段程式

2 本章重點提要 7-1 For-Next:計次執行的迴圈 7-2 While 與 Do-Loop:有條件執行的迴圈 7-3 直接跳出迴圈的敘述
7-4 巢狀迴圈 7-5 Timer 控制項:定時執行程式

3 本章閱讀建議 上一章我們介紹了 If、Select Case 等『選擇性執行』的流程控制, 本章則要介紹『迴圈』, 就是讓同一段程式不斷重複執行, 直到某些條件發生變化為止。這二種流程控制都非常重要, 如能善加應用, 就能寫出更多變化且條理分明的程式。 迴圈的原理其實不難, 請讀者先看完底下的重點介紹, 然後再往下學習時就能事半功倍。

4 本章閱讀建議 7-1 For-Next:計次執行的迴圈:最經典的例子就是由 1 加到 100, 若使用 For-Next 迴圈只需 3 行程式, 而不用真得去加 100 次!這就是迴圈的威力。 7-2 While 與 Do-Loop:有條件執行的迴圈:如果迴圈的次數不一定, 那麼就可改用 While 或 Do-Loop 敘述, 以便依照特定條件來決定是否繼續迴圈。

5 本章閱讀建議 7-3 直接跳出迴圈的敘述:在迴圈中可使用 Exit For、ExitWhile、Exit Do 等指令來直接跳出迴圈, 它們通常會搭配 If 來使用, 例如『If 某狀況發生 Then Exit For』。 7-4 巢狀迴圈:迴圈中還有迴圈, 就形成巢狀迴圈。巢狀迴圈可以輕鬆處理像是『九九乘法表』之類, 看似複雜但又有規則可循的問題。 7-5 Timer 控制項:定時執行程式:Timer 控制項可以定時觸發Tick 事件, 就好像時鐘會每秒鐘發出滴答聲 (Tick)一樣。最經典的例子是小時鐘程式, 因為我們可利用 Timer 控制項來每秒鐘更新一次時間。

6 7-1 For-Next:計次執行的迴圈 在寫程式時, 常常會遇到一些需要重複執行的動作, 此時如果知道要重複的次數, 那麼使用 For-Next 敘述最為方便。

7 簡單型的 For-Next 迴圈 在 For-Next 敘述中至少要包含『計數器』、『起始值』、與『終止值』, 例如底下由 1 加到 100 的範例:

8 簡單型的 For-Next 迴圈 For 後面要接一個計數器 (i), 其計數範圍是 1 到 100 (i = 1 To100)。當第一次執行迴圈時, 計數器的值會等於 1 (起始值), 然後每執行一次迴圈計數器就加 1, 如此重複執行到計數器等於 100(終止值), 然後結束迴圈, 繼續執行迴圈之後的程式。

9 簡單型的 For-Next 迴圈

10 簡單型的 For-Next 迴圈 因此, 以上程式會執行 100 次迴圈, 第 1 圈時 (i=1) sum 會加 1, 第2 圈時 (i=2) sum 再加 2, 第 3 圈時 (i=3) sum 再加 3...:

11 簡單型的 For-Next 迴圈 撰寫一個由 9 加到 999 的程式。 請建立 Windows Form 應用程式專案 Ch07-01。

12 簡單型的 For-Next 迴圈 用滑鼠雙按表單, 然後在 Form1 的 Load 事件程序中加入以下程式:

13 簡單型的 For-Next 迴圈 請問前面的程式共會執行多少次迴圈? = 991 次。

14 簡單型的 For-Next 迴圈 請寫程式計算由 5 乘到 15 的結果。(注意, 5x6x7x...x15 結果會是一個非常大的數值!)

15 簡單型的 For-Next 迴圈 以上我們宣告變數 m 來儲存相乘的結果, 但由於是計算乘法, 所以必須先將 m 的初值設為 1 (不指定初值時預設為 0, 而 0 乘任何數的結果仍為 0)。 另外, 如果在迴圈中不斷進行累加或累乘, 則有可能在不知不覺中產生很大的數值!像本例的計算結果就超出了整數可表達的範圍( ~ ), 因此我們特別將 m 宣告為 Long 型別。

16 簡單型的 For-Next 迴圈 如果是宣告為 Integer 型別, 那麼在執行時會出現如下的錯誤訊息:

17 指定增減量的 For-Next 迴圈 在前面的範例中, 都是讓計數器每執行完一迴圈就加 1, 這是 For-Next 的預設狀況。但有時我們會希望計數器每迴圈能加 2, 例如計算連續偶數的累加;或是每迴圈能減 1, 例如由 100 加到 1, 這時就可用 Step 來指定計數器的『增減量』:

18 指定增減量的 For-Next 迴圈 『增減量』就是用來控制每迴圈計數器要加多少或減多少, 如果起始值 < 終止值, 那麼增減量應為正值;反之,如果起始值 > 終止值(例如由 100 To 1), 那麼增減量應為負值。

19 指定增減量的 For-Next 迴圈 在表單中畫出金字塔, 如下圖所示。 請建立 Windows Form 應用程式專案 Ch07-02。

20 指定增減量的 For-Next 迴圈 加入一個 Label 控制項, 並設定屬性如下:

21 指定增減量的 For-Next 迴圈 在表單空白處雙按滑鼠, 然後在 Form1 的 Load 事件程序中加入以下程式:

22 指定增減量的 For-Next 迴圈 首先我們將 Label1 的 TextAlign (文字對齊) 屬性設為MiddleCenter (垂直水平均置中對齊), 然後利用迴圈來產生每一列所需的 $ 字串。 其中的 StrDup(n, s) 函式可以產生包含 n 個 s 的字串, 而 vbCrLf則為 VB 預先定義好的換行符號。

23 指定增減量的 For-Next 迴圈 在 StrDup(n, s) 函式中, 若 s 包含 2 個以上的字元, 則只會取出第一個字元來重複 n 次, 例如 StrDup(3, "ab") 的傳回值為 "aaa"。

24 指定增減量的 For-Next 迴圈 在表單中畫出倒三角形, 如下圖所示。

25 指定增減量的 For-Next 迴圈 所有的設定均與上題相同, 只須更改 For 的起始值、終止值、與增減量:

26 要避免『起始值、終止值、與增減量』的錯亂!
VB 會依照增減量的正負, 來決定計數器如何與終止值比對。當增減量為正值時, 計數器必須小於或等於終止值, 否則結束迴圈;當增減量為負值時, 則計數器必須大於或等於終止值, 否則結束迴圈:

27 要避免『起始值、終止值、與增減量』的錯亂!

28 要避免『起始值、終止值、與增減量』的錯亂!

29 要避免『起始值、終止值、與增減量』的錯亂!
如果將起始值、終止值、與增減量的關係弄錯了, 例如: 由於增減量為負數, 因此執行迴圈的條件是『i >= 5』, 但一開始時 i 的值為 1,所以會因不符條件而立即結束迴圈, 結果連一次迴圈都沒執行到!所以當我們使用負的增減量時, 一定要特別小心。

30 指定增減量的 For-Next 迴圈 在表單中畫出用數字拼出來的沙漏形狀, 如下圖所示。

31 指定增減量的 For-Next 迴圈 所有的設定與上題相同, 只須將程式改為 2 個迴圈 (分別畫出上、下二個三角形), 並利用計數器 (i) 來算出每行要顯示幾個字元:

32 指定增減量的 For-Next 迴圈 在以上程式中, 計數器是用來代表每行要顯示多少個字元;但由於每行要顯示的數字不同, 因此我們還要利用計數器來算出每行要顯示的數字 (7→1→7), 算法為『CStr(i \ 4 + 1)』, 其中 \ 是整數除法(會捨去餘數), 而 CStr() 函式則可將數值轉換為字串。 在本例中請不要用 Str() 函式來將數值轉為字串, 因為 Str() 轉出來的正數都會在前面加一個空白字元, 例如 8 會轉為 " 8", 而 StrDup(i, "8") 則只會重複 " 8" 中的第一個空白字元。

33 選誰來當計數器? 在前面畫沙漏的練習中, 我們是以『每行要顯示多少個字元』做為計數器(25→1, 5→25), 其實也可以改用『每行要顯示的數字』做為計數器 (7→1,2→7):

34 選誰來當計數器?

35 就地宣告計數器 到目前為止, 我們都是使用已宣告好的變數來做為 For-Next 的計數器, 其好處是在迴圈之外也可使用該變數, 例如:

36 就地宣告計數器

37 就地宣告計數器 由上表可看出, 當迴圈執行 5 次之後, i 的值會再加 1 而變成 6, 此時就會因不符條件而結束迴圈, 然後執行迴圈後面的 MsgBox(i),結果輸出 6。

38 就地宣告計數器 不過, 通常我們並不需要在迴圈之外使用計數器, 此時就可直接在For-Next 中宣告計數器變數, 而不必事先用 Dim 宣告。例如:

39 就地宣告計數器 在 For-Next 中『就地宣告』的計數器變數, 只能在 For-Next 中使用, 在 For-Next 之外則無法存取。 而在不同 For-Next 中宣告的計數器變數, 彼此之間並不會有影響。

40 就地宣告計數器 但在For-Next 之外, 則不能再用 Dim 來重複宣告同名的變數, 例如:

41 就地宣告計數器 請使用 For-Next 就地宣告計數器的方式, 分別計算由 1 到 1000 之間,『3 的倍數的加總』與『7 的倍數的加總』, 並顯示結果如下:

42 就地宣告計數器

43 7-2 While 與 Do-Loop:有條件執 行的迴圈
While 與 Do-Loop 都是利用『條件式』來決定要繼續迴圈或結束迴圈。While 的寫法比較簡單, 底下我們先來介紹。

44 While 迴圈 While 迴圈是由 While 及 End While 所組成, 寫法如下:

45 While 迴圈 當條件式為 True 時, 就會繼續執行迴圈, 直到條件式變成 False 為止。
底下我們用 While 迴圈來模擬『For i = 1 To 10』的功能:

46 小心無窮迴圈! 以上程式最容易漏寫的是第 4 行『i = i ?+ 1』(因為在 For-Next 敘述中, 每當執行到 Next 時計數器就會自動增減, 而不用我們寫程式來增減), 一旦忘了寫, 那麼 i 的值就不會改變 (永遠為 1), 因此 i <= 10 的條件也永遠為 True, 如此迴圈會不斷執行, 而造成『無窮迴圈』!

47 小心無窮迴圈! 由此可知, 如果迴圈的次數固定, 那麼還是使用 For-Next 迴圈比較好, 即簡單又不容易出錯:

48 While 迴圈 請寫一個檢查登入帳號的程式, 除非使用者輸入 "Ken"、"Sue"、或"Joy", 否則就一直要求使用者重新輸入。

49 While 迴圈 請建立 Windows Form 應用程式專案 Ch07-03。
step 2 在表單上雙按滑鼠, 撰寫以下 Load 事件程序:

50 While 迴圈 程式一開始會先宣告字串變數 id 並設定初值為 "na", 接著用 While迴圈來不斷要求使用者輸入, 只要使用者沒有輸入正確的帳號或空白 (按取消鈕也會傳回空白), 迴圈就會一直持續。 在迴圈結束之後, 則使用 If() 運算子來判斷 id 是否為空白 (空白表示取消輸入), 然後據以顯示不同的訊息。

51 While 迴圈 修改前面程式 (或開啟範例專案 Ch07-03ok), 當使用者輸入錯誤超過 3 次, 即結束程式。

52 While 迴圈 我們在程式中多加了一個 cnt 來計算次數, cnt 預設為 0, 使用者每輸入一次就將 cnt 加 1。當 cnt 到達 3 次時, 就強制將 id 設為空白, 如此便可結束迴圈並顯示 "再見!"。

53 Do-Loop 迴圈 Do-Loop 的功能和 While 類似, 但在寫法上更有彈性, 可分為下面 3 種: 沒有條件式的迴圈
先判斷條件再執行迴圈 先執行迴圈, 再判斷條件

54 沒有條件式的迴圈

55 沒有條件式的迴圈 這是最陽春的 Do-Loop 迴圈, 由於沒有條件限制, 因此會不斷地執行迴圈, 而變成『無窮迴圈』!效果相當於 While 迴圈: 我們有時也會使用到『無窮迴圈』, 但一定會在迴圈中搭配 Exit Do 或 Exit While 來跳離迴圈。

56 先判斷條件再執行迴圈 這種寫法的效果和 While 迴圈相同:

57 先判斷條件再執行迴圈 不過請注意, Do While 的『While』(當...) 還可變形為『Until』(直到...), 二者的意義恰好相反:

58 先判斷條件再執行迴圈 舉例來說, 底下二段程式的執行結果完全相同 (都會顯示 15):

59 先判斷條件再執行迴圈

60 先執行迴圈, 再判斷條件 有時我們會希望先執行一次迴圈, 然後才判斷條件, 看要不要繼續下一迴圈。此時可將 While (或 Until) 放在 Loop 之後:

61 先執行迴圈, 再判斷條件

62 先執行迴圈, 再判斷條件 例如前面檢查登入帳號的程式, 就有這種需要:

63 先執行迴圈, 再判斷條件 以上程式雖然可以正常運作, 但若改成下面的寫法, 將更能符合邏輯:

64 先執行迴圈, 再判斷條件 當然, 您也可以將 Loop While 改成相反的 Loop Until 寫法, 雖然邏輯不同, 但結果是一樣的:

65 先執行迴圈, 再判斷條件 以上 Loop While 與 Loop Until 的條件式剛好相反。不過要注意,當條件式相反時, And 會變成 Or 喔!反之亦然。例如:

66 即然有 While 了, 為什麼還要 Until 呢?
Do-Loop 的 While 和 Until 其實只需要一種就夠用了, 為什麼要設計二種呢? 這就是 VB 體貼初學者的地方, 因為有些情況適合 Until, 有些情況則適合 While,若硬要轉換則容易頭腦打結!就以前面檢查帳號的範例 (Ch07-03) 來說, 題目是這樣出的:

67 即然有 While 了, 為什麼還要 Until 呢?
『除非使用者輸入 "Ken"、"Sue"、或 "Joy", 否則就一直要求使用者重新輸入。』 此時就適合使用 Until 的邏輯:

68 Do-Loop 迴圈 寫一程式來展示『蟑螂爬行的英姿』, 如下圖所示:

69 Do-Loop 迴圈

70 Do-Loop 迴圈 請建立 Windows Form 應用程式專案 Ch07-04。
在表單中加入一個 Button ( 更名為 play) 及 PictureBox( 更名為 roach) 控制項, 並設定如下:

71 Do-Loop 迴圈

72 Do-Loop 迴圈 雙按 play 按鈕, 建立 play.Click 事件程序:

73 Do-Loop 迴圈 我們先將 roach 控制項 (以下簡稱蟑螂) 設為隱藏, 這樣無論使用者如何放大視窗, 蟑螂在尚未播放時都不會被看到。另外, 我們在play 按鈕上也顯示蟑螂圖片 (以圖片靠左、文字靠右的方式), 由於『蟑螂.gif』是動畫圖片, 因此按鈕上的蟑螂是會動的喔!

74 Do-Loop 迴圈 當使用者按下 play 按鈕時, 程式會先將按鈕隱藏起來, 然後把蟑螂搬移到左邊界之外, 並設為可看見。接著就進入迴圈, 讓蟑螂不斷向右爬, 直到爬出右邊界為止;最後則將蟑螂隱藏起來, 然後再讓按鈕顯示出來。

75 Do-Loop 迴圈 控制項的 Left、Top 屬性就是其左上角的 x、y 座標, 意義和Location 的 x、y 子屬性 (在 4-2 節介紹過) 相同, 但 Left、Top 只能用程式存取 (在屬性窗格中找不到), 並且可以直接設定而不用先建立 Point 物件。

76 Do-Loop 迴圈 程式一開始會將蟑螂的 Left 屬性設為『0 - roach.Size.Width』, 由於蟑螂的寬度為 44, 因此 Left 會變成 -44, 也就是在表單左邊界再往左 44 點的地方。至於爬行的終點, 則是當 Left 超過表單的右邊界時:

77 Do-Loop 迴圈 在爬行的過程中, 每一迴圈都將蟑螂的 Left 屬性加 1, 因此蟑螂會往右爬一點。但由於程式執行的速度太快, 還沒看清楚就爬完了!所以必須讓蟑螂每爬一步就休息一下, 方法如下:

78 Do-Loop 迴圈 以上二行都是 .NET Framework 的功能, 我們可以直接拿來使用。如果想讓蟑螂爬慢一點, 則可讓蟑螂多休息一下, 例如將參數 1 改為 3, 則每爬一次就休息 3/1000 秒。

79 Do-Loop 迴圈 接續前例 (或開啟範例專案 Ch07-04ok), 將程式改為『Do...LoopUntil』的寫法, 並想辦法讓蟑螂在爬行時會上下晃動, 而非一直線呆板地前進, 以提高真實感。

80 Do-Loop 迴圈 我們可以讓蟑螂每爬 10 步, 就隨機產生一個介於 -3 到 3 的亂數, 來改變蟑螂的 y 座標 (Top 屬性), 讓蟑螂可能往上 1~3 點、不動、或往下移動 1~3 點。產生亂數的公式為:

81 Do-Loop 迴圈 如果想取得介於 A 到 B 之間的隨機整數, 則公式為:CInt(Int((B - A + 1) * Rnd() + A))。

82 Do-Loop 迴圈

83 7-3 直接跳出迴圈的敘述 無論是 For、While、或 Do 迴圈, 都可用對應的 Exit For、ExitWhile、或 Exit Do 來直接跳出迴圈, 例如:

84 直接跳出迴圈的敘述 請寫一程式, 可計算指定範圍內所有整數的乘積 (相乘的結果), 但在計算過程中如果乘積大於一億, 就停止計算並顯示訊息:

85 直接跳出迴圈的敘述 請開啟範例專案 Ch07-05, 我們已準備好所需的控制項:

86 直接跳出迴圈的敘述 在 上雙按, 建立『計算.Click』事件程序如下:

87 直接跳出迴圈的敘述 由於 (一億) 太長了容易寫錯, 所以我們改用比較易讀的 10 ^ 8 來表示, 這二種寫法的執行結果與執行效率完全相同。另外, Format() 函式可將資料格式化:

88 直接跳出迴圈的敘述 ”#” 代表要顯示一個 0~9 的數字, 但若該位置沒有數字則不顯示;"0" 的意義和 "#" 相同, 但若該位置沒有數字則顯示 0, 例如Format(2, "00") 會傳回 "02"。在數字之間加逗號, 則表示格式化數字時要加千位符號。

89 在 For 迴圈中, 可以自行更改計數器的值嗎?

90 在 For 迴圈中, 可以自行更改計數器的值嗎?
以上迴圈只會執行一次!因為當執行完第一圈時, i 的值已經是 100 了, 在進入一下迴圈之前會先加 1 而變成 101, 此時由於已超過終止值 100, 所以會立即結束迴圈。 我們雖然可以任意更改計數器的值, 甚至利用這種方法來跳離迴圈, 但由於可讀性較差, 又容易出錯, 因此最好盡量少用這種寫法。

91 直接跳出迴圈的敘述 接續前例 (或開啟範例專案 Ch07-05ok), 請修改程式為只計算偶數的乘積。

92 直接跳出迴圈的敘述

93 跳過本次迴圈:Continue ... VB 除了 Exit 外, 還提供了 Continue 指令, 如果想要跳過本次迴圈中尚未執行的敘述, 而直接開始下一迴圈, 則可使用 Continue For、Continue While、或 ContinueDo 指令。例如:

94 跳過本次迴圈:Continue ... 例如當我們只要處理偶數時, 即可用 Continue 來略過奇數值:
一般來說, 使用 If...Then... 就可以達到 Continue 的功能, 因此讀者只要知道有這個指令就好, 倒不必用它來增加程式的複雜度。

95 7-4 巢狀迴圈 上一章我們介紹過巢狀的 If 結構, 就是在 If...End If 之內還可以有If...End If。其實不管是 If、For-Next、或是 While、Do-Loop 等,彼此之間都可以相互形成巢狀結構, 而且沒有層數的限制。例如:

96 巢狀迴圈 請繪製以數字排出的三角形, 如下圖所示:

97 巢狀迴圈 請開啟範例專案 Ch07-06 , 我們已加入 Label 控制項並設好相關屬性:

98 巢狀迴圈 在表單空白處雙按滑鼠, 然後在表單的 Load 事件程序中加入以下程式:

99 巢狀迴圈 在巢狀的 For-Next 結構中, 內圈的迴圈次數常會隨著外圈的計數器而變化。以本例來說, 外圈的 i 是代表目前顯示三角形的是第幾層 (共有 1~9 層), 而內圈就是要實地跑 i 次以串接出 1~i 的字串,例如在第 3 層時, 內圈就要跑 3 次以組出 "123" 的字串。

100 巢狀迴圈

101 巢狀迴圈 將前面程式 (可開啟 Ch07-06ok 來使用) 改為畫出 10 層的倒三角形, 且最下的數字為 0。另外, 請讓程式在執行第一次迴圈時不要串接換行符號, 如下圖所示。

102 巢狀迴圈

103 巢狀迴圈 繪出九九乘法表, 如下圖所示:

104 巢狀迴圈 建立 Windows Form 應用程式專案 Ch07-07。 在表單中加入 Label 控制項, 並如下設定:

105 巢狀迴圈 在表單空白處雙按滑鼠, 撰寫表單 Load 事件程序:

106 巢狀迴圈 外圈的 i 代表左乘數, 內圈的 j 則為右乘數 (即 i x j)。外圈每跑一次, 內圈就會跑 9 次, 因而產生 9 個乘項;例如在顯示第 3 排(i=3) 時, 內圈會跑 9 次而產生 “3x1= 3 3x2= 6 3x3=9... 3x9=27”等 9 個乘項。

107 巢狀迴圈 這個程式比較要注意的是『上下對齊』的問題:
有些乘積為個位數, 有些則為二位數, 因此如果是個位數則要在前面多加一個空白, 以便和二位數的乘積對齊。 Label 控制項的字型預設為『新細明體』, 這是一種非固定寬度的字型, 也就是每個字母的寬度可能不同, 例如 "W" 會比 "i" 寬很多, 另外還會壓縮空白字元, 以增加美觀性:

108 巢狀迴圈 為了達到上下對齊的效果, 我們必須選用『固定寬度的字型』才行, 例如『細明體』。

109 巢狀迴圈 接續前例 (或開啟 Ch07-07ok), 為了讓比較小的小朋友背誦, 請將九九乘法表轉正, 並讓乘積大於 30 的乘項不要顯示出來, 如下圖所示:

110 巢狀迴圈 先將 Label1 的 TextAlign 屬性改為 MiddleLeft (垂直置中、水平靠左對齊), 然後把迴圈內『i & "x" & j』對調為『j & "x" & i』, 最後再加一行程式 (下面灰底的敘述) 即可

111 巢狀迴圈

112 7-5 Timer 控制項:定時執行程式 Timer 控制項就像計時器一樣, 可以每隔固定的時間就引發 Tick(滴答聲) 事件, 例如我們設定 2 秒滴答一次, 那麼每 2 秒就會執行Tick 事件程序一次。使用 Timer 控制項的流程如下: 將 加到表單中:

113 Timer 控制項:定時執行程式

114 Timer 控制項:定時執行程式 在 Timer 控制項的 Interval 屬性設定 Tick 的時間間隔( 單位是毫秒, 即千分之一秒), 並將 Enabled 屬性設為 True 來開啟定時功能。

115 Timer 控制項:定時執行程式 撰寫 Timer 控制項的 Tick 事件程序 ( 雙按 Timer 控制項即可自動加入以下的程式):

116 Timer 控制項:定時執行程式 製作一個電子時鐘, 如下圖所示: 請建立 Windows Form 應用程式專案 Ch07-08。

117 Timer 控制項:定時執行程式 在表單中加入一個 Label 及一個 Timer 控制項, 並如下設定:

118 Timer 控制項:定時執行程式

119 Timer 控制項:定時執行程式 在 Timer1 上雙按滑鼠, 然後建立 Timer1.Tick 事件程序:

120 Timer 控制項:定時執行程式 按[F5] 鍵測試看看:

121 Timer 控制項:定時執行程式 在程式視窗上方分別選取 及
在程式視窗上方分別選取 及 ,然後輸入 Form1 的 Load 事件程序, 讓程式一開始執行就更新一次時間:

122 Timer 控制項:定時執行程式 接續前例 (或開啟 Ch07-08ok), 繼續加入以下功能:

123 Timer 控制項:定時執行程式 請先在表單中加入 2 個 CheckBox 控制項, 並如下設定:

124 Timer 控制項:定時執行程式

125 Timer 控制項:定時執行程式 利用 Timer 控制項製作『會反彈的足球』。

126 Timer 控制項:定時執行程式 請建立 Windows Form 應用程式專案 Ch07-09。
在表單中加入一個 PictureBox 及一個 Timer 控制項, 並如下設定:

127 Timer 控制項:定時執行程式

128 Timer 控制項:定時執行程式 在 Timer1 上雙按滑鼠, 建立 Timer1.Tick 事件程序:

129 Timer 控制項:定時執行程式

130 Timer 控制項:定時執行程式 先我們在事件程序的外面宣告X位移與Y位移變數, 讓變數的值可以一直保存著 (直到表單關閉), 不會因事件程序的結束而消失。 接著在每 秒就執行一次的 Timer1.Tick 事件程序中, 將足球往水平及垂直方向各移動 1 點, 並檢查足球是否已到達視窗的邊界:如果到達左或右邊界, 就反轉X位移變數;如果到達上或下邊界, 則反轉Y位移變數。

131 Timer 控制項:定時執行程式

132 Timer 控制項:定時執行程式 接續前例 (或開啟 Ch07-09ok), 在表單右下角加入 3 個 Label 控制項, 並分別取名為快、慢、及速度表, 其功能與設定如下:

133 Timer 控制項:定時執行程式 如果要減慢足球的速度, 只要增加 Timer1 的 Interval 屬性即可 ( 例如每次增加 20 毫秒);但若要加快足球的速度, 由於Interval 最小值為 1, 而且不可是小數, 因此必須改用『增加移動量』的辦法:

134 Timer 控制項:定時執行程式

135 Timer 控制項:定時執行程式 接著撰寫快及慢的 Click 事件程序。由於我們同時使用『Timer1.Interval 屬性』及『N 變數』來控制速度, 所以必須同時考慮這二個因素, 例如先減慢一次 ( 將 Interval 加 20) 之後再加快, 則只須還原減慢的效果即可 ( 將Interval 減 20), 而不必增加N。

136 Timer 控制項:定時執行程式

137 Timer 控制項:定時執行程式 在設計視窗中雙按足球, 輸入 ball.Click 事件程序:
在執行時, 控制項如果重疊在一起, 則後加入的控制項會在上層 ( 越晚加入的控制項會在越上層):

138 Timer 控制項:定時執行程式 我們希望足球可以在上面, 因此請到設計視窗中如下操作:


Download ppt "第 7 章 流程控制 ─ 重複執行同一段程式."

Similar presentations


Ads by Google