VB講課筆記09:過程

VB講課筆記09:過程


一、鍵盤與鼠標事件過程
用戶對程序界面的操作都是通過鍵盤和鼠標完成的。 
(一)鍵盤事件

1、KeyPress事件

(1)觸發條件
    用戶按下並且釋放一個會產生ASCII碼的鍵時被觸發。
(2)過程格式

(3)注意事項注
    只有獲得焦點的對象才能夠響應鍵盤事件。

2、KeyDown事件
(1)觸發條件
    用戶按下鍵盤上任意一個鍵時被觸發。
(2)過程格式

3、KeyUp事件
(1)觸發條件  
    用戶釋放鍵盤上任意一個鍵時被觸發。
(2)過程格式

4、如何判斷控制鍵(Shift、Ctrl、Alt)按下狀態

有三個重要的符號常量:vbShiftMask - 1(001)、vbCtrlMask - 2(010)、vbAltMask - 4(100)

(1)Shift = 1(001):只按下Shift鍵

(2)Shift = 2(010):只按下Ctrl鍵

(3)Shift = 4(100):只按下Alt鍵

(4)Shift = 3 = 1 + 2(011):按下Shift鍵與Ctrl鍵

(5)Shift = 5 = 1 + 4(101):按下Shift鍵與Alt鍵

(6)Shift = 7 = 1 + 2+ 4(111):按下Shift鍵、Ctrl鍵與Alt鍵

案例:利用窗體KeyDown事件,按下組合鍵Ctrl+A時,彈出消息框,內容「全部選定!」



運行程序,按下Ctrl+A組合鍵:


(二)鼠標事件


1、MouseDown事件

(1)觸發條件

    按下任意鼠標按鈕時發生。

(2)過程格式


2、MouseUp事件

(1)觸發條件

    釋放任意鼠標按鈕時發生。

(2)過程格式


3、MouseMove事件

(1)觸發條件

    每當鼠標指針移動到屏幕新位置時發生。

(2)過程格式


4、如何判斷鼠標按鈕按下狀態

運行程序,單擊【輸出鼠標事件Button參數值】按鈕:

(1)Button = 1(001):只按下鼠標左鍵

(2)Button = 2(010):只按下鼠標右鍵

(3)Button = 4(100):只按下鼠標中鍵

(4)Button = 3 = 1 + 2(011):按下鼠標左鍵和右鍵

(5)Button = 5 = 1 + 4(101):按下鼠標左鍵和中鍵

(6)Button = 7 = 1 + 2+ 4(111):按下鼠標左鍵、中鍵和右鍵

案例:利用鼠標事件信手塗鴉


運行程序,按下鼠標左鍵,在窗體上隨意移動,效果如下:


二、Sub 過程
1、定義Sub 過程
(1)過程格式
[Private | Public] [Static] Sub 過程名 [(參數表)] 
      語句組
        [Exit Sub]
      語句組
End Sub

(2)兩種方法創建Sub過程
方法一、在代碼窗口中直接按規定格式編寫過程框架

方法二、利用VB的過程添加工具生成過程框架,然後編寫過程體。




2、調用Sub過程
(1)直接使用過程名調用Sub過程
    格式:過程名 [參數列表](注意參數列表不用括號括起來)
(2)使用Call語句調用Sub過程
    格式:Call 過程名 [(參數列表)](注意參數列表要用括號括起來)

案例:編寫判斷素數的過程,利用該過程列舉指定範圍內的素數
1、創建工程,更名爲「列舉指定範圍內素數」,添加控件,設置屬性

2、創建Sub過程,名爲IsPrimeNumber,包含兩個參數


3、編寫【列舉】按鈕單擊事件處理代碼



4、編寫【清空】按鈕單擊事件處理代碼


5、運行程序,測試效果


輸入起始數與終止數,單擊【列舉】按鈕:


案例:演示過程遞歸調用
1、創建工程,更名爲「演示過程遞歸調用」
2、創建通用過程fun(x As Integer)

3、編寫【確定】按鈕單擊事件處理代碼
4、運行程序,查看結果

爲什麼先輸出3,再輸出6?過程調用使用棧結構,先進後出。


案例:求解漢諾塔問題

1、創建工程,更名爲「求解漢諾塔問題」,添加控件,設置屬性

2、聲明變量,編寫通用過程與兩個按鈕單擊事件處理代碼


3、運行程序,查看效果


輸入環個數,比如3,單擊【求解】按鈕:


三、Function過程

1、定義Function 過程

(1)過程格式

 [Public|Private][Static] Function 函數名 ([形參表])_ [As 數據類型]

    語句組
  [
函數名 = 表達式]
  [Exit Function] 
    語句組
    [
函數名 = 表達式]

  End Function

注意:VB不像C、Java、VFP的函數,通過return語句來返回函數值,而是通過函數名變量來返回函數值。

這裏演示一下Java裏定義的階乘函數factorial(n):



2、調用Function 過程
調用格式:變量名=Function過程名([參數列表])

