了 解 副 程 式 意 義 及 使 用 時 機, 變 數 的 存 取 範 圍 及 多 表 單 的 程 式 設 計 7-1 函 式 7-2 副 程 式 7-3 變 數 的 範 圍 7-4 傳 值 呼 叫 及 傳 址 呼 叫 7-5 多 表 單 程 式 設 計 (MDI) 7-6 習 題
在 程 式 設 計 過 程 中, 程 式 會 因 為 不 斷 成 長, 程 式 碼 會 愈 來 愈 長, 有 一 部 份 會 重 複 使 用, 這 個 重 複 部 份 可 以 將 它 寫 成 一 個 程 式 片 段, 方 使 程 式 設 計 人 員 共 同 使 用, 這 個 程 式 片 段 我 們 稱 為 副 程 式 或 函 式 7-1 學 習 函 式 的 宣 告 和 使 用 當 一 個 專 案 程 式 程 式 碼 數 量, 還 在 一 千 行 內 時, 並 不 會 感 到 副 程 式 或 函 式 所 帶 來 的 好 處, 但 是 在 程 式 超 過 一 定 數 量 時, 即 會 感 到 這 副 程 式 或 函 式 有 存 在 的 必 要 性 因 為 副 程 式 或 函 式 只 要 更 改 一 次 即 可 完 成 修 改 程 式 碼 工 作 如 果 這 個 程 式 片 段 在 專 案 中 重 複 5 次, 在 不 同 表 單 中 或 物 件 內 重 複, 程 式 設 計 人 員 即 要 修 改 5 次, 如 果 少 改 一 個, 即 有 可 能 產 生 無 法 預 期 錯 誤 副 程 式 及 函 式 在 程 式 設 計 有 以 下 優 點 把 重 覆 的 程 式 模 組 化, 簡 化 程 式 設 計 時 間 提 高 維 護 程 式 的 方 便 性 增 加 程 式 的 可 讀 性 節 省 程 式 碼 長 度 一 般 較 常 用 副 程 式 或 函 式,Visual Basic 都 已 經 寫 好 放 在 系 統 之 中, 例 如 常 用 數 學 函 數 都 在 Math 物 件 中, 只 要 使 Math 物 件 即 可 簡 單 使 用 數 學 函 數, 例 如 三 角 函 數 Math.Sin(X) Math.Cos(X) 及 Math.Tan(X) 等, 而 這 些 函 數 我 們 可 以 直 接 呼 叫 使 用, 不 需 自 己 撰 寫 的, 這 種 內 建 在 系 統 中 我 們 稱 為 內 建 函 式, 而 由 自 己 來 撰 寫 稱 為 副 程 式 或 函 式, 一 般 稱 為 自 建 函 式 7-2
07 副 程 式 只 用 來 完 成 特 定 的 任 務, 並 不 一 定 會 傳 回 值 而 函 式 不 僅 用 來 完 成 一 特 定 的 功 能, 並 在 執 行 後 會 傳 回 一 個 值, 這 個 章 節 將 介 紹 函 式 [Public] [Private] Function 函 數 名 稱 ( 參 數 資 料 串 列 ) [As 資 料 型 態 ] 程 式 敘 述 函 數 名 稱 = 回 傳 值 或 Return 回 傳 值 End Function 1. 函 式 名 稱 命 名 方 式 如 同 變 數 命 名 方 式, 而 且 不 可 和 目 前 變 數 名 稱 相 同 2. 參 數 資 料 串 列, 可 以 傳 遞 資 料 到 函 式 計 算, 也 可 以 不 傳 遞 一 般 而 言 函 式 是 要 傳 回 主 程 式 一 個 值, 也 有 可 能 不 傳 遞, 但 是 如 果 不 傳 回 的 話, 使 用 副 程 式 會 比 較 好 3. 函 式 要 在 模 組 中 進 行 宣 告, 或 表 單 開 始 或 結 束 地 方 宣 告 4. 在 宣 告 函 式 時 如 果 是 以 Private 為 開 頭 時, 只 允 許 同 一 個 模 組 下 來 呼 叫 使 用, 如 果 是 使 用, 以 Public 為 開 頭 時, 容 許 目 前 應 用 程 式 的 所 有 程 序 或 模 組 呼 叫 使 用, 若 函 式 無 特 別 指 定 Private 或 Public, 預 設 為 Public 主 程 式 { 回 傳 函 數 值 = 自 定 函 數 1( 變 數 ) } Function 自 定 函 數 1( 傳 入 變 數 ) as 資 料 型 態 { 計 算 過 程 自 定 函 數 1= 計 算 結 果 } End Function 7-3
7-1-1 應 用 實 例 ( 一 ): 三 角 形 的 面 積 三 角 形 面 積 公 式 ( 海 龍 公 式 ) 如 下 : 邊 長 分 別 為 a,b,c, 三 角 形 的 面 積 S 可 由 以 下 公 式 求 得 : S = p( p a)( p b)( p c ) 其 中 + + p = a b c 2 資 料 輸 出 Textbox 資 料 輸 入 Textbox 7-4
07 1 Function C_triangle(ByVal A As Integer, ByVal B As Integer, ByVal C As Integer) As Single 2 Dim P, S As Single 3 P = (A + B + C) / 2 4 S = Math.Sqrt(P * (P - A) * (P - B) * (P - C)) 5 C_triangle = S 6 End Function 7 8 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 9 Dim temp_1, temp_2, temp_3 As Integer 10 Dim angle_v As Single 11 temp_1 = Val(TextBox1.Text) 12 temp_2 = Val(TextBox2.Text) 13 temp_3 = Val(TextBox3.Text) 14 If temp_1 > 0 And temp_2 > 0 And temp_3 > 0 Then 15 angle_v = c_triangle(temp_1, temp_2, temp_3) 16 If angle_v > 0 Then 17 TextBox4.Text = angle_v 18 Else 19 TextBox4.Text = " 錯 誤 的 三 邊 長 " 20 End If 21 Else 22 MsgBox(" 三 邊 長 的 值 一 定 要 輸 入 不 可 為 0", MsgBoxStyle.OkOnly) 23 End If 24 End Sub 第 1 行 到 第 6 行 為 宣 告 一 個 Function C_triangle() 用 來 計 算 已 知 三 個 邊 長 的 三 角 形 面 積 第 9 行 宣 告 三 個 變 數, 用 來 儲 存 由 TextBox 輸 入 三 個 邊 長 7-5
第 11 行 到 第 13 行 將 TextBox 輸 入 三 個 邊 長 值, 利 用 數 值 轉 換 函 數 Val() 轉 換 文 字 變 為 數 值 第 14 行 判 斷 是 否 有 輸 入 三 個 邊 長 值, 如 果 不 成 位, 以 MsgBox 顯 示 出 錯 誤 訊 息 第 15 行 將 三 個 邊 長 值 傳 入 Function C_triangle(), 並 由 Function 回 傳 一 個 值 第 16 行 到 第 20 行 將 計 算 結 果 作 出 檢 查, 如 果 是 大 於 0 表 示 是 可 以 形 成 一 個 三 角 形 的 三 個 邊 長, 如 果 不 知 即 是 無 法 形 成 一 個 三 角 形 的 三 個 邊 長, 例 如 三 邊 長 為 99,1,1 即 無 法 形 成 一 個 三 角 形 7-1-2 應 用 實 例 ( 二 ): 球 的 表 面 積 球 表 面 積 公 式 如 下 : 2 球 表 面 積 = 4π r 物 件 屬 性 設 定 說 明 Label2 AutoSize False 這 三 個 值 設 為 相 同 時, 則 其 物 MaximumSize 220,20 件 的 寬 度 固 定 為 280 pt Size 220, 40 TEXT 清 除 不 要 任 何 文 字 Label1 BackColor BurlyWood TEXT 請 輸 入 球 的 半 徑 7-6
07 Label 控 制 項 1 Function Compute(ByVal R As Single) As Double 2 Dim tempv As Double 3 tempv = 4 * Math.PI * R ^ 2 4 Compute = tempv 5 End Function 6 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 7 If IsNumeric(TextBox1.Text) Then 8 Label2.Text = " 球 表 面 積 : " & Compute(Val(TextBox1.Text)).ToString 9 Else 10 Label2.Text = " 請 輸 入 半 徑 值 " 11 TextBox1.Text = "" 12 End If 13 End Sub 7-7
第 1 行 到 第 5 行 為 宣 告 一 個 Function Compute() 用 來 計 算 球 表 面 積, 其 中 的 Math.PI 表 示 數 學 上 的 圓 週 率 π 傳 入 半 徑 值, 計 算 完 成 回 傳 到 主 程 式 第 7 行 用 IsNumeric() 判 別 是 否 為 數 字 性 資 料, 如 果 是 則 傳 入 副 程 式 計 算, 否 則 出 現 錯 誤 訊 息 到 Label2 物 件 第 8 行 計 算 完 成 直 接 轉 為 字 串, 顯 示 到 Label2 物 件 7-1-3 應 用 實 例 ( 三 ): 身 份 證 號 碼 檢 驗 身 份 證 號 碼 是 每 一 個 人 都 具 備 的, 而 在 這 個 號 碼 中 其 存 在 著 一 個 特 定 運 算 法 則, 以 便 能 用 來 檢 查 資 料 是 否 正 確 在 各 種 升 學 及 就 業 考 試 報 名 時, 都 要 填 寫 身 分 證 字 號, 如 報 名 程 式 中 無 檢 查 功 能, 將 來 在 後 續 的 錄 取 及 分 發 作 業 上, 可 能 會 產 生 不 必 要 困 擾, 因 此 這 個 檢 查 程 序 是 必 要 的 第 一 位 為 英 文 字 母, 第 二 個 數 字 是 男 女 生 之 分, 男 生 為 1, 女 生 為 2, 身 份 證 字 號 第 三 碼 到 第 九 碼 為 資 料 碼, 第 十 碼 位 為 檢 查 碼, 必 須 經 過 之 前 一 個 字 母 與 8 個 數 字 的 組 合 計 算 後 即 可 了 解 是 否 正 確 身 分 證 驗 證 原 則 如 下 : 英 文 代 號 以 下 表 轉 換 成 數 字 (1) 英 文 轉 成 的 數 字, 個 位 數 乘 9 再 加 上 十 位 數 (2) 第 一 個 數 字 到 第 八 個 數 字, 從 左 到 右 依 次 乘 上 8 7 6 5 1 (3) 最 後 一 個 數 字 A=10 L=20 X=30 B=11 M=21 Y=31 C=12 N=22 W=32 D=13 P=23 Z=33 E=14 Q=24 I=34 F=15 R=25 O=35 G=16 S=26 H=17 T=27 J=18 U=28 K=19 V=29 7-8
07 (1)(2)(3) 的 和, 除 以 10 求 出 餘 數, 如 果 是 0, 表 示 是 正 確 身 份 證 字 號, 如 果 不 是 即 是 錯 誤 的 例 如 : 身 分 證 號 碼 是 A123456789 A 1 2 3 4 5 6 7 8 9 10 8 7 6 5 4 3 2 1 1+0*9=1 1*8=8 2*7=14 3*6=18 4*5=20 5*4=20 6*3=18 7*2=14 8*1=8 9 1 + 8 + 14 + 18 + 20 + 20 + 18 +14 + 8 +9= 130 130/10=13...0 餘 數 為 0 身 份 證 字 號 為 A123456789 是 正 確 的 物 件 屬 性 設 定 說 明 Label2 MaximumSize.width 300 MinimumSize.width 300 Size.width 300 TEXT Label1 BackColor BurlyWood 這 三 個 值 設 為 相 同 時, 則 其 物 件 的 寬 度 固 定 為 300 pt 清 除 不 要 任 何 文 字 7-9
Label 控 制 項 1 Function Checkid(ByVal PerID As String) As Boolean 2 REM 檢 查 身 份 證 號 碼 是 否 正 確 3 Dim EngArray As String ' 定 義 身 份 證 使 用 到 的 英 文 字 串 4 Dim PerIdTemp As Integer 5 Dim PerIdChk1, PerIdChk2, PerIdChk3, PerIdChkSum As Integer 6 Dim Loops As Integer 7 8 REM 算 出 英 文 字 母 值 9 EngArray = "ABCDEFGHJKLMNPQRSTUVXYWZIO" 10 PerIdTemp = InStr(1, EngArray, Microsoft.VisualBasic.Left(PerID, 1)) + 9 11 PerIdChk1 = (PerIdTemp \ 10) + (PerIdTemp Mod 10) * 9 12 REM 取 出 數 字, 並 計 算 數 值 部 份 加 權 值 13 For Loops = 2 To 9 14 PerIdChk2 = PerIdChk2 + Val(Mid(PerID, loops, 1)) * (10 - loops) 15 Next 16 PerIdChkSum = Val(Microsoft.VisualBasic.Right(PerID, 1)) 17 REM 全 部 值 除 以 看 是 否 整 除 18 If (PerIdChk1 + PerIdChk2 + PerIdChkSum) Mod 10 = 0 Then 19 Checkid = True 20 Else 21 Checkid = False 7-10
07 22 End If 23 End Function 24 25 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 26 If Len(TextBox1.Text) = 10 Then 27 If Checkid(UCase(TextBox1.Text)) Then 28 Label2.Text = " 正 確 身 份 證 號 碼 " 29 Else 30 Label2.Text = " 錯 誤 身 份 證 號 碼 " 31 End If 32 Else 33 Label2.Text = " 身 份 證 號 碼 要 10 碼 " 34 TextBox1.Text = "" 35 End If 36 End Sub 37 38 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 39 End 40 End Sub Function Checkid 定 義 為 傳 回 布 林 值, 如 為 正 確 則 傳 回 True, 否 則 即 傳 回 False 將 身 份 證 號 碼 用 到 的 英 文 字 母, 依 照 對 應 轉 換 出 來 的 數 值, 順 序 排 列 為 一 個 字 串 "ABCDEFGHJKLMNPQRSTUVXYWZIO" 利 用 Instr() 找 出 要 檢 驗 身 分 證 號 碼 相 同 字 母 的 位 置 值 再 加 上 9, 轉 換 出 對 應 值 轉 換 值, 例 如 Z 的 位 置 在 該 項 字 串 位 置 是 24, 加 上 9 即 為 33, 由 身 分 證 驗 證 原 則 中 列 表 可 得 知, 並 將 英 文 轉 成 的 數 字, 個 位 數 乘 9 再 加 上 十 位 數, 儲 存 到 PerIdChk1 用 一 個 迴 路 將 前 8 個 數 字 依 序 取 出, 並 乘 上 加 權 值 ( 即 是 迴 路 值 ), 儲 存 到 PerIdChk2 7-11
取 出 最 後 一 個 數 字 儲 存 到 PerIdChk3 將 PerIdChk1 PerIdChk2 和 PerIdChk3 三 個 數 加 起 來, 並 除 以 10 是 否 餘 數 為 0, 如 果 為 0 即 是 正 確 的 身 分 證 號 碼, 如 果 不 為 0, 這 個 身 分 證 號 碼 即 是 錯 誤 的 Instr( 起 始 位 置, 目 標 字 串, 目 的 字 串, 比 對 型 態 ) 1. 以 起 始 位 置 為 起 點, 在 目 標 字 串 中 找 尋 目 的 字 串, 並 傳 回 在 目 標 字 串 的 位 置 值 2. 比 對 型 態 如 果 設 定 為 0 為 執 行 二 進 位 比 對 寫, 設 定 為 1 執 行 文 字 比 對 UCase( 字 串 ): 將 字 串 中 小 寫 的 字 母, 轉 換 成 大 寫 字 母 LCase( 字 串 ): 將 字 串 中 大 寫 的 字 母, 轉 換 成 小 寫 字 母 1. 請 輸 入 立 方 體 三 個 長 度 值 求 其 表 面 積 及 體 積 2. 請 將 球 表 面 積 改 為 計 算 球 體 積, 公 式 如 下 球 體 積 =1/3( 球 表 面 積 * 半 徑 ) 7-2 學 習 函 式 的 副 程 式 宣 告 和 繪 圖 指 令 使 用 7-12
07 7-2-1 副 程 式 定 義 副 程 式 和 函 式 最 大 不 同 在 於 函 式 會 傳 回 一 個 值, 但 是 在 副 程 式 並 不 會 回 傳 一 個 值, 如 果 要 傳 回 值 可 利 用 本 章 全 域 變 數 或 是 傳 址 呼 叫, 來 進 行 變 數 內 容 的 改 變 [Private] [Public] SUB 副 程 式 名 稱 ( 參 數 資 料 串 列 ) 程 式 敘 述 完 成 特 定 工 作 End Sub 1. 副 程 式 名 稱 命 名 方 式 如 同 變 數 命 名 方 式, 而 且 不 可 和 目 前 變 數 名 稱 相 同 2. 參 數 資 料 串 列, 可 以 傳 遞 資 料 到 副 程 式 計 算, 也 可 以 不 傳 遞 副 程 式 並 不 會 傳 回 值, 參 數 前 加 上 ByVal 為 傳 值 呼 叫, 如 加 上 ByRef 為 傳 址 方 式 傳 遞 3. 副 程 式 要 在 模 組 中 進 行 宣 告, 或 表 單 開 始 或 結 束 地 方 宣 告 4. 副 程 式 不 可 使 用 在 運 算 式 中 5. 在 宣 告 副 程 式 時 如 果 是 以 Private 為 開 頭 時, 只 充 許 同 一 個 模 組 下 來 呼 叫 使 用, 如 果 是 使 用, 以 Public 為 開 頭 時, 容 許 目 前 應 用 程 式 的 所 有 程 序 或 模 組 呼 叫 使 用, 若 副 程 式 無 特 別 指 定 Private 或 Public, 預 設 為 Public 7-13
主 程 式 { Call 副 程 式 1( 變 數 ) 下 一 個 敘 述 } SUB 副 程 式 1( 變 數 ) { 副 程 式 要 完 成 工 作 } End Sub 7-2-2 繪 圖 的 功 能 在 VB 2008 上 如 果 要 在 表 單 上 繪 製 一 些 圖 形 ( 例 如 : 線 條 及 圓 ), 要 利 用 GDI+ 繪 圖 介 面 方 式 來 繪 製, 這 個 是 相 當 大 的 改 變 GDI+ 自 Windows XP 開 始 即 為 作 業 系 統 的 一 部 分, 他 提 供 二 維 的 向 量 圖 形 繪 製 功 能, 其 中 提 供 了 線 條 矩 形 橢 圓 形 弧 形 多 邊 形 基 本 曲 線 及 貝 茲 曲 線 GDI+ 繪 圖 功 能 要 經 由 Graphic 物 件 來 進 行 設 定 及 繪 製, 繪 製 圖 形 的 主 要 座 標 系 統 在 以 表 單 或 是 物 件 的 左 上 角 為 原 點, 向 右 及 向 下 延 伸 座 標 系 統 如 圖 所 示, 下 面 例 子 將 會 說 明 繪 製 圖 形 的 重 要 概 念 1 Dim MyPen As New System.Drawing.Pen(Color.Blue, 10) 2 Dim TextG As System.Drawing.Graphics 3 TextG.DrawLine(myPen, 0, 0, 160, 80) 4 MyPen.Dispose() 5 TextG.Dispose() 7-14
07 第 1 行 設 定 畫 筆 的 樣 式, 其 中 樣 式 包 括 為 顏 色 和 畫 筆 寬 度, 其 中 的 顏 色 可 以 指 定 為 Color 結 構 屬 性 所 表 示 之 色 彩 值, 畫 筆 寬 度 值 為 單 精 確 度, 如 果 值 設 為 0 結 果 和 1 是 相 同 的 第 2 行 以 Graphics 來 建 立 物 件 第 3 行 使 用 Graphics 物 件 來 繪 製 線 條 和 形 狀, 其 中 依 指 定 畫 筆 樣 式 在 起 始 座 標 為 (0,0) 到 結 束 座 標 (160,80), 繪 出 一 條 直 線 在 繪 製 完 成 以 後 要 將 這 些 系 統 資 源, 歸 還 作 業 系 統, 因 為 繪 製 圖 形 是 比 較 浪 費 系 統 資 源 的, 所 以 第 4 行 和 第 5 行 我 們 使 用 Dispose() 來 釋 放 記 憶 體 資 源 7-2-3 時 間 延 遲 [ 不 傳 參 數 ] 應 用 實 例 ( 四 ): 繪 製 直 線 由 左 到 到 右 繪 製 由 右 到 到 左 繪 製 7-15
1 Sub sleep() 2 Dim start, finish As Double 3 start = Microsoft.VisualBasic.DateAndTime.Timer 4 finish = start + 0.1 5 Do While Microsoft.VisualBasic.DateAndTime.Timer < finish 6 ' 空 迴 路 7 Loop 8 End Sub 9 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 10 Dim MyPen As New System.Drawing.Pen(Color.Blue, 20) 11 Dim TextGraphics As System.Drawing.Graphics 12 TextGraphics = Me.TextBox1.CreateGraphics() 13 Dim x1, y1 As Integer 14 X1 = Me.TextBox1.Width 15 Y1 = Me.TextBox1.Height 16 TextGraphics.Clear(Color.White) 17 For i As Integer = 0 To Me.Width Step 40 18 TextGraphics.DrawLine(myPen, i, 0, x1 - i, y1) 19 Call sleep() 20 Next 21 MyPen.Dispose() 22 TextGraphics.Dispose() 23 End Sub 24 25 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 26 End 27 End Sub 7-16
07 第 1 行 到 第 8 行 為 副 程 式 Sub sleep() 主 要 功 用 是 做 一 個 時 間 延 遲, 其 中 的 start 為 最 取 得 進 入 副 程 式 時 的 系 統 時 間,finish 為 start 加 上 要 延 遲 時 間 秒 數, 即 是 要 完 成 時 間 的 系 統 時 間, 並 且 利 用 空 迴 路 來 完 成 時 間 延 遲 工 作 其 中 Microsoft.VisualBasic.DateAndTime.Timer, 主 要 是 取 得 電 腦 系 統 本 身 的 系 統 時 間, 這 個 空 迴 路 時 間 固 定 在 0.1 秒 結 束 第 10 行 為 宣 告 畫 筆 的 樣 式 第 11 行 為 設 定 Graphics 物 件, 第 12 行 將 Graphics 物 件 套 用 在 TextBox1 控 制 項 物 件 上 第 13 行 宣 告 座 標 最 大 值 為 X1 及 Y1, 並 在 第 14 行 及 第 15 行 取 得 TextBox1 控 制 項 物 件 的 寬 度 和 高 度 值 第 16 行 TextGraphics.Clear(Color.White) 主 要 目 的 是 TextBox1 的 背 景 顏 色 設 為 白 色, 如 果 在 配 置 表 單 有 變 更 為 其 他 顏 色 時, 即 要 Clear 為 該 項 色 彩 第 17 行 到 第 19 行 為 一 個 迴 路, 繪 出 直 線 值, 為 了 要 讓 使 用 看 到 其 繪 製 過 程 特 別 呼 叫 時 間 延 遲, 第 18 行 TextGraphics.DrawLine 繪 製 直 線, 而 座 標 值 i, 0 表 示 起 點 座 標 值, 因 為 y 軸 為 0, 將 只 會 固 定 在 TextBox1 上 方, 由 左 到 到 右 繪 製 x1 i, y1 表 示 結 束 座 標 值, 因 為 y 軸 為 變 數 y1, 而 根 據 第 13 行 設 定 後, 將 只 會 固 定 在 TextBox1 下 方, 由 到 右 到 左 繪 製 第 20 行 到 第 21 行 將 繪 圖 資 源 歸 還 作 業 系 統 7-17
7-2-4 時 間 延 遲 [ 傳 遞 參 數 ] 應 用 實 例 ( 五 ): 繪 製 橢 圓 形 由 內 到 到 外 繪 製 1 Sub sleep2(byval sleeptime As Double) 2 Dim start, Finish As Double 3 start = Microsoft.VisualBasic.DateAndTime.Timer 4 Finish = start + sleeptime 5 Do While Microsoft.VisualBasic.DateAndTime.Timer < Finish 6 ' 空 迴 路 7 Loop 8 End Sub 9 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 10 Dim MyPen As New System.Drawing.Pen(Color.Blue, 2) 11 Dim TextGraphics As System.Drawing.Graphics 12 TextGraphics = Me.TextBox1.CreateGraphics() 13 Dim x1, y1, Temp As Single 14 x1 = Me.TextBox1.Width / 2 15 y1 = Me.TextBox1.Height / 2 16 TextGraphics.Clear(Color.White) 7-18
07 17 For i As Integer = 0 To Me.Width Step 40 18 Temp = i / 2 19 TextGraphics.DrawEllipse(MyPen, x1 - i, y1 - Temp, i * 2, i) 20 Call sleep2(0.1) 21 Next 22 MyPen.Dispose() ' 將 各 項 資 源 釋 放 給 作 業 系 統 23 TextGraphics.Dispose() 24 End Sub 25 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 26 End 27 End Sub 第 1 行 到 第 5 行 為 副 程 式 Sub sleep2() 主 要 功 用, 如 同 前 一 個 程 式 一 樣 為 時 間 延 遲 副 程 式, 由 主 程 式 來 傳 入 要 延 遲 時 間, 其 中 各 項 變 數 如 同 前 一 個 程 式, 這 個 空 迴 路 延 遲 時 間, 由 主 程 式 來 決 定 時 間 長 短 第 19 行 TextGraphics.DrawEllipse 繪 製 橢 圓 形, 橢 圓 形 和 圓 形 其 實 都 是 用 這 個 指 令 來 繪 製, 在 繪 製 過 程 是 以 矩 形 為 主 要 的 依 據 ( 如 下 面 圖 例 說 明 ) 座 標 值 x1 - i, y1 - Temp 表 示 矩 形 為 有 上 角 座 標 ( 如 下 面 圖 例 說 明 1), 而 橢 圓 的 長 軸 和 短 軸, 是 由 (i * 2, i) 來 設 定, 在 本 例 的 長 軸 為 i*2 為 水 平 方 向 長 軸 ( 如 下 面 圖 例 說 明 2), 如 果 變 更 為 (i, i * 2) 長 軸 變 為 垂 直 方 向 ( 如 下 面 圖 例 說 明 3) (1) (2) (3) 7-19
在 上 圖 中 我 們 可 以 理 解,VB 2008 是 一 個 矩 形 內 接 圓 方 式 來 繪 製 圓 和 橢 圓 形, 而 傳 統 的 VB6 是 直 接 設 定 圓 心 半 徑 及 長 短 軸 長 來 繪 製 圖 形 1. 請 將 繪 製 直 線 修 改 為 左 右 對 稱, 並 由 上 而 下 繪 製, 線 條 顏 色 設 定 為 紅 色 2. 請 將 繪 製 橢 圓 形 修 改 為 圓 形, 並 由 外 向 內 繪 製, 線 條 顏 色 設 定 為 綠 色 7-3 學 習 變 數 存 在 範 圍 變 數 在 程 式 中 是 有 一 定 存 取 的 範 圍, 變 數 通 常 是 在 主 程 式 副 程 式 或 函 式 來 定 義 宣 告 和 使 用, 因 此 變 數 範 圍 可 分 為 全 域 性 變 數 和 區 域 性 變 數 全 域 性 變 數 ( Public): 在 整 個 程 式 中 都 能 使 用 的 變 數 即 是 全 域 性 變 數 例 如 在 模 組 的 一 般 宣 告 區 宣 告 的 變 數, 在 整 個 專 案 中 無 論 是 那 一 個 表 單 函 式 及 副 程 式 都 能 讀 取 和 設 定 全 域 性 變 數 可 再 細 分 二 類, 其 中 一 類 為 專 案 性 全 域 性 變 數, 另 一 類 為 表 單 性 全 域 性 變 數 專 案 性 全 域 性 變 數 可 在 不 同 的 表 單 間 的 各 個 程 序 副 程 式 和 函 式 間 使 用 表 單 性 全 域 性 變 數, 則 限 定 同 一 個 表 單 中 各 個 程 序 副 程 式 和 函 式 間 使 用 區 域 性 變 數 (Private): 只 在 表 單 函 式 及 副 程 式 中 被 使 用 的 變 數 即 是 區 域 性 變 數, 如 果 變 數 以 Dim 宣 告 即 是 例 如 控 制 項 或 副 程 式 宣 告 的 變 數, 只 能 在 這 個 控 制 項 或 是 副 程 式 中 進 行 運 算 工 作, 並 無 法 在 其 他 7-20
07 控 制 項 或 副 程 式 中 來 使 用 所 以 不 同 控 制 項 或 副 程 式 都 可 定 義 相 同 名 稱 的 變 數, 彼 此 間 並 不 會 互 相 影 響 但 是 區 域 性 變 數 名 稱 不 可 和 全 域 性 變 數 相 同, 否 則 會 只 讀 取 區 域 性 變 數, 並 不 會 讀 取 全 域 性 變 數 值 靜 態 變 數 (Static): 只 能 用 於 副 程 式 內, 用 Static 所 宣 告 的 變 數 的 變 數 值, 會 保 留 至 下 次 副 程 式 被 呼 叫 來 使 用, 並 不 會 每 次 呼 叫 都 將 變 數 重 新 歸 零, 一 般 副 程 式 內 所 宣 告 的 變 數 會 隨 著 副 程 式 結 束, 記 憶 體 位 置 即 歸 還 作 業 系 統 7-3-1 應 用 實 例 ( 六 ): 變 數 的 範 圍 和 表 單 相 同 變 數 不 會 改 變 全 域 變 數 會 改 變 7-21
GroupBox 控 制 項 Label 控 制 項 TextBox 控 制 項 1 Module publicvar 2 Public varmodule As Integer = 1 ' 定 義 模 組 變 數 3 End Module 4 5 Dim varform As Integer = 1 ' 定 義 表 單 變 數 6 7 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 8 Dim varloc As Integer = 1 9 varform = varform + 1 10 varloc = varloc + 1 11 varmodule = varmodule + 1 12 TextBox1.Text = varform.tostring 13 TextBox2.Text = varloc.tostring 14 TextBox3.Text = varmodule.tostring 15 End Sub 16 17 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 18 Static varloc As Integer = 1 ' 定 義 一 個 靜 態 變 數 19 varform = varform - 1 20 varloc = varloc - 1 7-22
07 21 varmodule = varmodule 1 22 TextBox1.Text = varform.tostring 23 TextBox2.Text = varloc.tostring 24 TextBox3.Text = varmodule.tostring 25 End Sub 26 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 27 Dim varform As Integer = 1 ' 定 義 一 個 和 表 單 變 數 相 同 變 數 28 varform = varform + 100 29 varmodule = varmodule + 100 30 TextBox1.Text = varform.tostring 31 TextBox3.Text = varmodule.tostring 32 TextBox2.Clear() ' 將 用 不 到 TextBox 清 除 33 End Sub 34 35 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click 36 End 37 End Sub 在 這 個 程 式 我 們 使 用 到 GroupBox 控 制 項, 放 置 同 一 群 組 控 制 項 第 1 行 到 第 3 行 模 組 程 式 碼 要 置 放 在 方 案 總 管 內, 主 要 功 用 是 定 義 一 個 專 案 性 全 域 變 數, 這 個 變 數 是 可 在 不 同 表 單 中 共 同 使 用, 但 本 例 只 有 一 個 表 單 第 5 行 為 定 一 個 表 單 性 全 域 變 數, 這 個 要 定 義 在 表 單 宣 告 區 內, 這 個 變 數 只 可 在 單 一 表 單 內 使 用, 只 要 在 這 個 表 單 中 的 各 個 物 件 都 可 使 用 第 7 行 到 第 15 行 將 會 對 所 有 的 變 數 做 累 加 動 作, 但 是 其 只 會 改 變 全 域 性 變 數, 區 域 性 變 數 varloc 每 按 一 次 即 會 重 新 宣 告 一 次 並 無 法 累 加, 因 此 只 會 出 現 固 定 值 7-23
第 17 行 到 第 25 行 將 會 對 所 有 的 變 數 做 累 減 動 作, 但 是 會 改 變 所 有 變 數 值, 其 中 區 域 性 變 數 varloc 宣 告 為 Static, 它 會 記 錄 值, 並 不 會 不 斷 重 新 宣 告 而 無 法 記 錄 值 第 26 行 到 第 33 行 定 義 一 個 和 表 單 變 數 相 同 變 數 varform, 如 果 在 區 域 內 定 義 使 用 這 個 變 數, 將 不 會 改 變 到 表 單 變 數 varform, 而 只 會 改 變 區 域 變 數 varform, 因 此 在 變 數 定 義 時, 在 使 用 上 特 別 留 意 其 存 在 範 圍, 如 果 區 域 變 數 和 全 域 變 數 相 同 時, 將 無 法 取 得 全 域 性 變 數 值 7-4 學 習 變 數 傳 遞 方 式 (Call By Value) 傳 值 呼 叫 主 要 是 將 變 數 內 容, 傳 遞 到 副 程 式, 主 程 式 和 副 程 式 各 自 使 用 自 己 的 記 憶 體 位 置, 所 以 在 副 程 式 任 何 變 化, 都 不 會 影 響 到 主 程 式 中 相 對 變 數 內 容 在 傳 值 呼 叫 中, 主 程 式 要 傳 遞 參 數 可 以 是 變 數 常 數 或 是 運 算 式, 如 果 副 程 式 參 數 是 以 傳 址 (ByRef) 宣 告, 呼 叫 程 式 碼 可 以 在 呼 叫 中 將 變 數 名 稱 以 () 括 起 來, 以 強 制 該 機 制 為 傳 值 (ByVal) 呼 叫, 在 實 例 應 用 繪 製 橢 圓 形 中 即 是 使 用 傳 值 呼 叫 (Call By Address) 傳 址 呼 叫 主 要 是 將 變 數 記 憶 體 位 置, 傳 遞 到 副 程 式, 使 主 程 式 和 副 程 式 使 用 共 同 記 憶 體 位 置, 所 以 變 數 如 果 在 副 程 式 產 生 變 化, 都 會 直 接 改 變 到 主 程 式 中 相 對 變 數 內 容 在 傳 址 呼 叫 不 可 使 用 常 數 為 傳 遞 參 數 (Call By Address), 在 VB6.0 版 中, 副 程 式 參 數 列 中 的 參 數 若 未 特 別 宣 7-24
07 告, 則 其 預 設 為 傳 址 呼 叫, 而 在 VB 2008 中, 則 預 設 為 傳 值 呼 叫 (Call By Value) 7-4-1 應 用 實 例 ( 七 ): 傳 值 呼 叫 7-25
1 Sub AddVal(ByVal InVarX As Integer, ByVal InVarY As Integer) 2 InVarX = InVarX + 2000 3 InVarY = InVarY + InVarX + 1956 4 5 TextBox1.Text = TextBox1.Text & " 副 程 式 變 數 值 " + vbnewline 6 TextBox1.Text = TextBox1.Text & "InVarX=" & InVarX.ToString & vbnewline 7 TextBox1.Text = TextBox1.Text & "InVarY=" & InVarY.ToString & vbnewline 8 End Sub 9 10 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 11 Dim VarX, VarY As Integer 12 VarX = 100 13 VarY = 210 14 TextBox1.Clear() 15 TextBox1.Text = TextBox1.Text & " 主 程 式 呼 叫 前 變 數 值 " + vbnewline 16 TextBox1.Text = TextBox1.Text & "VarX=" & VarX.ToString & vbnewline 17 TextBox1.Text = TextBox1.Text & "VarY=" & VarY.ToString & vbnewline 18 TextBox1.Text = TextBox1.Text & vbnewline 19 20 Call AddVal(VarX, VarY) 21 22 TextBox1.Text = TextBox1.Text & vbnewline 23 TextBox1.Text = TextBox1.Text & " 主 程 式 呼 叫 後 變 數 值 " & vbnewline 24 TextBox1.Text = TextBox1.Text & "VarX=" & VarX.ToString & vbnewline 25 TextBox1.Text = TextBox1.Text & "VarY=" & VarY.ToString & vbnewline 7-26
07 26 End Sub 27 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 28 End 29 End Sub 第 1 行 到 第 8 行 為 副 程 式, 接 收 主 程 式 傳 遞 過 來 的 值, 並 進 行 加 總 並 輸 出 到 TextBox 第 14 行 到 第 18 行 主 要 是 在 呼 叫 副 程 式 前, 將 變 數 內 容 顯 示 出 來 第 20 行 呼 叫 副 程 式 並 傳 遞 值 過 去 第 22 行 到 第 25 行 主 要 是 在 呼 叫 副 程 式 後, 將 變 數 內 容 顯 示 出 來, 前 後 二 者 相 互 比 較 並 無 改 變 7-4-2 應 用 實 例 ( 八 ): 傳 址 呼 叫 7-27
07 7-6 1. ( ) 執 行 下 列 程 式 片 段 後,K 值 為 何? (A) 1 (B) 5 (C) 15 (D) 120 Private Sub Form_Activate( ) REM MAIN PROGRAM K=GAME(5) Console.WriteLine (K) End Sub FUNCTION GAME(X) If(X>1) THEN GAME=X *GAME(X-1) ELSE GAME=1 END If END FUNCTION 2. ( ) Private Sub FORM_ACTIVATE() Dim X as Integer = 5 Dim A as Double = FS(X) A=FS(X) Console.WriteLine (A+X) End Sub Function FS(X) FS = X For J = X To 3 Step 1 FS = FS * J Next J End Function (A) 65 (B) 105 (C) 125 (D) 305 7-41
3. ( ) 以 下 是 對 有 n 個 元 素 的 陣 列 a ( 註 標 範 圍 :1 ~ n), 執 行 氣 泡 式 排 序 的 Visual Basic 程 式 片 段 第 二 行 空 格 處 應 填 入 何 式 才 正 確? (A) n pass (B)n pass + 1 (C) n pass 1 (D)n pass 2 For pass = 1 To n 1 For j = 1 To If a ( j ) > a ( j + 1) Then temp = a ( j ) : a ( j ) = a ( j + 1) : a ( j + 1) = temp End If Next j Next pass 4. ( ) 下 列 Visual Basic 程 式 執 行 後, 所 輸 出 的 資 料 為 何? (A) 2 (B) 1 (C) 0 (D) 1 Private Sub Heart ( m As Integer ) m = m ^ ( m + 2 ) End Sub Private Sub Form_Activate ( ) Dim C As Integer C = 1 Call Heart (C ) Console.WriteLine (C) End Sub 1. 使 用 副 程 式 來 設 計 程 式 有 那 四 項 優 點 2. 將 字 串 中 小 寫 的 字 母, 轉 換 成 大 寫 字 母 函 數 3. 判 別 是 否 為 數 字 性 資 料 函 數 7-42
07 4. 圓 週 率 的 數 學 函 數 5. 三 角 函 數 正 弦 函 數 餘 弦 函 數 1. 寫 一 函 式 計 算 銀 行 借 款 的 複 利 之 本 利 和, 分 別 傳 入 本 金 年 利 率 及 期 數 複 利 之 本 利 和 公 式 = 本 金 *(1 + 年 利 率 )^ 期 數 7-43