流程控制 ─ 選擇性執行程式
description
Transcript of 流程控制 ─ 選擇性執行程式
著作權所有 © 旗標出版股份有限公司
本著作含書附光碟之內容 (不含 GPL 軟體 ),僅授權合法持有本書之讀者(包含個人及法人)非商業用途之使用,切勿置放在網路上播放或供人下載,除此之外,未經授權不得將全部或局部內容以任何形式重製、轉載、散佈或以其他任何形式、基於任何目的加以利用。
流程控制 ─選擇性執行程式
第 6 章
2
本章重點提要 6-1 條件式:判斷真或假的運算式 6-2 If 敘述:選擇性執行 6-3 If() 運算子:依條件傳回不同的值 6-4 Select Case:依資料做多重選擇 6-5 做為選擇用的控制項
3
本章閱讀建議 『流程控制』就是改變程式的執行流程 , 例
如我們想依照使用者的性別 , 來決定要顯示『 XXX 先生』或『 XXX 小姐』 , 這時就可以使用 If 之類的敘述來加以判別 , 以決定要執行哪段程式。
本章及下一章都會介紹流程控制 , 讀者只要多看範例 , 多跟著做 , 就能完全學會。
4
本章閱讀建議 6-1 條件式:判斷真或假的運算式:它是
由比較運算 ( 大於、小於 ...) 或邏輯運算 ( 且、或 ...) 所組成 , 而運算的結果只有 2 種: True 或 False 。這部分很容易 , 只要有一點數學基礎就可以輕鬆過關。
6-2 If 敘述:選擇性執行:就是依照條件式的真假 , 來決定要執行哪些程式。 If 的觀念很簡單 , 但在使用上有幾種變化 , 請讀者務必要熟悉這些用法。
5
本章閱讀建議 6-3 If() 運算子:依條件傳回不同的值:這
是一種簡化的 If 敘述 , 讀者只要看看範例就能馬上學會。如果好好利用 , 可讓您的程式更加簡潔有力喔!
6-4 Select Case :依資料做多重選擇:如果對同一份資料要做許多的判斷 , 例如依照各年齡層做不同的處理 , 這時就可以改用 Select Case 敘述 , 讓程式更容易撰寫及閱讀。
6
本章閱讀建議 6-5 做為選擇用的控制項:包括『單選
鈕』與『多選鈕』二種 , 其用法就和考試的單選題與多選題類似。本節的範例比較有趣 , 會搭配單選鈕、多選鈕來展示字體的變化 ( 包括改變字型、大小、粗體、斜體等 ), 千萬別錯過哦!
7
6-1 條件式:判斷真或假的運算式 在程式中我們經常要判斷真假 , 例如在計
算成績時 , 如果成績小於 60 分就評為 " 不及格 ", 那麼『成績是否小於 60 分』就是一個條件式 , 可以寫成如下的程式:
8
條件式:判斷真或假的運算式 If...Then...Else...End If 是條件判斷敘述 , 可依照
條件式的真假來決定要執行哪一部份的程式。 If 的用法我們留到下一節再介紹 , 本節先來看看條件式的組成。條件式可由以下二種運算所組成 , 而其運算的結果則是一個布林值 (True 或 False) :比較運算:就是比較大小或比較是否相等 , 例如 『 a > 9 』、『 s = "ok" 』 都是。
邏輯運算:就是『且 (And) 』、『或 (Or) 』之類的運算 , 例如『 a>1 And a<3 』 , 則必須二個子條件都成立 , 即 a>1 、 a<3 都是 True, 那麼『且』的運算結果才會是 True 。
9
比較運算 比較運算的結果會是一個布林值 (True 或
Fasle), 在 VB 中共有 6 種比較運算子:
10
比較運算 請將以下條件寫成條件式:
(1) 成績 (g) 大於或等於 90?(2) 價錢 (p) 不等於 100?(3) 年齡 (a) 不超過 18?(4) 優勝者 (w) 是 "Mary"?(5) 飛機 ( 時速 :a) 比火車快 ( 時速 :t)?
(1) g >= 90 (2) p <> 100 (3) a <= 18 (4) w = "Mary" (5) a > t
11
字串與字串的比較 在上一章中 , 我們介紹過字串是由『 Unico
de 編碼』的字元所組成 , 因此在比較字串或字元時 , 也是以 Unicode 編碼來比較。底下我們將一些常用的字元由小到大列出:
12
字串與字串的比較 接著我們來看實例:
如果想知道字元的 U n i c o d e 編碼 , 可使用 A s cW( ) 函式。例如 AscW("0") = 48 、 AscW("A") = 65 、 AscW("a") = 97 、AscW(" 好 ")= 22909 。
13
字串與字串的比較 在比較字串時 , 會先比較字串中的第一個
字元 , 若相等就再比較第二個字元 , 以此類推 , 直到比出大小、或有一方先結束 ( 字串長度較短的視為比較小 ) 為止。下面比較的結果均為 True :
14
字串與字串的比較 請判斷下面各條件式的結果:
(1) "abc" < "abC"(2) "100" > "50"(3) "Big" < " 大 "(4) "A112" > "A12"(5) " 大家 " < " 大家好 "(6) "A" = "A"c(7) "Flag" > "G"c(8) "flag" >= "Flag"(9) "3.14" <= "3.1415926"
15
字串與字串的比較
(1) False (2) False (因為字元 "1"<"5")
(3) True (4) False (5) True
(6) True ( 字元 "A" c 會先轉為字串 "A" 再進行比較 )
(7) False (8) True (9) True
16
"100" > 50? 字串與數值的比較時 , 會優先將字串『自
動型別轉換』為數值 , 然後再做比較 , 例如: "100" > 50 100 > 50 結果為 True 不過『自動型別轉換』雖然方便 , 但卻容
易混淆 , 因此建議讀者還是自行利用 Val() 函式來轉換型別 , 會比較保險一些。例如:
Val(s) > 50 ' 先將 s 轉換為數值 , 再與 50 比較
17
日期與日期的比較 日期資料可包含『日期』與『時間』二部
份 , 在做比較時 , 會先比較日期 , 若相等則再比較時間。例如下面的條件式均為 True :
18
日期與日期的比較 如果只有日期沒有時間 , 那麼時間就是最
小的 #0:0:0#(凌晨 , 也可寫成 #12:00:00 AM# );如果只有時間沒有日期 , 則日期為最小值 #1/1/0001# 。請再看以下的例子 ( 運算結果均為 True) :
19
日期與日期的比較 請判斷下面各條件式的結果:
(1) #2/2/2009 8:00# < #2/2/2008 9:00#(2) #02/02/2009# < #2/2/2009#(3) "02/02/2009" < "2/2/2009"(4) #8:00# = #8:00 AM#(5) #8:00# > #5/5/2008 7:00#
(1) False (2) False (日期相同 )(3) True (因為是字串的比較 ) (4) True (5) False
20
邏輯運算 邏輯運算是針對布林值 (True 或 False)
來做運算 , 而運算的結果也是布林值。例如:
21
邏輯運算 Not 是『不是』 (相反 ) 的意思 , 因此
『不是 True 』的結果 , 就變成 False 了。常用的『邏輯運算子』除了 Not 之外 , 還有 And 、 Or 、及 Xor 三種 , 如下表所示:
22
邏輯運算 前 3 個邏輯運算子的意義 , 就和我們口語
的『不是、且、或』完全相同 , 所以應該很容易理解;最後一個 Xor, 則是當 A 和 B 的邏輯值不相同 (恰好一真一假 ) 時才為真 , 否則為假。下表將所有可能的運算組合與結果都列出來 (稱為真值表 ), 供您參考:
23
邏輯運算 由於 Not 只需要一個運算對象 ( 運算元 ),
因此稱為『一元邏輯運算子』;而其他 3 個則為『二元邏輯運算子』 , 需要二個運算對象。底下我們來看一些實例:
24
邏輯運算 在上面的最後一行 , 由於『比較運算的優
先順序大於邏輯運算』 ,因此 9>6 、 3<2 會先運算 , 然後再將這二個運算結果做 And 運算。另外 , 多個邏輯運算子也可以同時出現 , 此時的運算優先順序為『 Not > And > Or > Xor 』 , 例如:
25
邏輯運算 以上的式子其實並不容易了解 , 而且順序
也很容易弄錯。因此 , 建議大家還是多用小括號來標出運算的順序:
26
邏輯運算 所有比較運算子的優先順序都相同 , 而且
都高於邏輯運算子 , 但低於算術 (+ - * / . . . ) 和串接 (&) 運算子。
請填寫以下的真值表:
27
邏輯運算 請寫出以下所描述的條件式:
(1) 我的年齡 (a) 大於 15 歲 , 但小於 25 歲。(2) 考試日期 (d) 不是在 10/21/2008 以前 , 就是在 10/25/2008 以後。(3) 她的名字 (n) 既不是 "Jenny", 也不是 "Mary" 。(4) 如果真的要考試 (isEx), 而且日期 (d) 是今天 , 而且時間 (t) 是現在。(5) 紅燈 (r) 與藍燈 (b) 必須保持一個燈亮 (True) 一個燈暗 (False) 的狀況 , 否則視為固障 (False) 。(6) 她們二個人 (x 、 y) 只有一個人的名字叫 "Sue" 。
28
邏輯運算
(1) a < 25 And a > 15
(2) d < #10/21/2008# Or d > #10/25/2008#
(3) n <> "Jenny" And n <> "Mary"
(也可寫成 Not n = "Jenny" And Not n = "Mary")
(4) isEx And d = Today And t = TimeOfDay
(isEx 也可寫成 isEx = True)
(5) r Xor b
(6) x = "Sue" Xor y = "Sue"
29
邏輯運算 使用 T o d a y 可取得今天的日期 ( 時間
固定為 #0:0:0# );使用 TimeOfDay 則可取得目前的時間 (日期固定為 #1/1/0001#) 。
30
檢查範圍的條件式 如果 a 是在某個範圍之內 , 則通常會用
And 條件來指定 , 例如『 a> 5 And a < 25 』 , 或『 a >= 5 And a <= 25 』 ( 包含 5 及 25 時 ) 。
31
檢查範圍的條件式 反之 , 如果 a 是在某個數值範圍之外 , 則
可用 Or 條件來指定 , 例如『 a < 5 Or a > 25 』 , 或『 a <= 5 Or a >= 25 』 ( 包含 5 及 25 時 ) 。
32
檢查範圍的條件式 在上一章中 , 我們曾寫了一個將使用者輸
入的數值 , 分別以十進位、十六進位、及八進位顯示出來的程式;請再加入『檢查使用者輸入值是否正確』的功能。
33
檢查範圍的條件式
34
檢查範圍的條件式1. 請開啟範例專案 Ch06-01 。2. 請加入下面灰底區程式 , 以進行簡單的數值檢查 ( 為了不要太複雜 , 我們只檢查第一個字元 ) :
35
檢查範圍的條件式
36
檢查範圍的條件式 其實 VB 有提供一個 IsNumeric( 字串 )
函式 , 可用來判斷字串中是否為正確的數值格式。請將上面程式改良為使用 IsNumeric() 函式來檢查。
37
檢查範圍的條件式 和 IsNumeric( ) 類似的函式還有 IsDate(
), 可用來判斷是否為正確的日期時間格式 , 例如: IsDate("08 15, 2009 10:22 AM") 會傳回 True, IsDate("Hello") 則傳回 False 。
38
6-2 If 敘述:選擇性執行 相信大家對於 If 敘述已經很熟悉了 , 本節
會先為您做個總整理 , 然後再補充一些新的應用 , 讓您在寫程式時可以有更多的選擇!
39
3 種基本的 If 結構 最簡單的 If 結構只有一行 , 就是『 If ... T
hen ... 』 , Then 後面只接一個指令 , 例如:
40
3 種基本的 If 結構 如果當條件成立時要執行多行的程式 , 則
可使用『 If ... Then ...End If 』結構 , 例如:
41
3 種基本的 If 結構 當我們在程式中輸入 IF ... Then 然後按
[Enter] 鍵換行時 , VB 會很體貼地在下二行的位置自動加入 End If, 幫我們節省一些打字的時間。
42
3 種基本的 If 結構 最後 , 則是加入 Else (否則 ) 的結構 , 例
如:
43
巢狀的 If 結構 在 If 結構中還可以再有 If 結構 , 我們稱
之為『巢狀 If 結構』 , 例如:
44
巢狀的 If 結構 百貨公司週年慶 , 促銷折扣的規則如下 ,
請寫一個程式來計算應付金額。
45
巢狀的 If 結構
46
巢狀的 If 結構1. 請開啟範例專案 Ch06-02, 我們已加入了所需的控制項:
47
巢狀的 If 結構 除了以上標示的屬性設定外 , 表單的 Accep
tButton ( 預設按鈕 )屬性也設為 Button1, 而 TextBox2 的 Enabled ( 可以操作 ) 屬性則設為 False, 表示不允許輸入或編輯資料。
48
巢狀的 If 結構2. 先大致畫出計算的流程圖:
49
巢狀的 If 結構3. 雙按 Button1 按鈕 , 然後輸入下面程式:
50
巢狀的 If 結構4. 以上是先輸入『計算應付金額』的程式 , 請按 鍵測試看看 , 如果沒問題則再輸入剩下的部份 ( 下面灰底的程式 ) :
51
巢狀的 If 結構
52
巢狀的 If 結構
53
巢狀的 If 結構 因此使用者在輸入金額後無論是按 [Enter]
鍵或 鈕 , 程式都會立即顯示計算結果 , 然後自動將輸入焦點移到 TextBox1 中並選取所有文字 , 以方便繼續輸入下一個要計算的金額 (輸入新的金額時會覆蓋掉舊的金額 ) 。
54
巢狀的 If 結構 利用 InputBox() 和 MsgBox(), 將使用者
輸入的數值取絕對值 , 然後判斷是個位、十位、或百位以上的數值。
55
巢狀的 If 結構
建立一 Windows 程式 , 然後撰寫表單的 Load 事件程序如下:
56
巢狀的 If 結構
57
多條件逐一過濾的 ElseIf 有時我們會用多個條件來逐一過濾 , 例如:
如果成績『 >= 90 』則為甲 , 否則若『 >=80 』則為乙 , 否則若『 >=70 』則為丙 , 否則為丁。這類情況如果使用巢狀的 If, 必須寫好幾層:
58
多條件逐一過濾的 ElseIf
59
多條件逐一過濾的 ElseIf 此時 , 我們可使
用逐一過濾的 ElseIf 來簡化程式 , 讓程式更容易了解:
60
多條件逐一過濾的 ElseIf 利用 InputBox() 、 MsgBox() 、和 ElseIf,
將使用者輸入的成績依上述規則 , 轉換為甲、乙、丙、丁的評等 , 另外如果小於 60 分 , 則要評為 “不及格”。
建立一 Windows 程式 , 然後撰寫表單的 Load 事件程序如下:
61
多條件逐一過濾的 ElseIf
62
6-3 If() 運算子:依條件傳回不同的值 If() 運算子是一個很特殊的運算子 , 它可依
據指定條件的真假 , 而傳回不同的值。其主要功能 , 就是用來簡化類似『 If A Then m=B Else m=C End If 』的敘述:
63
If() 運算子:依條件傳回不同的值 因此原本 5 行的 If...Else...End If 敘述 ,
可以用 If() 簡化為一行。例如我們可將巢狀的 If 加以簡化:
64
If() 運算子:依條件傳回不同的值 不過請注意 , 適度的簡化程式能增加『可
讀性』 , 讓程式更容易了解;但過度的簡化則可能適得其反 , 例如我們將上面的程式再度簡化成為一行:
以上程式雖然可以正確執行 , 但卻不易閱讀 , 也容易出錯!因此建議大家盡量不要使用巢狀的 If(), 以免造成反效果。
65
If() 運算子:依條件傳回不同的值 請將前面計算百貨公司折扣的範例 ( 可開
啟範例專案 Ch06-02ok 來修改 ), 用 If() 運算子加以簡化。
66
If() 運算子:依條件傳回不同的值
VB 另外還提供一個 Iif() 函式 , 其用法就跟 If() 運算子相同。這二者都可以使用 , 但我們建議使用 If() 運算子 , 因為執行效率比較好。
67
6-4 Select Case :依資料做多重選擇 有時候我們會依照一個變數的值 , 或是一
個運算式的結果來做多重選擇 , 例如:
68
Select Case :依資料做多重選擇 這時用 If 來寫就顯得有點累贅了 , 因為要
不斷重複地寫 "num =...",連看的人都會覺得頭昏呢!這時我們就可以用 Select Case 敘述來加以簡化:
69
Select Case :依資料做多重選擇 這樣是不是清爽多了呢!底下是 Select C
ase 的流程圖:
70
Select Case :依資料做多重選擇 在每一個 Case 之後 , 除了直接列出可能
的值之外 , 還可以用 To 來指定範圍 , 或是用 Is 來設定比較條件 , 底下我們來看實例:
寫一程式 , 可依照下表的年齡來判斷學生的教育層級。
71
Select Case :依資料做多重選擇
72
Select Case :依資料做多重選擇1. 建立 Windows Form 應用程式專案 Ch0
6-03 。2. 用滑鼠雙按表單 , 然後在 Form1 的 Load 事件程序中加入以下程式:
73
Select Case :依資料做多重選擇
74
Select Case :依資料做多重選擇
75
Select Case :依資料做多重選擇 當我們在程式中輸入 Select Case ... 然後
按 [Enter] 鍵換行時 , VB 也會很體貼地在下二行位置加入 End Select, 幫我們節省一些打字的時間。
請寫一輸入帳號的程式 , 並依下表判斷是先生、小姐、或特殊身份。
76
Select Case :依資料做多重選擇
77
Select Case :依資料做多重選擇
78
Select Case :依資料做多重選擇
79
Select Case :依資料做多重選擇 請寫一個猜數字遊戲 , 玩法如下:
80
Select Case :依資料做多重選擇
81
Select Case :依資料做多重選擇1. 請開啟範例專案 Ch06-04, 表單中已放入所需的控制項:
82
Select Case :依資料做多重選擇 在表單中我們利用 4 個 Label 控制項來
暫存資料: vAns 用來存放答案 , vMin 、 vMax 是存放猜測範圍的下限及上限 , 而 vCnt 則是記錄一共猜了多少次:
83
Select Case :依資料做多重選擇2. 請在表單中空白處雙按滑鼠 , 然後輸入表單
Load 事件程序的內容:
84
如何取得隨機的整數值? Rnd() 函式可傳回一個『大於或等於 0 且
小於 1 的實數』 , 但在第一次使用前應先執行 Randomize() 函式 ( 會以當時的時間做亂數的初始化 ), 否則每次啟動程式後 , 第一次執行 Rnd() 函式時都會得到相同的值。如果我們想取得介於 A 到 B 的隨機整數值 , 則可使用以下公式:
85
如何取得隨機的整數值? Int() 函式可直接移除掉小數點的部份 ( 但
不會轉換型別 );而 CInt() 可將資料轉換為整數型別 ( 但如果有小數則會四捨六入五成雙 ) 。這二者的組合 , CInt(Int(...)),則會先去除小數 , 然後轉換為整數型別。
86
Select Case :依資料做多重選擇3. 我們來撰寫 Button1 的 Click 事件程序:
87
Select Case :依資料做多重選擇 這個猜數字遊戲的基本邏輯其實很簡單 ,
就是不斷比較使用者猜的數字並調整猜測範圍 , 直到猜對為止。除此之外 , 比較特別的有下列 3 點:
1. 87需要取得一個隨機的整數做為答案:取得的方法前面已介紹過了 , 就是一開始先執行 Randomize() 函式做初始化 , 然後在需要時即可使用 Rnd() 函式來取得隨機亂數 (>= 0 且 < 1) 。如需將亂數轉換為特定範圍內的整數 , 則只要套用固定的運算公式即可。
88
Select Case :依資料做多重選擇2. 使用標籤 (Label) 來保存資料:我們使用
標籤控制項 vAns 的 Text 屬性來保存『答案』 , 以便後續每次使用者按下按鈕時做比對之用 (vAns 的 Visible 屬性已設為 False, 因此執行時看不到答案 ) 。
其他 3 個標籤: vMin 、 vMax 、 vCnt 則是同時做為顯示及保存資料之用。
3. 為了讓使用者可以方便地輸入數字 , 我們將表單的 Accept Button 屬性設為 Button1, 並在程式的最後加入 TextBox1.Focus() 及 TextBox1.SelectAll() 敘述。
89
Select Case :依資料做多重選擇 在前面程式中 , 為什麼要用隱藏的標籤 v
Ans 來保存答案 , 而不直接儲存在程序的 ans 變數中呢?
90
Select Case :依資料做多重選擇 這是由於凡是在程序中宣告的變數 , 只在
該程序被執行時才會產生 , 而當程序結束時變數也會隨之消失。因此每次程序被執行 ( 使用者按下按鈕 ) 時 , 該變數都會重新產生 , 所以根本無法持續保存資料。
如果想要建立一個能持續保存資料 , 而且在所有程序中都能存取的變數 , 則可將變數宣告在程序之外 , 而成為表單層級的變數。例如底下的改良版程式:
91
Select Case :依資料做多重選擇
92
6-5 做為選擇用的控制項 常見的選擇用控制項有二種 , 一種是 Radi
oButton ( 單選鈕 , 或稱選項按鈕 ), 另一種則為 CheckBox ( 多選鈕 , 或稱核取方塊 ) :
93
做為選擇用的控制項 以上的 GroupBox (群組方塊 ) 是做為分
組之用 , 它就像是小容器 , 我們可將視窗內的各類控制項放到不同的容器中 , 以達到分組的效果。
94
RadioButton ( 單選鈕 ) RadioButton ( 單選鈕 ) 就好像是考試的單
選題一樣 , 每一題都只能選擇其中的一個答案。直接放在表單中的所有 RadioButton 會被視為一題 , 因此每次只能有一項被選取;如果想要分為多題 , 則可用 GroupBox (群組方塊 ) 來加以區分。
95
RadioButton ( 單選鈕 ) 製作一個可以選擇字體及大小的表單。
96
RadioButton ( 單選鈕 )1. 請建立 Windows Form 應用程式專案 Ch0
6-05 。2. 使用工具箱的 將 3 個 Radi
oButton 加入表單中 , 並依下圖設定其 Text 屬性 , 然後再將表單調小一點:
97
RadioButton ( 單選鈕 )3. 按 [F5] 鍵啟動程式 , 然後每一個項目都選
選看:
98
RadioButton ( 單選鈕 ) 由以上的操作可以得知 , 凡是擁有輸入焦
點的選項 , 就會變成選取的狀態 , 而其他選項則會自動變成非選取狀態。
由於 RadioButton1 是我們第一個加入的控制項 ( 其 TabIndex 屬性為 0), 所以當表單開啟時 , 輸入焦點就會落在 RadioButton1 上 , 因而成為自動被選取的選項。
99
RadioButton ( 單選鈕 )4. 按 鈕關閉視窗 , 然後在工具箱中展開
容器項目 , 將加入表單中並調整大小:
100
RadioButton ( 單選鈕 )5. 將群組方塊 GroupBox1 的 Text 屬性改為
" 大小 ", 然後將 RadioButton3 拉曳到群組方塊中:
101
RadioButton ( 單選鈕 )6. 繼續在群組方塊 GroupBox1 中新增 3 個
單選鈕 , 並分別設定 Text 屬性為 10 、 11 、 12 :
102
RadioButton ( 單選鈕 )
103
RadioButton ( 單選鈕 )7. 按 [F5] 鍵 , 然後選擇不同的選項看看:
其實表單、群組方塊都是一種容器 , 而單選鈕是以容器做為分組的依據 , 因此放在同一個容器中的單選鈕即為同一組。
104
表單開啟時 , 預設會選取哪一個單選鈕?
有時在開啟表單時 , 單選鈕的預設選取狀態會很奇怪 , 例如下圖:
105
表單開啟時 , 預設會選取哪一個單選鈕?
由於單選鈕是以 Checked 屬性來記錄選取狀態 ( 為 True 時表示選取 , 為 False 時則為未選取 ), 因此我們在設計時即可利用此屬性來指定預設選取的單選鈕:
106
RadioButton ( 單選鈕 ) 注意 , 如果將單選鈕直接放在表單中 , 而
且其 TabIndex ( 定位順序 ) 屬性的值最小 , 那麼表單在開啟時 , 輸入焦點就會直接落在此單選鈕上 , 所以不管在設計時如何設定 Checked 屬性 , 在執行時該單選鈕均會自動被選取 (因為擁有輸入焦點 ) 。
107
CheckBox ( 多選鈕 ) CheckBox ( 多選鈕 ) 就好像是考試的多選
題一樣 , 每一個答案都可以單獨地選取或不選取 , 而不會影響到其他答案。 CheckBox 也可以用 GroupBox (群組方塊 ) 來加以區分 , 但只有視覺上的區隔效果 , 而沒有任何分組選擇的功能。
108
CheckBox ( 多選鈕 ) 製作一個可以選擇字體、大小、以及樣式
( 粗體 / 斜體 /刪除線 /底線 ) 的表單。
109
CheckBox ( 多選鈕 )1. 請開啟範例專案 Ch06-06, 我們已經加入
一些基本的控制項:
110
CheckBox ( 多選鈕 )2. 使用工具箱的 , 在視窗
右邊的樣式群組方塊中加入 4 個多選鈕:
111
CheckBox ( 多選鈕 )3. 多選鈕和單選鈕一樣 , 都是利用 Checked
屬性來決定是否選取 ( 等於 True 時代表選取 ) 。請將第 2 及第 4 個多選鈕設定為預設選取的項目:
112
CheckBox ( 多選鈕 )4. 按 [F5] 鍵測試看看:
113
展示各種字型效果 在設計表單時 , 我們可以展開屬性窗格的
Font 屬性 , 來設定 Label 、 TextBox 、 Button 等控制項的字型效果:
114
展示各種字型效果
115
展示各種字型效果 不過 , 以上 Font 屬性的 Name 、 Size 、
Bold 等子屬性 , 在程式執行時都是唯讀的 ( 只能讀取不能更改 ), 因此如果想用程式動態改變控制項的字型 , 就必須建立一個 Font 物件來設定:
116
展示各種字型效果 其中 Font() 的樣式參數共有 5 種 , 如下
表所示:
117
展示各種字型效果 如果要同時套用多種樣式 , 可將各樣式用
Or 組合起來 , 例如:
除了 Or 之外 , 也可以使用 + 號來組合。
118
為什麼使用 Or 來組合『粗體、斜體』?
之前所介紹的邏輯運算子 Or, 不但可以針對布林資料進行『或』的運算 , 當其運算對象為數值時 , 還會變成位元運算子 , 可針對每一個位元來進行『或』的運算。例如:
119
為什麼使用 Or 來組合『粗體、斜體』?
位元運算子最常見的用法 , 就是拿來做為不同設定值的組合 , 例如 FontStyle 的設定值有下列幾種:
120
為什麼使用 Or 來組合『粗體、斜體』?
由於每一種設定值都使用不同的位元來表示 ( 例如 Bold 使用右邊第 1 個位元 ,而 Italic 則使用第 2 個位元 ), 因此我們可以用 Or 來進行不同設定值的組合 , 例如粗體加斜體就是:
121
為什麼使用 Or 來組合『粗體、斜體』?
除了 Or 外 , Not 、 And 、及 Xor 也都具有相同的特性 , 也就是當運算對像為數值 (若為非整數的數值會先自動轉換為整數 ) 時 , 就會變成位元運算子 , 以位元為單位來進行『不是、且、恰有一為真』的運算。
122
展示各種字型效果 利用前面範例做過的字型設定表單 , 來動
態展示各種字型的設定效果。
123
展示各種字型效果1. 請開啟範例專案 Ch06-07, 我們已經準備
好了所需的控制項:
124
展示各種字型效果2. 雙按右下角的 Button1 按鈕 , 開啟程式碼
視窗來建立 Button1 的 Click 事件程序:
125
展示各種字型效果
126
展示各種字型效果3. 按 [F5] 鍵進行測試。
無論是單選鈕或多選鈕 , 都可使用其 Checked 屬性來判讀是否被選取。在上面程式中 , 有許多地方使用了 If() 運算子來簡化程式 , 如果讀者對 If() 還不熟 , 可往前翻到 6-3 節再複習一下。
127
展示各種字型效果 請修改前面的範例 , 當使用者更改任何一
個單選鈕或多選鈕時 , 就立即在上方顯示出更改後的效果 , 而不用再按右下角的按鈕;另外 , 請將粗體多選鈕設為預設呈勾選狀態 , 並將右下角按鈕的功能改為『回復正常樣式』 ( 就是清除所有已勾選的樣式 ) 。
128
展示各種字型效果
129
展示各種字型效果
1. 在設計視窗中將粗體多選鈕的 Checked 屬性設為 True,然後將 Button1 的 Text 屬性改為『回復正常樣式』。
2. 切換到程式碼視窗 , 將 Button1_Click 事件程序的第一行修改如下:
130
展示各種字型效果 Handles 就是『要處理』的意思 , 每當所
Handles 的事件發生時 , 即會觸發 ( 執行 ) 該事件程序來處理。
3. 在程序中處理樣式的部份 , 增加以下灰底的程式:
131
展示各種字型效果
132
展示各種字型效果 寫一個程式如圖
所示 , 按 [-] 時可將字體大小減 1, 按 [+] 時則加 1 。
133
展示各種字型效果
134
展示各種字型效果
在上面程式中 , 利用 TextBox1.Font.Name 、TextBox1.Font.Size 、及 TextBox1.Font.Style 來讀取 TextBox1 的字體名稱、大小、及樣式。 ( 請注意 , 這些子屬性都是唯讀的喔! )
另外 , 文字方塊 (TextBox) 的高度會隨著其字體大小而自動調整 ,因此我們只要預留足夠的空間給它縮放就好 , 而不必在程式中另做處理。