案例:判斷素數的函數過程


運行程序,單擊【判斷】按鈕:





案例:用遞推法和遞歸法編寫階乘函數過程



運行程序,測試兩種方法的階乘函數:





選擇題真題演練:


循環初始條件:i=1,循環條件:i< 6,因此循環5次。

No.1 i=1,s=0+1/(1+1)=1/2 (此時可以排除A與B)

因爲要循環5次,所以應該有5項數據相加,於是排除C,選擇D。

四、傳遞參數

1、形參與實參
定義過程時,過程的參數就是形參。
調用過程時,過程的參數就是實參。


2、按地址傳遞參數

按地址傳遞參數是把實參變量的內存地址傳遞給形參變量 。在定義過程時,用ByRef說明的形參,或缺省傳遞方式說明,都是按地址傳遞。 


案例:編寫交換兩個變量值的過程Swap(x, y)

1、創建工程,更名爲「利用地址傳遞交換變量值」,添加按鈕,設置屬性


2、創建交換變量值的通用過程Swap(x, y)與按鈕單擊事件處理代碼



3、運行程序,單擊【交換】按鈕,查看結果


給通用過程Swap的兩個參數前加上ByRef,顯式聲明爲引用傳遞,即地址傳遞方式。


運行程序,單擊【交換】按鈕,你會看到結果完全相同。

選擇題真題演練:


我們將按鈕Command1的單擊事件處理代碼修改一下:





A) fun = n,對函數名賦值,作爲函數的返回值,fun沒有定義類型,就是變體型,可以接收任何類型數據。所以選項A)是錯誤的。
B) 輸入值爲5時,注意fun的參數是按址傳遞,第一個x是5,第一個fun(x)是fun(5),5不能被3整除,因此返回值是5*5=25,但是實參x也跟着形參n一起變成25,第二個fun(x)是fun(25),25不能被3整除,因此返回值是25*25=625,三項相加:5+25+625=655,因此選項B)正確。
C) 輸入值爲6,第一個x是6,第一個fun(x)是fun(6),6能被3整除,因此返回值是6+6=12,但是實參x也跟着形參n一起變成了12,第二個fun(x)是fun(12),12能被3整除,因此返回值是12+12=24,三項相加:6+12+24=42,因此選項C)正確。
D) ByRef表示參數按址傳遞,顯然正確。

3、按值傳遞參數

按值傳遞參數是把實參變量的值傳遞給形參變量,實參變量的值在過程調用前後保持不變。定義過程時用ByVal關鍵字指出參數是按值來傳遞的。

如果將上述案例中Swap過程的參數改爲按值傳遞,那麼就無法實現交換變量值的功能。



選擇題真題演練:


過程f的形參x是按值傳遞,y與z是按址傳遞。因此調用過程f之後,實參a值依然不變,還是1,但是實參b與c會隨着形參y和z值而變化,都增加1,分別是3與4,因此選擇B。

4、傳遞數組參數

靜態數組和動態數組都可以作爲過程的參數。

案例:演示數組作爲過程參數,求傳入數組的元素之和。

1、創建工程,更名爲「演示數組作爲過程參數」,添加按鈕,設置屬性


2、編寫通用過程Sum()和按鈕單擊事件處理代碼


3、運行程序,查看效果


選擇題真題演練:

假如函數fun1的參數m採用傳值方式,那麼結果又該是多少呢?



過程P的參數b()採用默認的按址傳遞方式,因此調用P a之後,實參數組a的值就變成形參數組b的值,即2、4、6、8,因此選擇A)。

五、可選參數與可變參數
1、可選參數
在參數前加上關鍵Optional,表明該參數是可選參數。利用IsMissing函數來判斷是否傳入了可選參數,但是對Integer和Single類型無效,對於變體型纔有效。




2、可變參數  
(1)在過程聲明中,以普通方法定義參數列表。除最後一個參數以外的所有參數均爲必選(不是 Optional)。
(2)在最後一個參數名稱前面使用關鍵字
ParamArray。該參數自動爲可選。不要包含 Optional 關鍵字。
 (3)在參數數組名稱後面使用一對空括號。
 (4)在空括號後面使用常用的 As 子句。
(5)不要在 As 子句後帶默認值。




六、對象參數
1、窗體參數:窗體對象作爲過程參數
2、控件參數:控件對象作爲過程參數

案例:演示對象參數
1、創建工程,更名爲「演示對象參數」,添加控件,設置屬性

2、編寫兩個通用過程和一個按鈕單擊事件過程


3、運行程序,查看效果


單擊【確定】按鈕:



真考題庫試卷(3)第(32)題也涉及到控件參數。




運行程序,測試效果:


單擊圖片框:


明明在工程目錄裏有「pic.jpg」文件,爲啥不能加載呢?必須添加一個路徑:


此時再運行程序,單擊圖片框:


單擊標籤:


除了用TypeOf函數判斷控件類型之外,還可以用TypeName函數來判斷。