【正文】
er) As Integer If n = 0 Then fibolist = 1 ElseIf n = 1 Then fibolist = 1 Else fibolist = fibolist(n 2) + fibolist(n 1) End If End Function 68 第 9章 界面設計 ? 菜單的設計 ? 對話框的設計 ? 工具欄的設計 ? 狀態(tài)欄的設計 ? 多窗體設計 ? 多文檔界面設計 69 菜單的設計 ? 在 Windows應用程序窗口中,所有的操作都可以通過菜 ? 單來實現(xiàn)。 項為: For i = 0 To m1 Print fibolist(i) amp。程序代碼如下: Private Sub Command1_Click() Dim m As Integer, i As Integer, s As Integer m = InputBox(請輸入序列的項數(shù): ) Print 斐波那契序列的前 amp。 分析:斐波那契序列為: 1, 1, 3, 5, 8, 13, 21, 34, … 。 dectran(mm, nn) End Sub Public Function dectran(ByVal m As Integer, ByVal n As Integer) As Double Dim str As String Dim r As Integer Do While m 0 r = m Mod n str = r amp。 nn amp。 mm。 ? 分析:將十進制整數(shù) m轉(zhuǎn)換成 n進制的基本思想是輾轉(zhuǎn)相除法,即先用 m除以 n取余數(shù),然后再用它們的商除以 n到余數(shù),直到商為零時,最后反相取余數(shù)即為所求。漢諾塔問題比較復雜,由于篇幅原因,這里不再展開討論。最典型的例子就是求階乘問題和求漢諾塔問題。如果一個過程直接調(diào)用其本身,則稱為過程的直接遞歸調(diào)用,如果一個過程通過另一個過程再調(diào)用本身,則稱為過程的間接遞歸調(diào)用。這里的過程包括 Sub過程和 Function函數(shù)過程。 ? VB應用程序中的變量,如果不使用關鍵字Static語句聲明,則該變量屬于動態(tài)變量,否則屬于靜態(tài)變量。 61 變量的生存期 ? 當一個過程被調(diào)用時,系統(tǒng)將給該過程中的變量分配存儲單元,當該過程執(zhí)行結(jié)束時,是釋放還是保留變量的存儲單元,這就是變量的生存期問題。但是如果是在窗體(或模塊)的“通過”“聲明”中聲明的全局變量,本應用程序的其它模塊使用時,應在變量名前加上窗體名。 60 ? 3.全局變量 是指在窗體(或模塊)或標準模塊的任何過程外,也就是在 “通過”“聲明”中用 Public聲明的變量。 59 ? 2.窗體(或模塊)級變量 是指在一個窗體(或模塊)的任何過程之外,即在“通用”“聲明”中用 Dim聲明或用 Private聲明的變量。局部變量隨過程的調(diào)用而被分配存儲單元,并進行變量的初始化,在過程體內(nèi)進行數(shù)據(jù)的存??;當過程結(jié)束時,局部變量自動消失,其所占用的存儲單元也隨之釋放。 58 ? 1.局部變量 是指在過程體內(nèi)用 Dim聲明的變量或不聲明直接使用的變量。 57 變量的作用域 ? 變量的作用域決定了變量可被訪問的范圍。 56 ? 2.全局級 ? 是指在窗體或標準模塊中定義的過程,但在定義的 Sub過程或 Function函數(shù)過程前加上關鍵字 Public或省略該關鍵字。 1.窗體(或模塊)級 是指在某個窗體或標準模塊內(nèi)定義的過程,即在定義的 Sub過程或 Function函數(shù)過程前加上了關鍵字 Private。弄清過程和變量的作用域?qū)τ谖覀兙帉?VB應用程序來說顯然十分重要。在Visual Basic中,過程和變量隨它們所處的位置不同,可被訪問的范圍也不一樣。此時,必須滿足如下條件:⑴在形參前加上ParamArray關鍵字;⑵該參數(shù)是一個Variant類型的數(shù)組變量;⑶它只能是參數(shù)列表中的最后一個參數(shù);⑷在該參數(shù)前不能加上 ByVal、 ByRef或 Optional關鍵字。 53 不定數(shù)量參數(shù)的使用 ? 通常情況下, Function函數(shù)過程和 Sub過程調(diào)用時實參個數(shù)與應與形參個數(shù)相同,或者說,實參個數(shù)往往由形參個數(shù)決定。 50 ? 例 比較下列兩個過程,分析調(diào)用它們后,其結(jié)果有什么不同,為什么? Private Sub Form_Click() Dim x As Integer, y As Integer x = 5 y = 20 Print x, y Call change1(x, y) Print x, y x = 5 y = 20 Call change2(x, y) Print x, y End Sub 51 Sub change1(ByVal m As Integer, ByVal n As Integer) m = m + 1 n = n * 2 End Sub Sub change2(ByRef m As Integer, ByRef n As Integer) m = m + 1 n = n * 2 End Sub 該程序運行結(jié)果為: 5 20 5 20 6 40 52 可選參數(shù)的使用 ? 前面我們在講解 Function函數(shù)過程和 Sub過程的調(diào)用時,一直強調(diào)實參與形參的個數(shù)、數(shù)據(jù)類型、順序要一一對應,但是,在 VB中如果使用了特殊的選項,上述規(guī)則可以改變。換句話說,此時實參與形參具有相同的地址,這就意味著對形參的任何操作都變成了對相應實參的操作,實參的值會隨過程體對形參的改變而改變,即按地址傳遞是雙向的。 49 地址傳遞 ? 按地址傳遞是參數(shù)傳遞的另一種方式,它也是系統(tǒng)默認的參數(shù)傳遞方式。 48 ? 要實現(xiàn)按值傳遞的方式,在形參表中,相應的參數(shù)前必須加上關鍵字 ByVal。當過程調(diào)用結(jié)束時,形參所占用的存儲單元也同時被釋放。 47 值傳遞 ? 按值傳遞是指當調(diào)用過程時,系統(tǒng)將實參的值復制到一個臨時存儲單元中,并將臨時存儲單元與形參結(jié)合,完成了實參把值傳遞給形參的使命。除非在形參表中使用了關鍵字Optional或 Paramarray。格式 2中,實參不能加圓括號。顯示求階乘函數(shù)過程只需要一個形參,以確定求多少階乘,計算出階乘的值作為函數(shù)值返回。 格式:函數(shù)名 ([實參表 ]) 41 ? 現(xiàn)在我們可以用 Function函數(shù)過程來解決例 。 38 ? 事件過程一般的格式如下: Private Sub 對象名稱_事件 (參數(shù)列表 ) … End Sub 39 用戶自定義過程 ? FOUNCTION函數(shù)過程的定義 格式: Function 函數(shù)名 (形參表 ) [As 數(shù)據(jù)類型 ] 語句塊 函數(shù)名 =表達式 [ Exit Function ] [語句塊 ] [函數(shù)名 =表達式 ] End Function 40 ? FOUNCTION函數(shù)過程的調(diào)用 Function函數(shù)過程的調(diào)用與 VB內(nèi)部函數(shù)的調(diào)用類似。實際上,編寫 VB應用程序的主要任務就是判定對象是否響應某種事件以及如何響應該事件。當用戶對一個對象發(fā)出一個動作時,在該對象上就發(fā)生了事件,然后自動地調(diào)用與該事件相關的事件過程。一般來說,事件過程是對發(fā)生的事件進行處理的程序代碼,由用戶觸發(fā);通用過程是由用戶根據(jù)需要自定義,并可供事件過程多次調(diào)用的程序代碼,它通過程序中相應的語句調(diào)用。通用過程又可以分為Function函數(shù)過程、 Sub子過程、 Property屬性過程和 Event過程四類。其實這種編程思想,就是我們常說的結(jié)構化程序設計思想。 nmnm35 ? 過程的基本概念 前面我們已經(jīng)學習了系統(tǒng)提供的內(nèi)部函數(shù)過程和事件過程,利用它們幫助我們解決了不少問題。如果我們把求階乘的程序代碼段獨立出來,求組合數(shù)時,只要重復調(diào)用該程序,則計算組合數(shù)的程序變得十分簡練。 ? 分析:該例中有三處求階乘的值,而計算階乘的公式為: k!=1 2 3 … k 。 letter(i)。界面設計及程序如下: 31 Text1 CmdCount Label1 Label2 Picture1 32 Private Sub CmdCount_Click() Dim letter(1 To 26) As Integer, i As Integer, length As Integer Dim j As Integer, count As Integer Dim str As String * 1 length = Len(Text1) For i = 1 To length str = UCase(Mid(Text1, i, 1)) ?取出每一個字符并將其轉(zhuǎn)換成大寫 If str = A And str = Z Then j = Asc(str) 65 + 1 ?找出字母在 26個英文字母中所處的位置 letter(j) = letter(j) + 1 ?相應字母出現(xiàn)次數(shù)加 1 End If Next i For i = 1 To 26 If letter(i) 0 Then ?利用 Chr函數(shù)將循環(huán)變量加上 64轉(zhuǎn)換成字母 Chr(i + 64)。 ? 分析:聲明一個具有 26個元素的數(shù)組,用來存放不同英文字母出現(xiàn)的次數(shù),第 1個數(shù)組元素存放字母 A出現(xiàn)的次數(shù),第 2個數(shù)組元素存放字母 B出現(xiàn)的次數(shù), … ,第 26個數(shù)組元素存放字母 Z出現(xiàn)的次數(shù)。 i amp。 i amp。 Next x 同樣對于已賦值的二維數(shù)組,我們也可以利用 For Each…Next 循環(huán)語句遍歷所有數(shù)組元素,方法類似??梢杂萌缦鲁绦蚨蝸韺崿F(xiàn): Dim a(10) As Integer Dim x As Variant … For Each x In a Print x amp。界面設計及事件過程如下: Fram1 Option1(0) OOOP ption1(6) Label1 Picture1 24 Private Sub Option1_Click(Index As Integer) Select Case Index Case 0 = vbBlack Case 1 = vbRed Case 2 = vbGreen Case 3 = vbYellow Case 4 = vbBlue Case 5 = vbCyan Case 6 = vbWhite End Select End Sub 25 For Each…Next 循環(huán)語句在數(shù)組中特殊作用 ? 我們可以利用 For Each…Next 循環(huán)語句來遍歷數(shù)組中的所有元素。 22 控件數(shù)組的建立 : (1) 在窗體上畫出一控件,根據(jù)需要適當設置該控件的屬性; (2)選中該控件,進行復制,粘貼后系統(tǒng)會彈出提示對話框,確認后即創(chuàng)建了控件數(shù)組,然后使用粘貼即可創(chuàng)建多個控件數(shù)組元素了。控件數(shù)組一經(jīng)建立,每個控件數(shù)組元素通過索引號唯一確定。象這樣具有類型相同、功能相似的一組控件,編程時我們可以通過控件數(shù)組來實現(xiàn)。 20 控件數(shù)組 ? 引例 例 設計一界面,利用若干個單選按鈕,對圖片框區(qū)域設置不同的背景色。如對于 (1)中動態(tài)數(shù)組 a,我們可以用如下語句輸出: Dim i as integer for i=Lbound(a) to Ubound(a) a(i), next I Array()函數(shù)賦值的動態(tài)數(shù)組的下界為 0或者為 1,上界可以由 Array()的參數(shù)個數(shù)決定。如果要輸入大量數(shù)據(jù)一般可以用文本框再加上一些技術來處理。 j amp。 i a