開始編碼之前 在 Visual Basic 中創(chuàng)建應(yīng)用程序的最重要的(又往往為人忽視的)部分是設(shè)計(jì)階段。需要為應(yīng)用程序設(shè)計(jì)一個(gè)用戶界面,,這是顯然的,;但需要設(shè)計(jì)代碼的結(jié)構(gòu)就不那么顯然了。構(gòu)造應(yīng)用程序的方法不同,,可造成應(yīng)用程序的性能及代碼的可維護(hù)性,、可使用性不同?! ?/div> Visual Basic 應(yīng)用程序的代碼是用分層方式組織的,。典型應(yīng)用程序包括若干模塊:應(yīng)用程序中每個(gè)窗體的窗體模塊、共享代碼的可選標(biāo)準(zhǔn)模塊以及可選的類模塊,。 每個(gè)模塊包含若干含有代碼的過程:event過程,、Sub子過程或Function過程,以及Property過程,?! ∨卸ㄊ裁催^程屬于什么模塊,這與創(chuàng)建的應(yīng)用程序的類型有一定關(guān)系,。因?yàn)?Visual Basic 是基于對(duì)象的,,所以,利用應(yīng)用程序代表的對(duì)象來(lái)考慮應(yīng)用程序?qū)⑹怯幸娴?。在這一章,,示例應(yīng)用程序 Vcr.vbp 的設(shè)計(jì)建立在盒式錄像機(jī)和電視機(jī)組成的對(duì)象基礎(chǔ)之上。VCR 應(yīng)用程序包含兩個(gè)窗體模塊,、一個(gè)標(biāo)準(zhǔn)模塊和兩個(gè)類模塊,。可用“對(duì)象瀏覽器”來(lái)檢查工程的結(jié)構(gòu)(圖5.2),。
VCR 應(yīng)用程序的主窗體 (frmVCR) 是 VCR與電視屏幕組合的可視圖像(圖 5.3),。它包括幾個(gè)對(duì)象,這些對(duì)象以現(xiàn)實(shí)世界中的圖景為模型,。一組命令按鈕(cmdPlay,、cmdRecord 等等)模仿的是操作 VCR 的按鈕。軟件VCR 還包括時(shí)鐘 (lblTime),、通道指示器 (lblChannel),、功能指示器(shpPlay、shpRecord 等等)以及顯像管 (picTV),。Vcr.frm 窗體模塊包括所有這些對(duì)象的事件過程,。 在很多情況中都存在著多個(gè)對(duì)象共享的重復(fù)過程。例如,,“按下”“放像”,、“倒帶”或“錄像”按鈕時(shí)就要求“暫停”和“停止”按鈕有效。最好創(chuàng)建一個(gè)共享的子過程,,所有按鈕都可調(diào)用它,,而不要在每個(gè)按鈕的 Click 事件過程中重復(fù)這段代碼。如果將來(lái)要修改這些子程序,,則只在一個(gè)地方修改就可進(jìn)行全部修改,。標(biāo)準(zhǔn)模塊 Vcr.bas 包含各種共享過程。 VCR 的某些部分是不可視的,比如磁帶的輸送機(jī)置或錄制電視節(jié)目的邏輯便是如此,。同樣,,軟件 VCR 的一些功能沒有可視圖像。這些部分和功能是作為兩個(gè)類模塊 Recorder.cls 和 Tape.cls 實(shí)現(xiàn)的,。clsRecorder 模塊包含啟動(dòng)“錄像”進(jìn)程的代碼,;而 clsTape 模塊則包含控制“磁帶”方向和速度的代碼。這些模塊中所定義的類與窗體中的任何對(duì)象都沒有直接關(guān)系,。因?yàn)樗鼈兪仟?dú)立的代碼模塊,,所以不作任何修改就可輕輕松松重建一個(gè)錄音程序。 除了設(shè)計(jì)代碼結(jié)構(gòu)之外,,建立命名約定也是很重要的,。按照缺省規(guī)定,VisualBasic 將工程的第一個(gè)窗體命名為 Form1,,第二個(gè)窗體為 Form2,,依此類推。如果應(yīng)用程序中有幾個(gè)窗體,,則最好賦予它們有含義的名字,,以免在編寫或編輯代碼時(shí)出現(xiàn)混淆情況。在附錄 B“Visual Basic 編碼約定”中列舉了一些 Visual Basic 建議的命名約定,。 在進(jìn)一步了解對(duì)象和學(xué)習(xí)編寫代碼時(shí),,可參考 VCR 示例應(yīng)用程序,查找有關(guān)各種編碼技巧的例子,。 代碼編寫機(jī)制 在著手編寫代碼之前,,了解 Visual Basic 編寫代碼的機(jī)制是很重要的。和任何編程語(yǔ)言一樣,,Visual Basic 有自身的組織,、編輯和格式化代碼規(guī)則。 代碼模塊 Visual Basic 的代碼存儲(chǔ)在模塊中,。模塊有三種類型:窗體,、標(biāo)準(zhǔn)和類。簡(jiǎn)單的應(yīng)用程序可以只有一個(gè)窗體,,應(yīng)用程序的所有代碼都駐留在窗體模塊中,。而當(dāng)應(yīng)用程序龐大復(fù)雜時(shí),就要另加窗體,。最終可能會(huì)發(fā)現(xiàn)在幾個(gè)窗體中都有要執(zhí)行的公共代碼,。因?yàn)椴幌M趦蓚€(gè)窗體中重復(fù)代碼,所以要?jiǎng)?chuàng)建一個(gè)獨(dú)立模塊,,它包含實(shí)現(xiàn)公共代碼的過程,。獨(dú)立模塊應(yīng)為標(biāo)準(zhǔn)模塊,。此后可以建立一個(gè)包含共享過程的模塊庫(kù)。 每個(gè)標(biāo)準(zhǔn)模塊,、類模塊和窗體模塊都可包含: 聲明,。可將常數(shù),、類型,、變量和動(dòng)態(tài)鏈接庫(kù) (DLL) 過程的聲明放在窗體,、類或標(biāo)準(zhǔn)模塊的模塊級(jí),。 過程。Sub,、Function 或者 Property 過程包含可以作為單元來(lái)執(zhí)行的代碼片段,。本章后面的“過程概述”一節(jié)中將討論這些內(nèi)容。 窗體模塊 窗體模塊(文件擴(kuò)展名為 .FRM )是大多數(shù) Visual Basic 應(yīng)用程序的基礎(chǔ),。窗體模塊可以包含處理事件的過程,、通用過程以及變量、常數(shù),、類型和外部過程的窗體級(jí)聲明,。如果要在文本編輯器中觀察窗體模塊,則還會(huì)看到窗體及其控件的描述,,包括它們的屬性設(shè)置值,。寫入窗體模塊的代碼是該窗體所屬的具體應(yīng)用程序?qū)S玫模凰部梢砸迷搼?yīng)用程序內(nèi)的其它窗體或?qū)ο蟆?br> 標(biāo)準(zhǔn)模塊 標(biāo)準(zhǔn)模塊(文件擴(kuò)展名為 .BAS)是應(yīng)用程序內(nèi)其它模塊訪問的過程和聲明的容器,。它們可以包含變量,、常數(shù)、類型,、外部過程和全局過程的全局(在整個(gè)應(yīng)用程序范圍內(nèi)有效的)聲明或模塊級(jí)聲明,。寫入標(biāo)準(zhǔn)模塊的代碼不必綁在特定的應(yīng)用程序上;如果能夠注意不用名稱引用窗體和控件,,則在許多不同的應(yīng)用程序中可以重用標(biāo)準(zhǔn)模塊,。 類模塊 在 Visual Basic 中類模塊(文件擴(kuò)展名為 .CLS)是面向?qū)ο缶幊痰幕A(chǔ)??稍陬惸K中編寫代碼建立新對(duì)象,。這些新對(duì)象可以包含自定義的屬性和方法。實(shí)際上,,窗體正是這樣一種類模塊,,在其上可安放控件,可顯示窗體窗口,。 詳細(xì)信息 關(guān)于在類模塊中編寫代碼的更詳細(xì)的信息,,請(qǐng)參閱第九章“用對(duì)象編程”。 注意 Visual Basic 的專業(yè)版和企業(yè)版也包含 ActiveX 文檔、ActiveX 設(shè)計(jì)器和用戶控件,。它們引入了具有不同文件擴(kuò)展名的新模塊類型,。從編寫代碼的角度來(lái)看,這些模塊應(yīng)視同為窗體模塊,。 使用“代碼編輯器” Visual Basic “代碼編輯器” 是一個(gè)窗口,,大多數(shù)代碼都在此窗口上編寫。它像一個(gè)高度專門化的字處理軟件,,有許多便于編寫 Visual Basic 代碼的功能,。圖 5.4所示為“代碼編輯器”窗口。 因?yàn)橐僮髂K中的 Visual Basic 代碼,,所以要為每一個(gè)從“工程資源管理器”中選擇的模塊打開一個(gè)獨(dú)立的“代碼編輯器”窗口,。在每個(gè)模塊中,對(duì)于模塊中所包含的每個(gè)對(duì)象,,將模塊中的代碼再細(xì)分出與對(duì)象對(duì)應(yīng)的獨(dú)立部分,。用“對(duì)象列表框”實(shí)現(xiàn)各部分間的切換。 在窗體模塊中,,該列表包含一個(gè)通用段,,一個(gè)屬于窗體自身的段以及窗體所包含的每一控件的段。對(duì)于類模塊,,列表包括一個(gè)通用段和一個(gè)類段,;對(duì)于標(biāo)準(zhǔn)模塊,只有一個(gè)通用段被顯示,。 每一段代碼都可包含幾個(gè)用“過程列表框”訪問的不同過程,。對(duì)窗體或控件的每一個(gè)事件過程,窗體模塊的過程列表都包含一個(gè)獨(dú)立的段,。例如,,Label控件的過程列表就包含 Change 事件段、Click 事件段和 DblClick 事件段等等,。類模塊只列舉類本身的事件過程——初始化和終止,。標(biāo)準(zhǔn)模塊不列舉任何事件過程,因?yàn)闃?biāo)準(zhǔn)模塊不支持事件,。 模塊通用段的過程列表只包含唯一段——聲明段,,其中放置模塊級(jí)的變量、常數(shù)和 DLL 聲明,。當(dāng)在模塊中添加子過程或函數(shù)過程時(shí),,那些過程被添加到聲明段下方的“過程列表框”中。 代碼的兩種不同視圖都可用于“代碼編輯器”窗口,??梢砸淮沃徊榭匆粋€(gè)過程,,也可以查看模塊中的所有過程,這些過程彼此之間用線隔開(如圖 5.4所示),。為了在兩個(gè)視圖之間進(jìn)行切換,,利用編輯器窗口左下角的“查看選擇”按鈕。 自動(dòng)完成編碼
Visual Basic 能自動(dòng)填充語(yǔ)句,、屬性和參數(shù),,這些性能使編寫代碼更加方便。在輸入代碼時(shí),,編輯器列舉適當(dāng)?shù)倪x擇,、語(yǔ)句或函數(shù)原型或值。通過“工具”菜單上的“選項(xiàng)”命令訪問“選項(xiàng)”對(duì)話框,,在“選項(xiàng)”對(duì)話框的“編輯器”選項(xiàng)卡上可用這樣的選項(xiàng),,由它們決定是允許還是禁止各代碼的設(shè)置值。 在代碼中輸入一控件名時(shí),,“自動(dòng)列出成員特性”會(huì)亮出這個(gè)控件的下拉式屬性表(圖 5.5)。鍵入屬性名的前幾個(gè)字母,,就會(huì)從表中選中該名字,,按 Tab鍵將完成這次輸入。當(dāng)不能確認(rèn)給定的控件有什么樣的屬性時(shí),,這個(gè)選項(xiàng)是非常有幫助的,。即使選擇了禁止“自動(dòng)列出成員特性”,仍可使用 CTRL +J 組合鍵得到這種性能,。 “自動(dòng)快速信息”功能顯示語(yǔ)句和函數(shù)的語(yǔ)法(圖 5.6),。當(dāng)輸入合法的 VisualBasic 語(yǔ)句或函數(shù)名之后,語(yǔ)法立即顯示在當(dāng)前行的下面,,并用黑體字顯示它的第一個(gè)參數(shù),。在輸入第一個(gè)參數(shù)值之后,第二個(gè)參數(shù)又出現(xiàn)了,,同樣也是黑體字,。“自動(dòng)快速信息”也可以用 CTRL+I 組合鍵得到。 書簽 在代碼編輯器中書簽可用來(lái)標(biāo)記代碼的某些行,,以便您以后可以很容易地返回這些行,。書簽開關(guān)的切換以及定位到已有書簽的命令可以在編輯、書簽菜單項(xiàng)或編輯工具欄中得到,。 詳細(xì)信息 關(guān)于如何使用組合鍵使用“代碼編輯器”窗口的各種功能的更詳細(xì)信息,,請(qǐng)參閱“代碼窗口的快捷鍵”。 編碼基礎(chǔ) 這一部分介紹代碼編寫機(jī)制,,包括如何中斷和合并代碼行,、如何添加注釋,、如何使用數(shù)字以及 Visual Basic 命名約定。 將單行語(yǔ)句分成多行 可以在“代碼”窗口中用續(xù)行符(一個(gè)空格后面跟一個(gè)下劃線)將長(zhǎng)語(yǔ)句分成多行,。由于使用續(xù)行符,,無(wú)論在計(jì)算機(jī)上還是打印出來(lái)的代碼都變得易讀。下面用續(xù)行符 ( _) 將代碼分成若干行: Data1.RecordSource = _ "SELECT * FROM Titles, Publishers" _ & "WHERE Publishers.PubId = Titles.PubID" _ & "AND Publishers.State = 'CA'" 在同一行內(nèi),,續(xù)行符后面不能加注釋,。至于在什么地方可以使用續(xù)行符,還是有某些限制的,。 將多個(gè)語(yǔ)句合并到同一行上 通常,,一行之中有一個(gè) Visual Basic 語(yǔ)句,而沒有語(yǔ)句終結(jié)符,,但是也可以將兩個(gè)或多個(gè)語(yǔ)句放在同一行,,只是要用冒號(hào) (:) 將它們分開。 Text1.Text = "Hello" : Red = 255 : Text1.BackColor = Red 但是,,為了便于閱讀代碼,,最好還是一行放一個(gè)語(yǔ)句。 詳細(xì)信息 關(guān)于詳細(xì)信息,,請(qǐng)參閱附錄 A“Visual Basic 的規(guī)范,、限制和文件格式”。 在代碼中添加注釋 閱讀本手冊(cè)的例子時(shí)常會(huì)遇到注釋符 ('),。這個(gè)符號(hào)告訴 Visual Basic,,忽略該符號(hào)后面的內(nèi)容。這些內(nèi)容是代碼段中的注釋,,既是為了方便開發(fā)者,,也是為了方便以后可能檢查源代碼的其他程序員。例如: ' 這是從屏幕左邊 ' 開始的注釋,。 Text1.Text = "Hi!" '在文本框中放 '歡迎詞,。 注釋可以和語(yǔ)句在同一行,并寫在語(yǔ)句的后面,,也可占據(jù)一整行,。上述代碼對(duì)這兩種情況都作了示范。記住,,不能在同一行上將注釋接在續(xù)行符之后,。 注意 您可以通過選中兩行或多行代碼并在“編輯”工具欄上通過選擇“注釋塊”或“刪除注釋塊”按鈕來(lái)對(duì)該代碼塊添加或刪除注釋符號(hào)。 理解數(shù)字系統(tǒng) 在本文檔中大多數(shù)的數(shù)值都是十進(jìn)制的(基數(shù)為 10),。但有時(shí)用十六進(jìn)制數(shù)(基數(shù)為 16)或八進(jìn)制數(shù)(基數(shù)為 8)更方便,。Visual Basic 用前綴 &H表示十六進(jìn)制數(shù),而用 &O 表示八進(jìn)制數(shù),。下表說(shuō)明同一個(gè)數(shù)的十進(jìn)制,、八進(jìn)制和十六進(jìn)制表示,。 通常不必掌握十六進(jìn)制或八進(jìn)制數(shù)制,因?yàn)橛?jì)算機(jī)可以用任何數(shù)制的數(shù)工作,。但是,,對(duì)某些任務(wù)來(lái)說(shuō),有的數(shù)系就比其它數(shù)系更合適,,例如利用十六進(jìn)制數(shù)設(shè)置屏幕和控件的顏色,。 Visual Basic 的命名約定 在編寫 Visual Basic 代碼時(shí),要聲明和命名許多元素(Sub 和 Function 過程,、變量,、常數(shù)等等)。在 Visual Basic 代碼中聲明的過程,、變量和常數(shù)的名字,,必須遵循這些規(guī)則: 1.它們必須以字母開頭。 2.它們不可以包含嵌入的句號(hào)或者類型聲明字符(規(guī)定數(shù)據(jù)類型的特殊字符),。 3.它們不能超過255個(gè)字符,。控件,、窗體,、類和模塊的名字不能超過40個(gè)字符。 4.它們不能和受到限制的關(guān)鍵字同名,。 受到限制的關(guān)鍵字是 Visual Basic 使用的詞,是語(yǔ)言的組成部分,。其中包括預(yù)定義語(yǔ)句(比如 If 和 Loop),、函數(shù)(比如 Len 和 Abs)和操作符(比如 Or 和 Mod)。 詳細(xì)信息 關(guān)于關(guān)鍵字表的更詳細(xì)信息,,請(qǐng)參閱《Visual Basic 6.0語(yǔ)言參考手冊(cè)》,。 窗體和控件可以和受到限制的關(guān)鍵字同名。例如,,可以將某個(gè)控件命名為L(zhǎng)oop,。但在代碼中不能用通常的方法引用該控件,因?yàn)?Visual Basic 會(huì)認(rèn)為 Loop 意味著關(guān)鍵字,。例如,,下面的代碼就會(huì)出錯(cuò)。 Loop.Visible = True ' 出錯(cuò),。 為了引用那些和受到限制的關(guān)鍵字同名的窗體或控件,,就必須限定它們,或者將其用方括號(hào) [ ] 括起來(lái),。例如,,下面的代碼就不會(huì)出錯(cuò),。 MyForm.Loop.Visible = True '用窗體名 '將其限定。 [Loop].Visible = True '方括號(hào) '起了作用,。 在引用窗體和控件時(shí)都可以用這種方式使用方括號(hào),,但在聲明變量或定義過程期間,當(dāng)變量名或過程名與受到限制的關(guān)鍵字相同時(shí),,這種方式是不能使用的,。方括號(hào)還可以用來(lái)強(qiáng)制 Visual Basic 接受其它類型庫(kù)提供的名稱,這些名稱與受到限制的關(guān)鍵字沖突,。 注意 因?yàn)殒I入方括號(hào)也是令人厭倦的事情,,所以希望少用受到限制的關(guān)鍵字作窗體或控件名。但是,,如果Visual Basic的新版本定義了與現(xiàn)有窗體或控件沖突的新關(guān)鍵字,,那么在為使用新版本而更新代碼時(shí),可以使用這個(gè)技巧,。 |
|