感覺篇
NO.1瞞天過海
為了讓用戶感覺到應用程序執行很快,我們可以利用定時器事件在後台“悄悄”執行一些任務。在一些連續性的操作(比如向導)中,用戶可能會因為浏覽提示信息等緣故而不會立即對應用程序作出響應。這時我們可以用一個靜態變量或全局變量來跟蹤運行過程,一旦定時器空閒就進行一小部分工作(如加載數據)。如果能保證每次的工作量都很少,那麼用戶不會感到應用程序的應答有什麼影響,相反他會發現後續工作將會完成得很快。
NO.2趁火打劫
在應用程序中可能會多次從磁盤中提取數據,這時我們可以盡可能一次多加載數據,只要這些數據不是太大,用戶就不會感到過多的延遲。但由於減少了磁盤操作的次數,用戶會感到應用程序的總體速度較快。
NO.3順手牽羊
可以在Windows啟動時先運行一個小的實用程序來預加載VB應用程序所需的動態鏈接庫,如Msvbvm50.dll等。這樣,由於windows動態鏈接庫的唯一性,應用程序啟動時就能跳過加載這些文件的步驟,使啟動時間大大縮短.
NO.4暗渡陳倉
當應用程序的主窗體包含較多數據時,它的啟動就會顯得非常慢。這時我們可以設計一個簡潔的窗體來顯示諸如版權之類的信息,'而顯示這個窗體的同時則在後台用Load方法將主窗體調人內存,之後將版權窗體卸載並用Show方法顯示主窗體,從而讓用戶誤以為主窗體一下子就調出來了。
NO.5金蟬脫殼
在應用程序中一些窗體會反復出現,這樣我們在不需要時用Hide方法隱藏而不是用UnLoad卸出內存,這樣做的優點是再用到該窗體時可以立刻顯示出來而不是延遲一段時間、
NO.6美人計
一個Windows應用程序的成功在很大程度上取決於用戶界面的優劣,今年很流行的WinAmp就是不很典型的例子。關於優化界面的方法,有調整控件位置,保持無素一致、簡化界面等
速度篇
NO.7調虎離山
當控件的某一屬性需反復引用時,我們可以把它緩存到某一變量中以加快速度:
L=picture1.top
forI=0to15
image(I).top=L-1
nextI
NO.8釜底抽薪
由於Windows的圖形特性,圖形及其它操作的顯示速度在很大程度上決定了應用程序的感覺速度,因此在窗體互相重疊的時候應盡量不使用ClipControls和AutoRedraw,設置控件屬性時應隱藏控件,以免多次重畫,還有用Line代替Pset等等。
NO.9李代桃僵
盡管過程調用使代碼具有模塊化風格而更易維護,但對於速度要求嚴格的場合,過程調用會增加額外的操作和處理時間,尤其是當調用處於循環體內時,我們就有必要變過程調用為代碼內嵌,以犧牲維護性的代價換取寶貴的速度。
NO.10連環計
速度的優化不只是某一單方面的事,比如折半查找的算法效率就比順序查找高。但要是循環體采用Variant變量作計數器則會大大降低執行速度,因此最佳的方案是折半查找加Long整型變量作計數器。
NO.11上屋抽梯
在應用程序中可能會有一些對象或變量已經完成任務卻仍占據內存資源,這裡提倡一種上屋抽梯、過河折橋的方法卸載對象或變量:setObjest=Nothing
同樣的,使用動態數組並在使用完畢後回收內存資源也能達到相同的效果。
NO.12反客為主
由於VB采用事件驅動,因此應用程序的操作總是靠用戶或系統的響應來激發的,但對於一些總是要執行的操作我們可以主動產生一些事件,以在應用程序空閒時合理的利用系統資源。
大小篇
NO.13偷梁換柱
有時候我們僅僅是為了顯示圖形和文字,但卻使用了圖片框和文本框,實際上圖像框和標簽在這種場合能很好地代替前二者,且大大節省內存。
NO.14樹上開花
這裡講的是一種借局布勢的方法,即當我們需要很多相同的控件和窗體時可以使用控件數組和Forms集合。控件數組通過賦予多個同類控件相同的Name屬性及相應的Index屬性得到,而Forms集合則通過使用New關鍵字獲得。二者的引用方法分別為Object(n)和Forms(n)。
NO.15走為上
隨著工程的日漸龐大,代碼中難免會出現一些死代碼和無用的變量及常數,VB在編譯時會自動刪除無用的常數,但死代碼和無用的變量仍然會被編譯到.exe文件中。這不但會占用寶貴的內存資源,而且會降低執行效率甚至導致應用程序的崩潰,因此把死代碼和無用變量請“走”是一個很好的習慣。
NO.16假癡不癫
雖然功能齊全是件令人稱道的事,但重復的建設和為了一些很少用到的功能而耗費大量代碼和空間無疑是一種浪費,就好比Win95的任務條上已有一個時鐘,你卻非在應用程序中再加一個一樣沒有多大意義,另一個例子就是WPS97雖然沒有Word功能多卻非常受歡迎。其實軟件同硬件一樣:電腦,電腦,夠用就好!
NO.17假道伐虢
盡管我們可以自己編寫代碼來完成諸如繪圖。表格處理之類的工作,但若這些功能在應用程序中不占重要位置時,可以考慮通過OLE或者DDE的方法調用畫圖、寫字板、Excel之類的現有程序來完成工作,既節省代碼又節省空間。
NO.18無中生有
VB5提供了一種新的編程模式,即利用多個工程同時工作,這樣我們可以將應用程序分段,雖然內存裡沒有多少代碼,但需要某項功能時可以將這個ActiveX控件隨時調人內存使用。合理地利用系統資源。
數據篇
NO.19隔岸觀火
在進行數據庫操作時往往涉及到數據的檢索,可以用Find-First、FindNext及Seek等方法來完成任務,但最簡單也是最有效的方法,是給足查詢條件並用類似英語的結構化查詢語言SQL來完成這個工作,SQL由MicrosoftJet支持,其語法和ANSISQL基本一致:
SELECT字段名FROM表名WHERE條件
其中“字段名”可包括多項值,“條件”項則可使用“And”、“Or”、“<”、“=”、“Like”等邏輯
比較操作符。一旦按照語法編寫了SQL語句,即可將其提交給Data控件的Recordset對象,並由Jet引擎處理,
從而返回查詢結果,以輕松實現組合查詢。
NO.20空城計
隨著NC、NetPC及低價PC的日益流行,網絡中的客戶機配置可能會越來越簡單,因此把大量的數據庫及其操作放在客戶機上是不太合適的,可以把控件同遠程服務器上的數據庫進行綁定。這樣,雖然客戶機上只存在一丁點兒數據,但用戶需要的任何數據庫功能都可通過服務器實現,並且由於數據存放集中而更加容易管理。
NO.21聲東擊西
在設計關系數據庫軟件並希望兩個數據庫表關聯時,可以采用VB提供的DBListBox和DBComboBox控件,利用它們能使兩個表協調變更。當然,兩個表必須有一個類型相同的字段以確定其關系。這兩個控件均具有以下五個特殊屬性:
DataSource被綁定的Data控件名稱。
DataField由DataSource屬性指定的記錄集的字段名稱,它用來決定列表中什麼元素被突出顯示。當作了新選擇後,移動到一條新記錄時該字段被更新。
RowSource將用於填充列表的Data控件的名稱。
Boundcolumn由RowSource屬性指定的記錄集中的字段名稱,它必須與用來更新列表的DataField字段類型相同。
ListField用來填充列表的由RowSource指定的記錄集中的字段名。
通過設置以上五個屬性,我們可以輕松實現主副關系數據庫應用程序的構造,當然我們也可以不用這兩個控件而用代碼來實現,其事例可以通過使用數據窗體向導而得到。
NO.22借屍還魂
也許用戶會希望應用程序有Undo功能,“事務”正是實現恢復數據庫更改的工具,VB5通過以下三個方法支持事務功能:BeginTrans開始一個新事務CommitTrans確認所作的更改Rollbac撤消所作的更改
事務功能可以嵌套,典型的例子如下:
DimTablelAsRecordset
‘定義表變量
Dimwork1AsWorkspace
‘定義工作空間
DimWork2AsWorkspace
SetTablel=Datap.Recordset
SetWork1=workspace(0)
SetWork2=Workspace(1)
Work1.BeginTrans
……'一系列改變
Work2.BeginTrans'撤消變更
……'一系列改變
Work1.CommitTrans確認變更
NO.23遠交近攻
設計基於SQLServer的窗體時應考慮到網絡的帶寬:應用程序向服務器申請的數據越多網絡就越易塞車,因此,設計窗體時應在用戶有明確要求或確實需要時才向服務器申請數據和功能:
①用過濾器或SQL查詢限制記錄集記錄數。
②只在服務器上查詢窗體實際用到的字段。
③盡量少使用綁定控件,因為它們會獨立向服務器遞交查詢。
④對始終不變的數據應盡量保存在本地'Jet數據庫以加速查詢。
⑤對於很難改變的數據,在服務器和本地機上同時保存,僅在其改變時才下載。
NO.24圍魏救趙
有些memo字段和長二進制格式(OLE對象)字段並不常用,可以在用戶要求顯示時才把它調人內存,這樣可以大大降低內存負擔。
調試篇
NO.25擒賊擒王
調試包含除錯和優化,而優化必須找准方向。比如速度對游戲至關重要,而Internet下載型軟件則著重大小,所以找准方向,找對地方往往能事半功倍。優化速度應盡量優化循環體,因為循環體的執行速度差會成倍影響應用程序,同理,對於經常調用的過程和函數也是如此。
NO.26欲擒故縱
測試應用程序和處理等價於VB運行錯誤的具體條件時,進行錯誤模擬是非常有用的。模擬錯誤的格式為:
Object.Raiseargumentlist
例如下面的語句模擬“磁盤未准備好”的錯誤:
Err.RaiseNumber:71
NO.27以逸待勞
無論我們寫的程序有多麼優秀,實際運行中的錯誤我們仍然無法預料。設置錯誤捕捉是個以逸代勞的做法。一旦錯誤被捕獲,我們就可以調用例程進行處理:
subA()
onErrorGotoCheckErr
……
ExitSub
CheckErr:
……
Endsub
NO.28關門捉賊
當應用程序變得龐大後,僅對整個工程進行表面測試難以保證可靠性。因此,對於一些可能會出錯的過程和函數應單獨測試,滿足其調用條件井檢查返回結果,這對於發現錯誤尤其是非運行錯誤和非語法錯誤(如計算錯誤)大有幫助。
NO.29借刀殺人
對一個頻繁使用的變量或對象逐步跟蹤無疑是個龐大的工程,好在VB5提供了監視表達式,利用它可隨時監視變量或對象,並在滿足指定條件時中斷運行。通過“調試”菜單中的“添加監視表達式”可獲得這一功能。
NO.30打草驚蛇
為避免變量重名我們會使用一些長變量名,但這樣很容易造成變量名拼寫錯誤。這時我們可以在“選項”對話框中確認“要求變量聲明”.如此VB就會自動在其後的每個模塊中添加“OptionExplicit”,從而在運行程序時,VB一旦發現拼寫錯的變量名,而錯的名字又未定義時,就會告訴你“變量沒有定義”,並把光標停在該處。當然,這樣做要注意兩點:一是最好一開始時就選擇“要求變量聲明”,二是用到的變量都必須先聲明(當然,這是個好習慣)。
雜談篇
NO.31混水摸魚
坐井觀天往往不會有什麼好成就,要跟上10倍速時代必須時刻注視新技術。網上有很多ActiveX控件,融合了很多流行技術,可以去“摸”幾個,至於地址可在《電腦愛好者》上找到一些。
NO.32拋磚引玉
對於VBFAN,要想“燒”出水平必須和別人相互交流,往往你解決不了的難題恰好是別人的拿手菜,而你自以為的高招卻不如別人的優秀……
NO.33反間計
將彼之技用於我技,看看別人的程序是怎樣寫的,特別是VB的范例,相當一部分“賊棒”。
NO.34揩桑罵槐
有時想讓用戶注意某處而用戶偏偏視而不見,可以用高亮、鮮艷的色彩甚至聲音來提醒他們:“注意了,這裡有問題!”
NO.35笑裡藏刀
友好的提示總是更能博得喜愛,用戶並不需知道那些晦澀的技術細節,他們只需要知道發生了什麼事情,該怎麼辦。像“C盤xxxx扇區嚴重損壞,重試?放棄?失敗?”就比“存儲數據時C盤出錯,改存到其它驅動器嗎?”要令人討厭。
NO.36苦肉計
計計歸來,計計匯總,想要提高VB5應用水平,勤學苦練必不可少,因此說,“VB5三十六計,勤奮是上策”。->