![相關教程vb6visual basic實用編程_第1頁](http://file4.renrendoc.com/view/797a378aa2e4e7844fa0e6a81a6597e5/797a378aa2e4e7844fa0e6a81a6597e51.gif)
![相關教程vb6visual basic實用編程_第2頁](http://file4.renrendoc.com/view/797a378aa2e4e7844fa0e6a81a6597e5/797a378aa2e4e7844fa0e6a81a6597e52.gif)
![相關教程vb6visual basic實用編程_第3頁](http://file4.renrendoc.com/view/797a378aa2e4e7844fa0e6a81a6597e5/797a378aa2e4e7844fa0e6a81a6597e53.gif)
![相關教程vb6visual basic實用編程_第4頁](http://file4.renrendoc.com/view/797a378aa2e4e7844fa0e6a81a6597e5/797a378aa2e4e7844fa0e6a81a6597e54.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
代碼中的進程很少是用從上到下順序執(zhí)行的單個過程來完成的。大多數進程是用多個過程來完成的,有時包含多個程序模塊。如果按照某個進程的執(zhí)行路徑來運行代碼,通常會遇到多迂回轉折,這常常是根據表達式的計算作出的判斷而的。第二次啟動某個進程時,即使程序中的單個條件發(fā)生變化,比如用戶將新文本輸入一個文本框,也會產生完全不同的執(zhí)行路徑。多個執(zhí)行路徑常常會使代碼呈現(xiàn)非常錯綜復雜的形式。顯然,若要閱讀和調試代碼,必須做到非常容易地確定執(zhí)行路徑的變更。此,必須盡可能使代碼流中的判斷點便于理解。為此必須了解某種情況下應該使用何種轉移結構,以及何時使用這種結構。例如,必須知道何時使用SelectCase比使If...Then...Else更加合適。在正確的位置使用正確的代碼構造可使代碼更容易閱讀,并且可以在以后更容易添加新的表達式。無論在某種情況下使用何種判斷構造,都必須計算一個表達式。大多數表達式都可以用多不同方式來編寫,但是通常只有一個最佳方式可以用來編寫某個表達式。正確編寫表達式是非常關鍵的,本章將提供多實際應用的舉例,以幫助你創(chuàng)建正確的表達式。如果表達式編寫得不好,最好的情況是它們很難閱讀和理解,的情況會導致程序運行失敗。注意所有的判斷構造都必須遵守嚴格的縮進規(guī)則。有關正確縮進的具體說明,請參見當根據一個條件是True還是False來作出判斷時,使用If...ThenIf...Then的IfconditionThenstatIfcondition[statementsEnd如果conditon的計算結果是Tue,該語句或多個語句便開始執(zhí)行。如果onditon的計算結果是e,該語句或多個語句就不執(zhí)行。表達式可以簡單,也可以復雜。無論多么復雜,用于conditon的表達式計算的結果必須是ue或False。例如,下面的所有表達式對于onditon來說sngCoordinate>=8strFirstName=“Adam"True或False。由于blnInHere指的是一個變量(正如它的前綴所指的那樣),它的計算結果 VisualBasic便將該結果轉換成True或False。如果該值是0,則被視為False,所有非0值被視為True。當condition的計算結果是False時,若要執(zhí)行一個語句或一組語句,請使用Else語句。當condition的計算結果是False時,Else與EndIfcondition的計算結果是TrueIf...Then與Else之間的所有語句才執(zhí)行。兩組語句決不會在單次運行一個If...EndIf構造時執(zhí)行。即使只有一個語句被執(zhí)行,也應考慮使用EndIf構造。當condition的計算結果是True時,如果只有一個語句被執(zhí)行,該語句可以與If放在同一行上,并且EndIf可以省略。但是,若要使代碼更便于閱讀,請將該語句單獨放在一行上,并以EndIf作為該構造的結束?!?If swereencountered,buildthis‘*intothemessageIf s>0ThenstrMessage=strMessage&“,“& s&“contact(s)couldnotbeadded“&“duetolocking‘*Iflockingswereencountered,buildthis‘*intothemessageIflngLockings>0strMessage=strMessage&“,“&lngLockings&_“contact(s)couldnotbeaddeddueto“&_“l(fā)ockings!"End不要認為VisualBasic會使復合條件短路。當你創(chuàng)建一個If...Then判斷結構時,可能創(chuàng)建IfNot((rstAlarmsIsNothing)Or(rstAlarms.EOF))End如果Recordset的EOF(行尾)屬性是False,那么該判斷結構將設法刪除一個記錄。首先 語句要確定變量rstAlarms實際上包含一個Recordset(記錄集),然后要確定EOF屬性是False如果rstAlarms不包含Recordse(rstAlarmsIsNothing的計算結果是ruVisualBasic將不計算該條件的第二部分,即rstAlarms.EO的結果。對于一個Oru,那么整個條件的計算結果就是rue復合條件的第一部分計算結果為ruerstAlarmsIsNothing但是,這并不是VisualBasicVisualBasic會對復合條件的每個部分進行計算,而不管這種計算是否必要。在上面這個例子中,如果rstAlarms確實不包含記錄集,那么如果試圖確定記錄集的EOF屬性是否是rue,就會產生運行期錯誤。有些編程語言只有等到復合條件的值是明確的時候,才會從左到右對復合條件中的各個條件進行計算。剩下的各個條件不進行計但是,在Viulasc中依賴于它,就可能在代碼中埋下隱患。PublicFunctionFirstValidItemID()As‘*Purpose:ReturntheItemIDofthefirstitem ‘*Returns:TheItemIDofthefirstitem,ifishas Otherwisereturns“<notDimstrSQL AsStringDimrstInventoryAsRecordsetConstc_NotValid=“<not‘*OpenSetrstInventory=dbInventory.OpenRecordset(“tblPhysicalInventory",‘*SincetheRecordsetisForwardOnly,itwillbe‘*onthefirstrecordifthereareany‘*ChecktoseewhetherthefirstrecordhasanIfNot(rstInventory.EOF)AndrstInventory![ItemID]<>""FirstValidItemID=FirstValidItemID=EndExitEndPublicFunctionFirstValidItemID()As‘*Purpose:ReturntheItemIDofthefirstitem ‘*Returns:TheItemIDofthefirstitem,ifithas Otherwisereturns“<notDimstrSQL AsStringDimrstInventoryAsRecordsetConstc_NotValid=“<not‘*OpenSetrstInventory=dbInventory.OpenRecordset(“tblPhysicalInventory",‘*Defaultthereturnvalueas“<notFirstValidItemID=‘*SincetheRecordsetisForwardOnly,itwillbe‘*onthefirstrecordifthereareanyrecords.‘*Checktoseewhetherthereareanyrecords.IfNot(rstInventory.EOF)‘*Thereisarecord;returntheItemIDifithasIfrstInventory![ItemID]<>""FirstValidItemID=EndIfEndFunction對非表達式與各種可能的值進行比較時,使用SelectCase語對只可能有兩個值(True或False)的表達式進行計算時,If...Then是可以使用的最佳判斷SelectCase成了這種情況下的最佳選擇。典型的SelectCase構造的語句如下:SelectCasetestexpressi[Caseexpressionlist[statementblock-1]][Caseexpressionlist2[statementblock-2[Case[statementblock-nEnd注 SelectCase可以用多高檔次的方式來使用,比如將多個結果值放在一個ruFals,你可能想計算第二個條件,并根據這個新條件的計算結果來運行代碼。使用這種方法,能夠創(chuàng)建相當復雜的判斷結構。下面顯示了這樣一個判斷結構的框架:Ifcondition1 ElseIfconditi ElseIfcondition3 EndSelectCase結構完全相反。在SelectCase結構中,通過對一個(通常是非)與Case語句中的每個表達式連續(xù)進行比較,從而構成了各個條件。如果發(fā)現(xiàn)計算的是同一個表達式,并且對它與各個可能值進行比較,那么應該使用SelectCase,而不是If...Then...ElseIf...EndIf?!?Setthepushedstateoftheproperoptionbuttoninthe‘*IfrstTask![Type]=“PhoneCall”optType(c_PhoneCall).Value=ElseIfrstTask![Type]=“Appointment”optType(c_Appointment).Value=ElseIfrstTask![Type]=“To-do”optType(c_Todo).Value=TrueEndIf‘*Setthepushedstateoftheproperoptionbuttoninthe‘*SelectCaseCaseIs=“PhoneoptType(c_PhoneCall).Value=TrueCaseIs=“Appointment"optType(c_Appointment).Value=CaseIs=“To-optType(c_Todo).Value=Case‘*NoothervaluesareEnd注意可以采用并不非常明確的方法來使用SelectCase語句。例如,當窗體上配有多選項按鈕時,常常必須決定選擇哪個選項按鈕(Value=True)。如果認為測試表達式SelectCaseCaseIs=CaseIs=CaseIs=Case‘*TherearenofurtheroptionbuttonsinthisEnd即使不需要,也應該在每個 Case構造中包含 Else語句。一般來說,設計SelectCaseCaseElse可以用來創(chuàng)建這樣一種代碼,它可以在不能滿足期望的任何結果時運行。但是,多編程員省略了CaseElse,如果他已經為所有期望的結果加上了Case語句。一般來說,始終都加上CaseElse語句,這是個好的思路。如果想忽略不是專門為CaseCaseElse子句的注釋中對此加以說明即可。如果認為沒有一個值會導致CaseElse運行,也就是說,如果Case語句中所有可能的結果都是有理由的,那么CaseElse子句中就會出現(xiàn)錯誤。這樣,如果漏掉一個值(如果在將來編程中產生別的結果并且SelectCase結構沒有正確地更新,就會出現(xiàn)這種情況,就會知道這個情況。如果始終都加上CaseElse子句,代碼將更加清楚明了,就不會迫使其他編程人員去猜測為什么要處理Case語句中的沒有特殊理由的結果。SelectCaseCaseIs=txtSearch.Text=CaseIs=txtSearch.Text=CaseIs=txtSearch.Text=EndSelectCaseCaseIs=txtSearch.Text=CaseIs=txtSearch.Text=CaseIs=txtSearch.Text=Case‘*Allpossiblevaluesshouldbecovered,butjustincase…MsgBox“Unexpectedvalueencounteredfor“&_“m_intActiveSearchTypein“&Me.Name&“|txtSearch_KeyDown.",End所有Case語句都應該使用便于理解的順序。SelectCase構造中各個不同的Case序看上去似乎無所謂,但是它常常是很重要的。當對語句排序時,應該考慮到速度和可讀性問題。當遇到SelectCaseCase語句按照其列出的順序計算其結果,直到遇到一個值是rue的條件為止。在很大的項目列表中,當運行速度是關心的主要問題時,可以考慮將最希望要的值放在Case列表的最上面。但是大多數情況下,速度問題的重要性低于代碼的可讀性和維護的簡便性。在這種情況下,請按字母或數字順序的項目排序,這樣,代碼的調試以及將新值添加給CasSelectCaseCaseIS=CallCaseIs=CallCaseIs=CallCaseIs= Call EndSelectCaseCaseIs=CallCaseIs= Call CaseIs=CallCaseIs=CallCase‘*NoothervaluesareEnd不要編寫決不會產生rue結果的Case語句。當創(chuàng)建的SelectCase結構用于計算數值時,可以編寫決不會產生rue結果的Case語句。這種情況通常是因為Case語句的排序不正確而造成的,這會導致在后來遇到Case語句之前將較早的Case語句計算為rue值。請注意下面的不正確代碼中的CaseIs<=0這一語句的計算結果決不會是rue。如果一個值小于,會導致前面的Case語句(CaseIs<=5的計算結果成為rue,從而不再作進一步的計算。SelectCaseCaseIs<=5CaseIs<=0CaseIs<=10CaseElseEndSelectCaseCaseIs<=0CaseIs<=5CaseIs<=10CaseElseEnd第8第8章中內部注釋優(yōu)于行尾注釋,但是有時更加適合使用行尾注釋,比如,當嵌套式判斷結構使代碼變得相當復雜時,使用行尾注釋就可以使這種結構變得清楚些。在很長的程序中,很難確定哪個結構的結束語句(如EndSelect或EndIf)對應于哪個結構的開始語句。在這種情況下,可以在每個判斷結構的最后一個語句后面使用行尾注釋來說明結束語句屬于哪個判斷結構。 IfotnumHours.Value<=0MsgBox“Thisisanhourlycontract.Youmustenterapositive“&“numberofhours",‘*DeterminewhethertheuserhasenteredaIfotnumRate.Value>0otnumPrice.Value=otnumHours.Value*IfotnumPrice.Value>0‘*Norateentered;checkwhetheracontractpriceisset.‘*Ifacontractpriceisset,figuretheratebasedonthe‘*hoursentered.otnumRate.Value=otnumPrice.Value/EndIfEnd‘*MakesuertheuserhasenteredapositivenumberofIfotnumHours.Value<=0MsgBox“Thisisanhourlycontract.Youmustenterapositive“&“numberofhours",‘*DeterminewhethertheuserhasenteredaIfotnumRate.Value>0otnumPrice.Value=otnumHours.Value*‘*Thereisnorateentered,seeifthereisaIfotnumPrice.Value>0‘*Acontractpriceisset.Figuretheratebasedon‘*hoursotnumRate.Value=otnumPrice.Value/End ‘*otnumPrice.Value>End ‘*otnumRate.Value>End ‘*表達式的計算是創(chuàng)建判斷結構的。大多數表達式可以用多種方式來編寫。對表達式進行正確的格式化可以減少代碼出錯的可能性,增加代碼的可讀性。由于用于判斷結構的大多數表達式的計算結果是值(ruFalse,因此正確操作表達式是非常重要的。決不要將表達式與rue或False相比較。這似乎是個基本原則,但是這也是人們常常違背的一個原則。值是rue或False,因此沒有必要再將表達式與rue或False比較。下面這個不正確的代碼來自一份非常有名的VisualBasic。除了它沒有使用命名約定外,這個過程還顯得過分復雜。BOF和EOF是Recordset對象的屬性,用于表示Recordset開始處或結尾處。這兩個屬性可以是rue,也可以是Fals。由于它們本來就是值,因此將它們直接與rueFalse相比較,就會將代碼,并且會降低它的運行速度。PublicFunctionIsEmptyRecordset(rsAsRecordset)AsIsEmptyRecordset=((rs.BOF=True)And(rs.EOF=EndPublicFunctionIsEmptyRecordset(rsAsRecordset)AsIsEmptyRecordset=rs.BOFAndEnd創(chuàng)建的變量名應該反映肯定的條件而不是否定的條件。使過程變得過分復雜的一個典型例子是創(chuàng)建一個反映否定條件的變量名。根據這種變量進行判斷,就會使代碼變得更加復雜。例如,當調用blnLoaded變量就可以滿足需要并且更加容易處理時,為什么還去調用blnNotLoaded變量呢?當使用否定條件時,代碼就增加了出錯的可能性,因為在編寫代碼時無法發(fā)現(xiàn)存在的問題。這不同于在句子中使重否定的情況。如果必須使用否定條件,請在變量的肯定形式上使用Not,而不要使用變量的否定形式。DimblnInvalidTemteAs‘*Attempttoopenthetemte.ThefunctionOpenTemte‘*successor‘*Ifthetemteisinvalid,getGoToPROC_EXITEndDimblnValidTemteAs‘*Attempttoopenthetemte.ThefunctionOpenTemte‘*successorblnValidTemte=OpenTemte(strTem‘*Ifthetemteisinvalid,getIfNot(blnValidTemte)ThenGoToPROC_EXITEnd為了清楚起見,用括號將表達式括起來。即使不要求,也要使用括號。在代數式中,括號用于使傳統(tǒng)運算順序變得無效。例如,標準運算順序是先做乘法再做加法。因此,Debug.Print1+56這個語句輸出的值是31。若要改變這個運行特性,可以使用括號。括號中的Debug.Print(1+5)*6的輸出結果是36。如果想使用傳統(tǒng)的運算順序,雖然不必使用括號,但是對于復雜的表達式來說,仍然應該使用括號,這樣可以使表達式更加清楚?!?Computetheheightandwidthoftheeditablearea.m_sngEditWidth=m_sngImageWidth*m_intMagnification+1m_sngEditHeight=m_sngImageHeight*m_intMagnification+1‘*Computetheheightandwidthoftheeditablearea.m_sngEditWidth=(m_sngImageWidth*m_intMagnification)+1m_sngEditHeight=(m_sngImageHeight*m_intMagnification)+1使代碼流更加清楚。當編寫判碼結構時,應該盡量使代碼流顯得清楚一些。若要使了解你的意圖,不應該需要筆和紙。下面給出的不正確代碼也應該從眾所周知的isualBasicCancel參數設置為等于MsgBoxvbCancel比較,其結果(rue或False)是存放在Cancel參數中的值。為什么讓讀者如此費勁呢?修改后的代碼執(zhí)行相同的函數,但是運行性能不會有真正的損失,并且理解起來更加容易。PrivateSubForm_Unload(CancelAsCancel=(MsgBox(“QuitNow?",vbOKCancelOr_vbQuestion,“ConfirmationDemo”)=vbCancel)EndPrivateSubForm_Unload(CancelAs‘*ChecttoseewhethertheuserclictedIfMsgBox(“QuitNow?",vbOKCancelOrvbQuestion,“ConfirmationDemo”)=vbCancelEndIfEnd盡可能不要使用在代碼中使用GoSuBasic使用GoSubGoSub<lable>語句可使代碼的執(zhí)行轉移至特定的標注,它與GoSubReturn語句使得代碼的執(zhí)行返回到GoSub語句后面這一行。GoSu語句使碼以閱讀調。隨著于程和驅的代碼出,GoSub就很少使用了。如果在編寫一個GoSub語句,問一問自己,要轉移到的代碼是否能夠在過程的內那么創(chuàng)建一個獨立的過程是個更好的解決辦法。GooGoo語句會使代碼難以理解,因為它們常常會以不直觀的方式改變執(zhí)行路徑。但是,如果要轉移到單個退出Goo語句是最好的。另外,通常還有比Goo語句更Goo語句在過程中返回執(zhí)行代碼(你會想到使用錯誤處理程序中的GooPROC_EXIT。當Goo語句返回執(zhí)行代碼時,有些標準循環(huán)構造常常是更好的解決方案。下面的代碼顯示出將帶有Goo語句的代碼編寫成DoPrivateFunctionStripDoubleQuotes(strStringAsString)As‘*Purpose:DoublequotescauseerrorsinSQL Thisprocedurestripsthemfromtheentered andrecesthemwithsingle‘*Accepts:strString-thestringinwhichtosearch double‘*Reurns:Theoriginalstringwithalldoublequotesre withsingleOnErrorGoToDimintLocationAsConstc_DoubleQuote=intLocation=InStr(strString,‘*DeterminewhetherornotadoublequotewasIfintLocation>0‘*Thereisatleastonedoublequote.Mid$(strString,intLocation,1)=“‘"GoToSTART_CHECKStripDoubleQuotes=EndExitCallShowError(Me.Name,“StripDoubleQuotes",Err.Number,_GoToEndPublicFunctionStripDoubleQuotes(ByValstrStringAsString)As‘*Purpose:DoublequotescauseerrorsinSQL Thisprocedurevttripsthemfromtheentered andrecesthemwithsingle‘*Accepts:strString-thevstringinwhichtosearch double‘*Returns:Theoriginalstringwithalldoublequotesre withsingleOnErrorGoToDimintLocation DimstrText AsStringDimblnQuotesFoundAsBooleanConstc_DoubleQuote=blnQuotesFound=‘*DeterminewhetherornotadoublequotewasintLocation=InStr(1,strString,‘*SeewhetheradoublequotewasIfintLocation>0Mid$(strString,intLocat
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年企業(yè)策劃辦公用品采購合同協(xié)議
- 2025年醫(yī)療器械設備年維護服務合同范例
- 2025年泳池水處理設備項目申請報告模板
- 2025年銷售合同范例寶典
- 2025年合作銷售利潤分配協(xié)議書模板
- 2025年微波等離子炬光譜儀項目立項申請報告模范
- 2025年協(xié)同輔導協(xié)議書
- 2025年個人信用質押合同樣式
- 2025年豪華游輪項目立項申請報告模板
- 2025年上海市電網建設與施工安全合作協(xié)議
- 海洋氣候預測模型創(chuàng)新研究-深度研究
- 2025年湖南工業(yè)職業(yè)技術學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 智能RPA財務機器人開發(fā)教程-基于來也UiBot 課件 第1章-機器人流程自動化概述
- 2024-2025學年天津市河東區(qū)高一上學期期末質量檢測數學試卷(含答案)
- 信永中和筆試題庫及答案
- 甲流乙流培訓課件
- 《視網膜靜脈阻塞》課件
- 2025《省建設工程檔案移交合同書(責任書)》
- 春季安全教育培訓課件
- 《大學英語1》期末考試試卷及答案(???
- 《石油鉆井基本知識》課件
評論
0/150
提交評論