公告事項

  1. 底下範例檔名有些是Big碼中文名稱,如果無法下載,請請試試看改變瀏灠器的設定。在「工具→網際網路選項→進階」底下有「永遠將 URL 傳送成 UTF-8」前的勾勾取消,並重新啟動瀏灠器。(在 IE 7 是「傳送 UTF-8 URL」
  2. 底下內容越來越多,請多利用 Ctrl+F 來搜尋關鍵字。
  3. 新增項目:9/17計時器、 10/2內建函數

程式通識

請務必詳讀

  1. 程式的語法及一些基本的架構(循序、選擇、重覆)務必弄清楚用法,避免語法錯誤。
  2. 寫程式應先分析整個問題的大架構,細分為小段後,再從每一小段開始撰寫程式並除錯,然後逐漸架構出完整的內容。重點在於:程式指令的先後順序一定不能搞錯
  3. 寫程式時,記得要縮排,除了美觀外,也可以幫助除錯。(按 Tab 是比較快的縮排方式)
  4. 注意程式語法的配對,如寫 Do 時,最好先在下一行打上 Loop,然後在中間插行空白行後再繼續寫迴圈內的程式敘述。(其它如 If End If,For Next 亦同)
  5. 在思考程式流程時,若要記錄、計算或暫存一項會變動的資料時,就是新增一個變數的時機了。
  6. 請注意全域變數區域變數的區別,最好也了解一下靜態變數的用法。
  7. 在視窗程式設計中,要特別注意輸入資料的檢查;錯誤的輸入,往往會造成程式的錯誤。
  8. 請特別注意資料型態的差別,尤其是字串與數字的處理方式常會造成程式的錯誤。
  9. 使用數字型態時,要特別注意溢位的問題,也要注意整數及小數有效位數的限制。
  10. 如果輸入的資料必須是特定項目,則可以使用 CheckBox、OptionButton、List、Combo 等控制項,以點選的方式來輸入資料,可以避免輸入的錯誤。
  11. 撰寫程式往往需要較長時間的思考與測試,更應隨手記下心得或程式碼,不然容易忘記,所以請準備【筆記本】。

程式流程

程式的基礎三步驟 輸入→處理→輸出(變成新的輸入, Repeat)

輸入資料

  1. 使用 InputBox 函數,或文字方塊、下接選單…等各種控制項來輸入資料。
  2. 讀取檔案內容當成輸入資料。
  3. 以處理過的資料(輸出結果)當成新的輸入資料。

處理過程

  1. 簡單的四則運算,條件判斷…
  2. 複雜的演算過程,如搜尋、排序、串列…

輸出結果

  1. 使用Print、MsgBox、標籤、文字方塊…等各種控制項來顯示結果。
  2. 把資料寫入檔案。(輸出至檔案)
  3. 有時侯輸出的結果是為了當成另一個輸入資料,以進行另一次處理。

學習目標 - 避免被當?

  1. 學會不同控制項的使用方法(屬性、方法、事件),不同控制項有不同的特色,得學會如何妥善運用,以成為輸入、輸出工具。
  2. 學會循序、選擇、重覆結構的各種語法、用法;所有程式,所有處理過程,就是這三種結構不斷的排列組合罷了。
    • 了解資料型態的意義
    • If ... Then 、 Select Case 等條件判斷
    • For Next 、 While 、 Do Loop 迴圈
    • 陣列的使用 - 大量資料的處理
    • 副程式及函數的使用:使用內建函數或自訂函數來簡化程式。
  3. 學習更深入的演算法,如搜尋、排序、DFS、Binary Tree…

控制項

如何輸入資料(或顯示結果)?數字、文字、日期?該注意的事項有哪些?其重要的屬性方法有哪些?如何檢查輸入的資料是否正確?

使用InputBox輸入姓名、身高、生日。

  1. 考慮身高:當輸入 175 、 -1 、 320 、 a3c …時,該如何處理?
  2. 如何將姓及名區分開?如輸入「陳建文」時,尊稱為「陳帥哥」
  3. 生日用「日期型態Date」、「數字型態」或「文字型態String」哪一種來處理較適當?

使用文字方塊TextBox來輸入資料,輸入姓名、身高、生日…比照InputBox的要求。

  1. 如何隱藏輸入文字?(如輸入密碼) - 請將身高隱藏 PasswordChar
  2. 如何輸入多行文字外加捲軸?MultiLineScrollBars
  3. 如何限制輸入長度?(如學號最多六碼) MaxLength
  4. 如何限制只能輸入數字? 利用 KeyPress 或 KeyDown 事件
  5. 如何限制只能輸入數字,且數字不重覆?如 3827 (玩 1A2B 猜數字遊戲時的數字)

使用選擇鈕OptionButton來輸入性別、科系

  1. 如何分組? 框架Frame
  2. 如何設定預設值?在該選項的屬性視窗中設定 Value 屬性為 True(因為單選,所以只能設定其中一項)
  3. 如何檢查選擇的項目?
  4. 如何使用控制項陣列來簡化?
  5. 如何利用程式碼來選擇選項?(在程式執行時,程式自動選擇)

使用核取方塊CheckBox來勾選使用語言

  1. 如何設預設值?在屬性視窗中設定Value屬性,0 表示未勾選,1 表示已勾選
  2. 如何取得核取(勾選)結果?直接判斷Value屬性是0 或 1
  3. 如何利用程式碼來勾選?Check1.Value = 1(假設其名稱為 Check1)

使用清單ListBox或下拉式清單ComboBox來輸入(1)生日 (2)科系 (3)使用語言(複選)

  1. 如何預先填入資料到清單中?使用List屬性
  2. 如何利用程式碼將資料加到清單中?AddItem方法
  3. 如何判斷點選了清單中的那一項?ListIndex屬性及List屬性陣列或Text屬性。
  4. 如何設定及判斷多重選擇?MultiSelect屬性、Selected屬性陣列
  5. 分清楚ListCountListIndexList()Selected
  6. 使用Click事件或Change事件即時偵測點選的項目。

使用水平捲軸HScroll或垂直VScroll來(1)選擇身高 (2)以三個捲軸來設定視窗背景顏色?

  1. 屬性值?MinMaxSmallChangeLargeChangeValue的用途?
  2. 如何利用Change事件,來自動改變顏色。

使用計時器Timer讓 VB 每隔特定時間執行一段程式。

  1. 屬性值?EnabledInterval
  2. 唯一的事件-Timer事件

如何利用滑鼠拖曳控制項

  1. DragIcon 屬性可以設定拖曳時的圖案,但必須是 .ico 的圖示檔。
  2. 滑鼠拖曳(Drag)的模式有兩種,手動 - DragMode 屬性值為 0 、自動 - DragMode 屬性值 1
  3. 使用自動模式較簡單,但該控制項的 Click、MouseDown、MouseUp 等滑鼠事件會失效。
  4. 手動拖曳拖式需配合 MouseDown 或 MouseUp 等事件,並以 Drag 方法來啟動拖曳,使用上多了一些步驟,但也多了彈性,如用限制只有右鍵能拖曳…
  5. 了解兩事件的驅動情形:DragDrop - 拖曳放開後,接收的物件會驅動此事件、DragOver - 拖曳經過其它控制項時,該控制項會驅動此事件。
  6. 範例:壓縮檔

迴圈範例

累加 - 等差級數的累加

  • 計算 1+2+3+...+30
  • 計算 3+6+9+...+30
  • 計算 10+8+6+...+0-2-4-...-10
  • 計算 1+1/2+1/3+...+1/10
  • 計算 1/2+2/3+3/4+...+29/30
  • 計算 1*2*3*...*7

內建及自訂函數

內建函數

  • 內建函數指的是 VB 事先設計好的各種函數,藉由這些函數可以幫助我們快速處理日期、數字、文字…
  • 數字函數:用來計算數值
  • 數值函數
    函數名稱功能說明範例範例結果
    SQR(N) 傳回N的根號 SQR(4) 2
    ABS(N) 傳回N的絕對值 ABS(-2) 2
    Int(N) 傳回等於或小於N的整數 Int(2.4)
    Int(-2.4)
    2
    -3
    Fix(N) 傳回N的整數部份,小數直接捨去 Fix(2.4)
    Fix(-2.4)
    2
    -2
    Round(N,P) 將N取四捨五入到小數後第P位後傳回結果 Round(5/3,2) 2.67
    Rnd(N) 傳回1個>=0且<1隨機亂數 Int(Rnd*10)+5 傳回5~14中任一整數
    Randomize 設定亂數種子,與Rnd配合使用    
    Sin(N)
    Cos(N)
    Tan(N)
    傳回N的正弦值…等,N的單位是弳度,不是角度
    範列中的PI=3.14159265358979
    Sin(PI/6) 0.5
  • 字串函數:用來處理文字,在VB中用敘極廣,請特別留意;底下有些函數有更進一步的用法,請參考MSDN的說明。
  • 字串函數
    函數名稱功能說明範例範例結果
    Chr(N) 傳回ASCII碼為N的字元 Chr(65) "A"
    Asc(S) 傳回字串S第1個字元的ASCII碼 ASCII("A") 65
    Val(S) 將S字串轉成數值 Val("123")
    Val("52A")
    Val("xxx")
    123
    52
    0
    Str(N) 將數字N轉換成字串型態
    注意:正數前會有一個空白
    Str(23)
    Val(-43)
    " 23"
    "-43"
    Len(S) 取得字串S的長度(字元數) Len("ABCDE") 5
    Left(S,N) 取得字串S左邊的N的字元 Left("ABCDE",2) "AB"
    Right(S,N) 取得字串S右邊的N的字元 Right("ABCDE",2) "DE"
    Mid(S,M,N) 從字串S第M個字元開始取得N個字元 Mid("ABCDE",2,3) "BCD"
    UCase(S) 將字串S的所有英文小寫字母轉成大寫字母 UCase("AbcDe") "ABCDE"
    LCase(S) 將字串S的所有英文大寫字母轉成小寫字母 LCase("AbcDe") "abcde"
    Trim(S)
    LTrim(S)
    RTrim(S)
    去除字串S兩側的空白字元(左側、右側) Trim("  A B  ") "A B"
    String(N,S) 傳回N個S字元,S可以是字元,也可以是ASCII碼 String(4,"A")
    String(4,66)
    "AAAA"
    "BBBB"
    StrReverse(S) 將字串反過來 StrReverse("ABCDE") "EDCBA"
    InStr(S,F) 從字串S中尋找F字串,若找到則傳回S字串中F出現的位置,若找不到則傳回0 InStr("ABCDABCD","D")
    InStr("ABCDEF","CC")
    4
    0
    InStr(m,S,F) 與上例相同,但指定從字串S的第m個字元開始尋找,而不是從頭找 InStr(6,"ABCDABCD","D") 8
    0
    Replace(S,F,R) 從字串S中尋找字串F,並以字串R取代。 Replace("ABCDE","BCD","xxx") "AxxxE"
    函數名稱功能說明範例範例結果
    Format(S,F) 將字串S依據指定的格式F重新產生字串
    左側例子中
    Time是時間函數,傳回目前的時間
    Date是日期函數,傳回目前的日期
    D=#1/27/1993#
    T=#5:04:23 PM#
    Format(Time, "Long Time")
    Format(Time, "Long Date")
    Format(T, "h:m:s")
    Format(T, "hh:mm:ss AMPM")
    Format(D, "dddd, mmmm d yyyy")
    Format(5365.6, "##,##0.00")
    Format(534.9, "###0.00")
    Format(2.5, "0.00%")
    Format("HELLO", "<")
    Format("hello", ">")
    下午 03:09:46
    1899年12月30日
    17:4:23
    05:04:23 下午
    Wednesday, January 27 1993
    5,365.60
    534.90
    250.00%
    hello
    HELLO
  • 日期時間函數:用來處理日期與時間,也是常用的函數。
  • 日期時間函數
    函數名稱功能說明範例範例結果
    Now 傳回目前的日期及時間,不用加任何參數
    (Now 等於 Date 加上 Time ?)
    Now 2007/10/12 上午 09:24:44
    Date 傳回目前的日期,不用加任何參數 Date 2007/10/12
    Time 傳回目前的時間,不用加任何參數 Now 上午 09:24:44
    Year(D) 依指定的時間參數(D),傳回年 Year(Now) 2007
    Month(D) 依指定的時間參數(D),傳回月份 Day(Now) 10
    MonthName(M) 依指定的月份數字參數(M),傳回月份的名稱 MonthName(1) 一月
    Day(D) 依指定的時間參數(D),傳回1~31的日期 Day(Now) 12
    Hour(T) 依指定的時間參數(Time),傳回小時 Hour(Now) 9
    Minute(T) 依指定的時間參數(Time),傳回分鐘 Month(Now) 24
    Second(T) 依指定的時間參數(Date),傳回秒數 Second(Now) 44

數值函數的應用

  • 數值函數的應用比較單純,需注意的事項如下:
  • 使用亂數函數Rnd() 取亂數時,若要求取得整數,則常和Int()函數配合,公式:V = Int(Rnd*數量)+起始值。如 10 ~ 20 共有 11 個數字,且從 10 開始算起,所以亂數取法為V = Int(Rnd*11)+10
  • 取亂數時,通常也會和Randomize一起使用,但是 Randomize 通常只需執行一次,因此放在Form_Load()程序中是最適合的。
  • 使用Round()函數可以四捨五入,但是VB的四捨五入和一般數學習慣的四捨五入不一樣,完整而言應該是「四捨六入五成雙」因此Round(4.5, 0)會得到 4 ,而Round(5.5, 0)的結果是 6。
  • 如何以一般數學習慣的方式來四捨五入?若變數A是欲處理的數字,則Int(A*10+0.5)/10,可以將數字A四捨五入到小數後第1位,若想取到小數後第2位,則將10變成100,以此類推。至於為什麼可以這樣做?請同學用三個數字來推一次,並比較其精髓,3.6、6.3及4.5。
  • 三角函數Sin()Cos()也是常用的函數,尤其在處理圓形相關的事項時,如讓球做「圓周運動」、畫正 N 邊形畫時鐘、或類似環繞文字的特效都會用到。因此也需要多加留意。

字串函數的應用

  • 字串函數的應用非常的廣,很多程式技巧也必需藉由字串的方式來處理,因此幾乎上述所有函數都要很熟,寫程式才不會產生障礙。
  • 在做進制轉換時,因為A~F與10~16需要互轉,因此藉由ASC()函數與Chr()函數,可以快速轉換。
  • 在字串處理時,常需要逐字處理,此時利用For迴圈配合Mid()函數最為方便,若以反向逐字處理,可先利用StrReverse()函數,反轉字串再處理。
  • 其餘族繁不及備載…請參閱各程式實際演算應用。

陣列使用

一維陣列的宣告

  • Example 1: Dim A(10) As Integer
  • 陣列 A
    索引值→012345678910
    儲存值→3446728951669976816990
  • Example 2: Dim B(3 to 6) As Integer
  • 陣列 B
    索引值→3456
    儲存值→34467289
  • 和宣告一般變數一樣,使用Dim宣告陣列,並利用As 資料型態來指定陣列的型態,如Integer、String等。
  • 何謂陣列索引?又稱註標(SubScript),陣列可以存取多筆資料,所以需以索引值來指定要取得陣列中的哪一筆資料。以上例中:「A(5) = 60」敘述會將該格由66變成60;而「C = A(3)+A(7)」敘述則會將 89 + 76 的值指定給變數 C。
  • Option Base的作用及使用方法為何?Option Base 0表示陣列索引由0開始,而Option Base 1表陣列索引由1開始。若未指定,則預設值是0
  • 若 Option Base 0,則Exampe 1中的A陣列共有 0 ~ 10 共11格;若 Option Base 1,則A陣列有 1~10 共10格。
  • Example 2的方式直接指定索引值由 3 到 6 ,所以只有 4 格。

二(多)維陣列的宣告

  • Example 1: Dim A(2,10) As Integer
  • 陣列 A
    欄→
    ↓列
    012345678910
    03446728951669976816990
    14672895166997681699034
    27289516699768169903446
  • Example 2: Dim A(1 To 3, 5 To 8) As Integer
  • 陣列 B
    欄→
    ↓列
    5678
    134467289
    289367452
    394429239
  • 二維陣列需指定列及欄數並使用「逗號,」隔開,其餘與一維陣列相同。而三維、多維則類推。
  • 存取二維陣列時需指定列索引及欄索引,如「C = A(2,5)+A(0,1)」敘述會將 76 + 46 的結果指定給變數 C。

陣列相關函數

  • LBound()函數:取得陣列的索引值下標(最小的索引)。
  • UBound()函數:取得陣列的索引值上標(最大的索引)。
  • 使用 LBound() 及 UBound() 時,若是一維陣列,則用法為「U = UBound(A)」,若是二維陣列則需指定維數,如上例中的二維陣列A,「C = UBound(A,1)」取得第一維的上標 2,而「C = UBound(A,2)」會取得第二維的上標 10。
  • Array()函數:以直接指定數值填入陣列的方式來產生陣列。如「d = Array(4,3,1,2,5)」,使用Array()函數需特別注意:
    (a)變數 d 的型態必須是 Variant 自由型態
    (b)此陣列的索引值由 0 開始(嚴格來說是以 Option Base 的值來決定)。

動態陣列的使用

  • 使用 ReDim 敘述來宣告。Ex:若之前宣告「Dim A() As Integer」則「ReDim A(30) As Integer」敘述會將陣列設為 31 個。
  • 使用動態陣列請注意:若先前用 Dim 宣告,則不可指定陣列個數;且不可改變資料型態。
  • 配合Preserve可保留先前資料,否則重新宣告時,其陣列內容會被清空。用法「ReDim Preserve A(30)」。

洗牌/亂數排座位

  • 將有順序的數字打亂,可以模仿洗牌的動作,亦可應用在亂數選題、亂數排座位等。演算法一如下:
  • 宣告陣列後,先將數字依序填入陣列中。(假設是1 ~ 40)
  • 取出2個亂數當成陣列位置,其範圍是數字個數。(如上例是 1 ~ 40)
  • 將陣列中此兩位置的數字互換
  • 重覆上面兩個步驟數次(依情形而定,如1000次),即可將數字打亂。
  • 除了上述方法外,還有其它方式,優劣不一,請自行研究。

排序

  • 將雜亂無序的數列由大到小、或由小到大排好,稱為排序,常見的排序有選擇排序(Selection Sort)泡泡排序(Bubble Sort)、插入排序(Inserting Sort)、快速排序(Quick Sort)、Conuting Sort…,族繁不及備載。
  • 因為排序的數字(或文字)量多寡不一定,但最常見的方式是利用陣列來排序,所以請先將欲排序的資料先罝入陣列中。
  • 選擇排序(Selection Sort):顧名思義,將所有數中最大的選出來,放在最前面,然後選出第二大的數,放在第二位…以此類推。
  • 選擇排序的演算法:由大到小
    1. 先找最大值,所以由陣列第1個數A(1)開始,將第2個A(2)、第3個(A3)…依序和第1個數比,只要比第1個數大,就互換過來,所有數比完後,最大的數一定在第1個位置A(1)。
    2. 找到最大值後,接下來找第2大的數,因此,將陣列的第2個數A(2)開始,將第3個、第4個…依序比對,就可把最大的數換到前面的A(2) 。
    3. 重覆找第3大、第4大,直到所有數都找完為止,此時所有數字都已經由大到小排好了。
    4. 此流程需要二層迴圈;因為要找第1大、第2大…所以外層迴圈用意在於排好所有數,而內層迴圈用於和前面的數字比對用。
    5. 若要由小到大排序,則只要將較小的數字互換到前面即可。
  • 選擇排序的分析:假設有 5 個數字放在陣列A 的 A(1) 到 A(5) 中。
    1.   變化1   變化2 不變
    2. 固定 A( 1 ) : 比對 A( 2 ) ~ A( 5 ) → 內層迴圈由 2 to 5
    3. 固定 A( 2 ) : 比對 A( 3 ) ~ A( 5 ) → 內層迴圈由 3 to 5
    4. 固定 A( 3 ) : 比對 A( 4 ) ~ A( 5 ) → 內層迴圈由 4 to 5
    5. 固定 A( 4 ) : 比對 A( 5 ) ~ A( 5 ) → 內層迴圈由 5 to 5
    6. 經過前面程序,最後 1 個 A(5) 必然是最小的。
    7. 所以外層迴圈是「變化1」,For I = 1 To 4
    8. 內層迴圈是「變化2」,For J = [變化2] To 5。而變化2和變化1有「加1」的關係。因此For J = I+1 To 5
  • 泡泡排序的演算法:由大到小
    1. 比對相鄰兩個數A(1)及A(2),若前面的數比後面的數小,則將兩數互換;接著比對下兩個數A(2)及A(3),以此類推直到最後,此時最小的數值會被移到最後方。
    2. 仿照步驟1來進行第二輪比對,但是因為最後一個數已經是最小值了,所以最後的數字不用比對。同樣的第二輪結束後,最後第2個數應該就是第二小的數。
    3. 重覆上述步驟就可以依序排完所有數值。
    4. 此流程需要二層迴圈;因為推移最小值、第2小…到後方,所以外層迴圈用意在於排好所有數,而內層迴圈用於相鄰兩數字的比對。
    5. 若要由小到大排序,則只要將較小的數字互換到前面即可。
  • 氣泡排序的分析:假設有 5 個數字放在陣列A 的 A(1) 到 A(5) 中。
    1. 變化1         變化2 變化3
    2. 第 1 輪:比對 A(1)、A(2) ~ A(4)、A(5)→ 內層迴圈由 1 to 4
    3. 第 2 輪:比對 A(1)、A(2) ~ A(3)、A(4)→ 內層迴圈由 1 to 3
    4. 第 3 輪:比對 A(1)、A(2) ~ A(2)、A(3)→ 內層迴圈由 1 to 2
    5. 第 4 輪:比對 A(1)、A(2) → 內層迴圈由 1 to 1
    6. 每一輪的比對都會將較小的數值往後方移動。
    7. 所以外層迴圈是「變化1」,For I = 1 To 4
    8. 內層迴圈是「變化2」,For J = 1 To [變化2]。 而變化2和變化1有「和為5」的關係。因此For J = 1 To N-I

讓多個控制項可以自動排好

  • 想讓多個文字方塊以矩形排好(如4列*6欄),可以使用迴圈自動排列
  • 先設定好文字方塊的格式,並產生24個文字方塊的控制項陣列(編號 0 ~ 23)
  • 若能算出每個文字方塊左上角的座標(left及top),再指定方塊的Left及Top屬性值,即可自動排好,但是:
  • 座標的計算請參考此範例:計算座標
  • 方塊的編號是 0 ~ 23,所以必須計算好其位置,請參考右圖

如何畫畫

可以畫畫的控制項

  • 表單(Form):表單上可以自由繪圖,但因表單上常會放置其他控制項,因此較不適合。
  • 繪圖框(PictureBox):繪圖框也可以載入圖片,也可以自由繪圖。
  • 請注意!繪圖框(PictureBox)與影像框(ImageBox)不同,影像框僅能載入圖片,無法繪圖。

座標系統與單位

  • VB預設的座標系統原點(0,0)在表單內的最左上角位置,往右、往下為正值,往左、往上為負值。和「平面直角座標」相比而言,平面直角座標的角度以「逆時針」為正向,而VB的角度以「順時針」為正向,簡單來說,X軸不變,但Y軸上下顛倒。
  • VB預設的座標單位是 twip。此單位可由ScaleMode屬性更改,如Picture1.ScaleMode = 3可將單位改成像素。ScaleMode的值由1到7分別代表:Twip、點、像素、字元、英吋、公厘、公分,但最常用的還是 twip。
  • 除了上述單位外,藉由Scale()方法可以自訂繪圖單位和座標系統。
  • 如何使用VB預設的座標系統在四個角落和正中間各畫一個正方形(或圓形)?
  • 如何自訂座標系統,使其和「平面直角座標」一樣,並在四個角落和正中間各畫一個正方形(或圓形)?Picture1.Scale (-200,-200)-(200,200)產生左上角為(-200,-200)、右下角為(200,200)的座標系統。

繪圖指令

  • 底下繪圖指令之前必須先指定繪圖控制項,如 Picture1.Print 、 Form1.PSet、若未指定,則預設以表單為繪圖物件(通常是Form1),在使用時請特別注意。
  • 取色:Point (x, y),取得(x, y)座標所在的顏色。
  • 畫點:PSet (x, y), [顏色],在指定的(x, y)座標上畫一點,若省略顏色,則使用ForeColor為預設值。
  • 畫線1:Line (x1, y1)-(x2, y2), [顏色],從起點(x1, y1)到終點(x2, y2)畫一條直線
  • 畫線2:Line (x1, y1)-Step(deltaX, deltaY), [顏色],從起點(x1, y1)起畫一個長deltaX、高deltaY的直線。
  • 畫矩形1:Line (x1, y1)-(x2, y2), [顏色], B,與直線一樣,但加上B參數,則由直線變成矩形
  • 畫矩形2:Line (x1, y1)-Step(deltaX, deltaY), [顏色], B,同直線說明
  • 畫矩形3:Line (x1, y1)-(x2, y2), [顏色], BF,BF參數一樣是畫矩形,但可指定填滿的顏色。
  • 畫矩形4:Line (x1, y1)-Step(deltaX, deltaY), [顏色], BF,同上說明
  • 畫圓形:Circle (x, y), R, [顏色],指定圓心(x, y),半徑 R,即可畫出圓。
  • 畫圓弧或扇形:Circle (x, y), R, [顏色], 起始弳度, 終止弳度,同畫圓,但加上起始和終止弳度後,即可畫出圓弧或扇形,若弳度的值為正,為不畫連心線,就是圓弧,若弳度的值為負,則加畫連心線,變成扇形。
  • 畫隋圓形:Circle (x, y), R, [顏色], 起始弳度, 終止弳度, 縱橫比,同畫圓及扇形,加上縱橫比後,寬、高的比例會依據縱橫比拉寬或變扁而成為隋圓形、或隋圓的弧或扇形。
  • 列印文字:Print "文字",此指令在從目前繪圖的最終點座標開始印出文字,因此可利用PSet指令在指定印文字的位置,進而控制在任意地方Print的能力。
  • 複製並繪製圖片:PaintPicture stdPicture, x1, y1, width1, height1, x2, y2, width2, height2, opcode,可將具有 Picture 屬性的圖形(圖片)畫到目前的繪圖框中,而 x1,y1,width1,height1 等參數是要畫的座標點及大小,而 x2,y2,width2,height2 等參數則是原圖形的座標位置及要複製的大小。
  • 畫出小精靈、和太極圖,程式中若需要繪製特殊圖形,通常需寫成自訂函數(副程式)的方式,會比較有彈性。

檔案存取

檔案存取三步驟-開啟檔案、存取資料、關閉檔案

  • 開啟檔案:OPEN "檔案路徑名稱" FOR 模式 AS #檔案編號
  • 檔案存取:以Line Input #、Input #、Input()函數、Write #、Print #、Get、Put等各種敘述或函數來讀取或寫入檔案。
  • 閉閉檔案:CLOSE #檔案編號

檔案類型

  • 循序檔:資料的讀取與寫入必須從頭開始依序處理,大多是文字檔(txt)形式,因此也可用記事本來編輯檔案內容。
  • 隨機檔:可任意存取特定的資料,但必須指定每一筆資料的欄位和長度,檔案內容以整數表示法(二補數)或文字編碼(ASCII、Unicode等)形態儲存,因此無法用純文字編輯器(記事本…)來修改,必須使用WinHex、UltraEditor…等十六進位編輯器來修改。
  • 二進位檔:任意的二進位資料存取。
  • 為了方便使用,一開始先以「循序檔」為主,練習檔案的操作。

開啟檔案

  • 語法:OPEN "檔案路徑名稱" FOR 模式 AS #檔案編號
  • 檔名的取得:
    1. 直接指定路徑檔名,如絕對路徑"C:\Data\A.txt"或相對路徑"MapData\Map1.txt",使用相對路徑比較有彈性,比較適合程式的安裝與散佈,但要特別注意主程式與資料檔之間的相對位置,否則容易出現「找不到檔案」的錯誤。
    2. 使用Drive、Dir、File等控制項來取得檔名(但不適用於開新檔案)。
    3. 使用通用對話方塊(CommonDialog)中的ShowOpen或ShowSave來取得檔名。
  • 檔案的開啟模式:(底下說明以循序檔為主)
    1. INPUT:將檔案中的資料輸入到程式中,也就是讀取檔案,使用Input模式時,指定的檔案必須存在,否則會產生錯誤。
    2. OUTPUT:將程式中的資料輸出到檔案中,也就是寫入檔案,使用Output模式時,若指定的檔案不存在,則會建立新檔案;若指定的檔案已存在,則原先檔案內的資料會先被清除,再寫入新的資料。
    3. APPEND:與Output模式類似,但若指定的檔案已存在,原先檔案的資料不會被清除,而新的資料會在原資料之後繼續被寫入。
    4. 隨機檔和二進位檔的指定模式與上述稍有不同,可使用 Random 或 Binary 模式,在此暫不說明
  • 檔案編號可以自行指定數字,如#1、#2、#3...,但切記若同時開啟多個檔案時,檔案編號不可重覆;而比較適當的方式是使用FreeFile函數,由VB自動取得可用編號。

寫入檔案

  • Print # 敘述,語法:Print #檔案編號, "abc", 123, Var
  • Print # 的用法和之前在表單(或繪圖框)印出資料的 Print敘述,幾乎一樣,不同的是 Print #,必須指定檔案編號,且其印的對象是「檔案File」,而不是「表單Form」或「繪圖框PictureBox」。
  • Print # 敘述,在檔案編號後,可以加上多個資料(可以是字串、數字、變數或運算式),而如同Print敘述,中間以「逗號,」隔開,和用「分號;」隔開的不太一樣的,請注意其差別。
  • 如果要將排版內容,寫到檔案內,使用 Print # 敘述是很適合的,但是如果寫到檔案內的資料,在爾後需要被讀取時,用 Print # 敘述就不適合,最好改用 Write # 敘述。
  • Write # 敘述,語法:Write #檔案編號, "abc", 123, Var
  • Write # 敘述使用方式與 Print # 敘述一樣,不同的是:使用 Write # 敘述,寫到檔案中時,字串資料會加雙引號,數字則不會,且每個資料中間會以「逗號,」隔開。
  • Write # 敘述寫入檔案時,完整的表達了資料型態(字串或數字),且用逗號明確的區隔不同筆資料,在重視資料存取的情況下是比較適合的,但不適合排版。

讀取檔案

  • 底下的指令以循序檔為主,與隨機檔及二進位檔的存取指令敘述有所不同。
  • Input # 敘述,語法:Input #檔案編號, Var1, Var2, Var3, ...
  • 當資料從檔案內被讀取時,程式中應該有「變數」來儲存或處理該筆資料,因此 Input # 敘述在檔案編號後,應該給定「變數」,用來接收資料,使用多個變數,則會依序讀取多筆資料。
  • Input # 敘述與 Write # 敘述搭配使用非常契合,也是常見的檔案存取用法。
  • Line Input # 敘述,語法:Line Input #檔案編號, Var1, Var2, Var3, ...
  • 與 Input # 敘述不同的是, Line Input # 敘述是以行為單位,不管這一行中是否有逗號分隔…,比較適合與 Print # 敘述搭配使用。
  • Input() 函數,語法:Var1 = Input(字元數, #檔案編號)
  • 請注意 Input() 函數與 Input # 敘述是不同的;Input()函數可指定要讀取的字元數然後將結果指定給變數,使用起來相當有彈性,但也代表程式設計師必須嚴格規範檔案的儲存格式。
  • EOF() 函數,語法:EOF(檔案編號)
  • EOF是End Of File的縮寫,其作用是偵測該檔案的資料是否已經全都讀完了;若檔案為未讀完(Not EOF(...) ),則可繼續讀取;請特別注意,EOF函數的「檔案編號」參數前不用加「#」符號。
  • 檔案內的資料往往不只一筆,且其數量也往往是變動的,因此在讀取檔案時通常配合迴圈敘述而且是條件式迴圈,而不是計次式迴圈,因此常用While迴圈或Do Loop迴圈,而非For迴圈。
  • 因為檔案內容大小是會變動的,因此在While迴圈的條件判斷中, EOF() 函數也是常見的成員,幾乎可以當成公式來看待了。請好好研剛一下程式範例。
  • 循序檔的資料可能很多筆,而且不適合重覆讀取,因此另一個常見的用法是先把檔案內所有資料先讀入到陣列,而不只是變數。

關閉檔案

  • 語法:CLOSE #檔案編號
  • 若未指定檔案編號,則會關閉所有已開啟檔案,所以要僅慎
  • 若未關閉檔案,可能會使得資料未完全寫入磁碟(ps.緩衝區的關係),而造成資料流失,特別是以Output或Append模式開啟的檔案

程式寫作

履歷表

  • [題目]將控制項所有技巧結合,寫一個程式用來填寫履歷表。
  • [注意]存檔時會產生哪些檔案?.vbp.frm.frx
  • [範例]暑假結束前寫完。範例

成績統計1

  • [題目]使用InputBox連續輸入多個成績,並統計各項資訊。
    1. 總分及平均
    2. 最高分及最低分
    3. 及格人數(大於等於60分)、不及格人數(小於60分)、死當人數(小於40分)
    4. 第二高分、第三高分…
  • [注意]考慮底下情形:
    1. 直接限定成績數,如10人。(預先知道人數,可以使用 For 迴圈) - 程式較簡單,但不適用實際處理情形。
    2. 不限定成績數,一直輸入,直到輸入小數點「.」為止(人數不固定,所以使用 While 或 Do 迴圈) - 程式較上面複雜,但較適用實際情形。
    3. 需檢查輸入的資料是否正確:成績為 0 ~ 100 分,超出範圍或輸入非數字時則提示錯誤訊息並重新輸入該成績。
    4. 在不使用陣列的狀況下,要求得第二高分、第三高分…時,程式會越來越複雜。但若將成績儲存在陣列,並配合排序演算法的話,將變得容易多了。
    5. 最大值(或最小值)的判斷:在兩種情況下會得到新的最大值。
      1. 當輸入的數字是第1個數字的時候。「」
      2. 當輸入的數字比目前所記得的最大值還大的時候。
  • [範例]限量版下載、無限版下載

尋找質數

  • [題目]輸入兩個數字,找出在此範圍中的所有質數。要求如下:
    1. 可用InputBox或文字方塊TextBox輸入範圍,但請檢查(或限制)範圍數字必須是正整數。
    2. 請考慮,若輸入的第1個數字小於第2個數字的時候;如輸入<5, 10>和輸入<10, 5>時,範圍是一樣的。
    3. 使用清單ListBox來顯示範圍中的每一個質數,並計算質數的個數。
  • [提示]
    1. 如何判斷質數?假設要判斷的數字是 N
      1. 想法1:以 For 迴圈將 N 分別除以 1 到 N,並計算整除的個數,若個數為 2 ( 1 及本身 ),則此數為質數。
      2. 想法2:改進想法1,僅除以 2 到 N-1,且整除個數為 0。(改善空間:少除2次,影響不大)
      3. 想法3:改進想法2,僅除以 2 到根號 N,且整除個數為 0。(改善空間:很大;為什麼只除到根號 N?)
      4. 想法4:改進想法3,利用 Exit For,出現第一次整除時,就離開迴圈,並判斷迴圈是否完整執行完畢( 2 到 根號N ),若是,則該數是質數。(改善空間:超級大,偶數只除1次就可判斷出不是質數,而其他非質數的除法次數也比想法3少)
      5. 延伸想法 4,如何知道 For 迴圈完整執行完還是中途離開呢?請參考Q&A。
    2. 輸入範圍時,若第1數大於第2數,則需將兩數互換。
  • [範例]下載

模擬擲骰子並猜點數

  • [題目]利用亂數函數模擬擲3顆骰子,並猜大小(3~10小,11~18大)。
  • [注意]考慮不同呈現方式:
    1. 基本要求:使用標籤文字顯示骰子;利用選擇鈕猜大小。
    2. 進階要求:使用圖片顯示骰子;除了猜大小外,另外用選擇鈕增加猜點數的玩法。圖片可自行上網搜尋,或自行製作。
  • [範例]範例下載請先儲存解壓縮後再執行dice1 dice2 dice3

利用計時器讓控制項物件移動

成績處理,陣列版

  • [題目]使用陣列來記錄成績,並查詢或統計相關資訊
  • [注意]請完成底下要求:
    1. 設計一成績處理系統,可以處理每位同學的國英數成績,並計算總分及平均。
    2. 需包含底下每個動作-新增、修改、上/下一個、找出總分最高。
    3. 分數(含國、英、數、平均)不及格者,請以紅色顯示,及格者以黑色顯示。
    4. 可以直接輸入座號(或使用下拉式清單)來查詢其成績。
  • [範例]成績登錄1成績登錄2成績篩選

突破VB的數字長度,1234567890123456789+1的結果是?

  • [題目]背景說明如下:
    1. 在VB中整數的範圍是 -32768 ~ +32767、長整數比較長,-2147483648 ~ 2147483648,有效位數最多10位,就算用倍精準度Double,最多也只有15位數,而且超過的部份還會被捨去,無法算出非常精準的數字。
    2. 基於上述原因,1234567890123456789+1、543210*98765、2^50次方都無法算出精準的數字…只能算出Double的精準度而已。
    3. 既然數字型態有長度(位數)的限制,就改用字串型態,最長有65535的長度(位數),只不過利用字串來整理的話,加減乘除都得自己來,不能用直接運算,所以可以自行開發字串的加、減、乘、除法。
  • [注意]請完成底下要求:
    1. 請完成長數字的加法、減法及乖法,並儘可能完成除法。
    2. 因為進行四則運算的次數的會很多,所以最好寫成自訂函數的型態。
    3. 設計輸入及計算的介面。
  • [範例] 加法減法乘法指數大數運算

利用繪圖指令,完成底下要求(二個程式)

  • [題目](1)畫出時鐘;(2)依據指定的數字N來繪製正N邊形
  • [注意]完成底下要求:
    1. 時鐘的部份請參考範例,並自行改版創作。
    2. 請配合視窗大小來繪製時鐘,當視窗大小改變,時鐘也應該跟著改變。
    3. 數字 N 可用不同的方式輸入,包括文字方塊、InputBox、或下拉式選單等…。
    4. 使用 CommonDialog 來選擇邊框顏色
    5. 進階要求:邊框顏色的選擇改用下題的顏色方格,來選擇顏色。
  • [範例]時鐘畫正 N 邊形

利用繪圖指令畫出顏色方格、顏色圈圈、圍棋棋盤(最好利用滑鼠放棋子)

  • [題目]繪製 R 欄 C 列的格子,(1)利用滑鼠點選格子,可在格子內畫上棋子(或圖形),如象棋暗棋、黑白棋、西洋棋 (2)滑鼠點在格線交叉的附近,則可在交叉點上畫棋子,如圍棋、五子棋
  • [注意]完成底下要求:
    1. 棋盤的彈性要大,可控制位置、大小、背景顏色、格子顏色、格線顏色…
    2. 將(a)不同顏色的圓形 (b)小精靈 (c)某張圖片 (d)其它自訂圖案 當成棋子圖案
    3. 將表單變成全螢幕的執行模式
  • [範例]棋盤方格格子綜合類

改良之前的程式,並加上存檔與讀檔功能

  • [題目]利用檔案讀取資料檔,或將資料存入檔案中。
  • [注意]完成底下要求:
    1. 修改成績處理程式,可以將成績存檔,不用每次啟動程式都要重新輸入。
    2. 修改亂數座位程式,可以先讀入班級資料檔,座位上可顯示姓名、座號…
    3. 修改繪製長條圖程式,從檔案讀入資料,並繪製成長條圖…
    4. 修改畫地圖程式,可以將畫好的地圖存入檔案,並增加載入及修改的功能。
    5. 其他…
  • [範例]

迷宮遊戲

  • [題目]寫一個簡單的迷宮遊戲
  • [注意]○、介面及工具整合
    1. 程式應包含兩個表單,一個當作地圖繪製的工具;另一個則是遊戲操作的表單
    2. 加入「功能表」選單的設計
  • [注意]一、繪製地圖
    1. 輸入橫列(Row)及直欄(Col)數,並繪製方格圖。
    2. 利用滑鼠點選,來繪製如(a)按左鍵繪製牆壁(黑) (b)按右鍵繪製道路(白) (c)按左鍵加按Ctrl放置怪物(紅) (d)按右鍵加按Ctrl放置終點(綠) (e)或其它自訂方式及地圖內容…
    3. 加入存檔及讀取檔案的功能,此檔可作為第二部份迷宮遊戲的地圖資料檔(檔案格式請自訂:如0:道路、1:牆壁、2:起點、3~7:怪物、9代表終點…等)
  • [注意]二、迷宮遊戲
    1. 載入怪物及主角圖檔(利用 ImageBox 和 LoadPicture 方法、參考另一範例,計數器-需先解壓縮)
    2. 讀取地圖資料檔,並畫出地圖、主角及怪物等…
    3. 利用上下左右等方向鍵來控制主角的移動,需考慮移動時圖形的繪製及清除
    4. 考慮幾種移動後的狀況:
      1. 當人物走到怪物四周時,會被怪物吃掉,造成遊戲結束
      2. 當人物走到終點時,會顯示完成地圖,遊戲結束
      3. 可自訂各種寶物,加上各種狀態,如無敵、穿牆、爆破…等(地圖檔的資料及格式也應跟著相對修改)
    5. 加上迷霧效果(Fog),即只顯示主角周圍8格地圖,其餘均隱藏起來,可增加遊戲性
    6. 綜合上述,提供(1)開啟地圖 (2)重新開始 (3)擷取畫面 (4)地圖繪製工具 (5)迷霧開啟 (6)...等各項功能
  • [範例]範例1範例2

自製向量圖

  • [題目]自訂向量圖格式,並能讀取並繪製檔案
  • [注意]完成底下要求:
    1. 向量圖檔的格式說明如下,或請參考底下說明檔案
    2. 自訂縮放比例,讓圖檔能隨意放大或縮小
  • [範例]說明程式、參考圖形檔(按右鍵另存新檔):圖檔1圖檔2圖檔3

繪製漸層圖形

智慧拚盤

橫衝直撞

問與答

儲存檔案

  1. Q:.vbp 檔是什麼?A:專案檔,記錄多表單檔案、模組檔案、引用控制項資訊;一旦遺失,可能讓程式無法正常開啟。
  2. Q:.frm 檔是什麼?A:表單檔,裡面記錄了該表單(視窗)中所有程式碼;不見了?就只能躲在棉被裡哭了。
  3. Q:.frx 檔是什麼?A:二進位檔,如果在表單的屬性視窗中設定了清單的List屬性、多行文字方塊的Text屬性,或預先載入圖片如Image的Picture屬性,則其文字內容或圖片內容都會被存在 frx 檔中,若遺失了,則上述資訊都會不見。
  4. Q:.bas 檔是什麼?A:如果新增了模組來撰寫程式,則其副檔名即為 bas,內容也是程式碼;不見了,也得躲在棉被裡 :~(。

顏色表示法及設定方式

  1. Q:如何使用 vb 內建顏色常數?A:vbGreenvbBlue…。「Form1.BackColor = vbBlue」可將背景設成藍色。
  2. Q:如何使用數字設定?A:(不易使用)紅(255)、綠(65280)、藍(16711680)
  3. Q:如何使用QBColor()設定顏色?A:QBColor函數提供了 0 ~ 15 共16種編號的顏色,如「Form1.BackColor = QBColor(0)」敘述,視窗會變成黑色背景。
  4. Q:如何使用RGB()設定顏色?A:格式:RGB(R, G, B),分別代入紅、綠、藍三色的值(均為 0 ~ 255),來組合成全彩顏色。如「Form1.BackColor = RGB(255,0,0)」敘述,視窗會變成紅色背景。
  5. Q:16進位表示法 - &HBBGGRR& - vb中的設定方法。如 &H00FF00& 表示最亮的綠色。(注意!是BGR各兩位,不是RGB ~ 討厭),而前面加 &H 是十六進位的意思,後面的 & 則代表是長整數的符號。
  6. Q:16進位表示法 - #RRGGBB - 網頁中常見的設定方式。#0000FF表示藍色。

VB的基本觀念與一些特性

  1. 程式的思考時要注意:先後順序(循序結構)不可錯亂!若順序不錯,往往造成不可預期的錯誤。
  2. 另一個初學者該了解的是迴圈:程式中迴圈是不可或缺的,初學者在思考程式邏輯時,一定要強迫自己在思考時要考慮迴圈的應用。
  3. 「重覆」不只執行一次或者「有規律的變化」都是使用迴圈的最佳時機。所以在套用迴圈時,要先找出「規律變化」的部份和「固定不變」的部份。
  4. 在一個表單中,變數大致可區分為三類型,全域變數、區域變數、靜態變數。(這裡所稱的全域變數僅適用於該表單中)
  5. 類型可見度生命週期備註
    全域變數表單中所有副程式(Sub)或函數(Function)程式結束(End)或表單關閉(Unload)須在最上方宣告 Dim
    區域變數只有本身所在的副程式或函數認得該副程式結束就消失(End Sub、Exit Sub)副程式每次執行時,該變數都會被重新初始化。
    靜態變數只有本身所在的副程式或函數認得程式結束或表單關閉須使用 Static 在該副程式中宣告。
  6. 陣列最方便的地方,莫過於可以使用「陣列索引」並利用「迴圈」來操控整個陣列,因此使用陣列時幾乎一定會用到迴圈。

程式碼相關技巧

  1. Q:如何以程式碼來結束程式執行?A:使用「END」敘述。
  2. Q:使用 Print 敘述,如何避免換行?A:→在 Print 敘述最後面加上分號「;」
  3. Q:使用 Print 敘述,如何強制換行?A:→單純使用 Print 敘述,後面不加任何符號。
  4. Q:在多行文字方塊中或MsgBox中,如何換行?A:→加上vbCrLfchr(10) & chr(13)
  5. Q:為什麼使用 vbCrLf 後,文字方塊仍無法顯示多行?A:請檢查MultiLine屬性是否為 True。
  6. Q:如何測試按鍵的ASCII碼(KeyAscii參數)?A:在 KeyPress 事件中使用「MsgBox KeyAscii」敘述,即可查詢按鍵ASCII。
  7. Q:如何檢查字串長度(如身分證字號必為 10 碼)?A:使用Len() 函數。格式:Len(字串變數或常數);傳回值:長度。
  8. Q:如何知道某一個字元是否出現在字串中?A:使用InStr()函數。格式:InStr(字元, 字串);傳回值:找到的位置,若沒找到,則傳回 0
  9. Q:如何將游標(或輸入焦點)放到特定控制項中(如Text1文字方塊)?A:使用SetFocus方法,敘述:Text1.SetFocus
  10. Q:如何選取文字?A:使用SelStart屬性配合SelLength屬性。全選:兩行指令 Text1.SelStart = 0Text1.SelLength = Len(Text1.Text)
  11. Q:如何在程式執行中載入圖片到Image或PictureBox?A:使用LoadPicture()函式;格式:Image1.Picture = LoadPicture(圖檔的路徑檔名)
  12. Q:如何用不同的進制來表示?A:以特殊符號加在數字之前即可,16進制數字前加&H,如 &HA2 相當於 162;8進制數字前加上&,如 &12 相當於 10
  13. Q:如何將10進制的數字轉成16進制或8進制?A:使用Hex()函數轉成16進制,使用Oct()函數轉成8進制。(注意!此函數傳回的結果都是字串型態)
  14. Q:那怎麼沒有2進制呢?A:vb內建函數中並無2進制相關函數,請自行撰寫程式轉換。
  15. Q:如何以亂數(RND函數)取某一範圍的整數?A:公式:V = Int(Rnd*數量)+起始值。如 10 ~ 20 共有 11 個數字,且從 10 開始算起,所以亂數取法為V = Int(Rnd*11)+10
  16. Q:為什麼每次執行時,取得的亂數值好像都一樣?A:vb以亂數表來取亂數,而程式每次執行時都會從亂數表中同一個地方取亂數,所以會一樣,因此一般而言若使用RND函數時,最好在Form_Load事件中加入Randomize Timer敘述,可以指定不同亂數種子,就可從亂數表中不同的地方取亂數。
  17. Q:如何將兩數互換?A:執行「A = B」,「B = A」可以互換嗎?No!!!!,「A=B」則 A原來的數值就不見了變成B,所以後面的「B=A」只是將B原來的值再指定回來,B並不會變成原來的 A。互換的程序如下:「T = A」(先記住A),「A = B」,「B = T」(將B指定為原來的A)
  18. Q:如何判斷迴圈是否完整執行完畢(或中途結束)?A:假設 For 迴圈由 I = 1 To N,共執行 N 次,而且在迴圈中某個條件成立後,會利用 Exit For 敘述中途跳出,那麼:
    1. 想法1:利用迴圈變數 I,若迴圈完整執行完畢,則 I 的值應該會大於N,可藉由 I > N 的條件來確定迴圈未中途跳出。
    2. 想法2(開關原理):利用Boolean變數,在迴圈執行前設定一布林變數,設定其值為 False ,而迴圈中在執行 Exit For 中途跳出之前,先設定其值為 True;因此若未中途跳出,則此布林變數會維持為 False,因此藉由判斷此布林值可以確定迴圈是否中途離開。
  19. Q:DoEvents是什麼?A:多次數的迴圈執行時(如10000萬次),執行時間會較長,且會佔用CPU全部的時間,此時CPU無法處理其它工作(如更新標籤內的文字內容),必須等迴圈執行完畢;但在迴圈中加上DoEvents則可以在迴圈執行時先釋放CPU,讓CPU有空去做其它的工作。

操作界面

  1. Q:如何設定使用Tab鍵來移動輸入焦點(Focus)?A:在屬性視窗中針對所有控制項設定TapStop屬性(可否聚焦)及TabIndex屬性(Tab的順序)。
  2. Q:如何讓視窗以全螢幕的方式來執行?A:可設定表單的兩個屬性來模擬:BorderStyle設為 0 (沒框線)及WindowState設為 2 (最大化)。不過使用此方式會變成無法按×鈕來關閉視窗,所以請提供結束程式的按鈕(或其它)。
  3. Q:如何在屬性視窗中刪除已載入的圖片檔?A:選取其Picture屬性,按<del>鍵倒退鍵←刪除。

常見錯誤

  1. 當使用 InputBox 或 TextBox(文字方塊)所輸入的資料,都是字串型態,如果你要的是數字的話,記得要檢查或先進行轉換(最好不要讓VB自行轉換,往往會不符需求)。
  2. 請特別注意不要打錯字,如 Print 常打成 Primt,在VB中 Primt 不是敘述指令或保留字,因此會被當成一個變數,因此容易造成程式執行不如預期的錯誤,在 VB6 的編輯模式中,有一些機制可以避免打錯字:
    • 直接打小寫字母時,若該單字是保留字,則會自動將其首字變成大寫,像For、If…等
    • 配合「Option Explit」敘述,則變數必須先宣告才可以使用,可避免變數名稱打錯。
    • 大部份控制項的預設名稱後都會有數字編號,如Label1、Label2,請注意數字 1 不要打成小寫字母 l
  3. 使用計時器時,要注意變數的類型,要適時宣告成全域變數或區域變數。