*本文涉及的所有代碼均在WinNt 4、Delphi4 C/S下正確運(yùn)行通過。 由于Delphi采用了真正的完全面向?qū)ο蠓椒ā?dāng)今世界最快的編譯器以及領(lǐng)先的數(shù)據(jù)庫技術(shù),特別是她對Windows API的完全兼容,出色的代碼自動生成能力……人們已經(jīng)看到,在短短的幾年當(dāng)中,Delphi已在眾多的開發(fā)工具中脫穎而出!正是Delphi的諸多優(yōu)秀品質(zhì),使程序員能在很短的時間內(nèi)開發(fā)出極具專業(yè)水準(zhǔn)的運(yùn)用軟件,而所做的工作卻是相當(dāng)?shù)纳伲?BR>正所謂Let's us make better!我們應(yīng)怎樣充分利用Delphi的優(yōu)勢來更加快速地進(jìn)行程序設(shè)計程序呢? 一、充分利用代碼完全共享(句檳): 我們這樣做的目的不僅僅是為了“偷懶”,這也是優(yōu)化程序代碼的一種方法。當(dāng)然,首先要考慮的是能不能共享(這很簡單,看看是否包含在該事件的下拉集合中),其次是要注意的是共享后有沒有“麻煩”,因為正確是第一步,在保證正確的情況下才有必要去追求優(yōu)化! 比如:我們在用戶刪除數(shù)據(jù)前給出一確認(rèn)消息: PRocedure TForm1.Table1BeforeDelete(DataSet: TDataSet); begin //確認(rèn)刪除記錄 if MessageBox(handle,'確實(shí)要刪除當(dāng)前記錄嗎?','確認(rèn)',MB_IconQuestion+MB_YesNo)=IDNO then Abort; end; 那么,你只要愿意讓用戶在刪除數(shù)據(jù)記錄前進(jìn)行確認(rèn)均可在TDataSet.BeforeDelete事件(Table2的BeforeDelete,Table3的BeforeDelete……)中完全共享這段代碼。好運(yùn)不會天天有,在有的時候就不這么直接、簡單了……
二、充分利用Delphi的強(qiáng)制轉(zhuǎn)換: “As”這個單詞不僅僅在英語中用處極大,在Delphi中亦然!當(dāng)我們想為數(shù)個“同類”組件共享代碼時,即可發(fā)揮她的巨大作用:我們只需為其中一個組件編寫代碼即可。 比如:想讓一組文本編輯框在得到輸入焦點(diǎn)時背景顏色變?yōu)椴枭ソ裹c(diǎn)是恢復(fù)系統(tǒng)顏色,我們可以如此共享代碼(讓每個文本編輯框的事件公用以下代碼): procedure TForm1.Edit1Enter(Sender: TObject); begin (Sender as TEdit).color:=ClTeal; //得到輸入焦點(diǎn) end;
procedure TForm1.Edit1Exit(Sender: TObject); begin (Sender as TEdit).color:=ClWindow; //失去輸入焦點(diǎn) end;
三、不起眼的Tag屬性: 上面的例子似乎有點(diǎn)太特殊了,萬一我只對其中某些組件特別關(guān)照怎么辦?仍以上面的為例,比如其中有兩個文本輸入框需要輸入數(shù)字,為引用戶注意,得到焦點(diǎn)時顏色變?yōu)樘m色,但我仍然然不想為每個組件分別寫代碼。 要解決這個問題可利用組件的Tag屬性,先為要特別處理的組件分配非零、不等的Tag(必須說明的Delphi不會檢查Tag值是否相等,設(shè)計時自己掌握);然后如下編寫代碼,就可依然實(shí)現(xiàn)共享: procedure TForm1.Edit1Enter(Sender: TObject); begin case (Sender as TEdit).Tag of 10,20:(Sender as TEdit).Color:=clBlue //輸入數(shù)字的文本框 else (Sender as TEdit).Color:=clTeal; //其余文本框 end; end;
五、能偷懶時就偷懶: 這個話題本不應(yīng)該寫在這里,但還是忍不住…… 1、能利用對象觀察器直接設(shè)置且不會影響程序正常運(yùn)行的就沒有必要去寫代碼: 由于這個話題涉及面太廣,此處僅舉一例說明:比如要在Delphi4中實(shí)現(xiàn)在狀態(tài)欄上的自動提示,又沒有太“苛 刻”的條件時,我們沒有必要再像以前一樣,先定義一個過程(ShowMyHint(...)),然后在程序初始化的地方 把她賦值給Tapplication的OnHin事件。因為只需將狀態(tài)條的AutoHint屬性設(shè)為True即可!當(dāng)然,她似乎只能在 第一個Panel上顯示(這就是沒有太“苛刻”的條件時)。當(dāng)然,怪我羅嗦,有的朋友居然不知道Delphi的Hint 屬性由兩部分組成,此處不是說話之地,感興趣請到筆者的個人主頁上去遛遛www.zg169.net/~delphiok(剛開 張,東西還不多)。 2、節(jié)省代碼: 能夠少寫代碼就沒有必要多寫代碼,能夠精煉就不要冗余: 比如,以下的兩段代碼實(shí)現(xiàn)的功能完全相同,你喜歡用哪段? 代碼段一: if ToolButton1.Down=true then begin Dbgrid1.show; DelBtn.Enabled:=true; end else begin Dbgrid1.Hide; DelBtn.Enabled:=false; end; 代碼段二: Dbgrid1.Visible:=ToolButton1.Down; DelBtn.Enabled:=ToolButton1.Down; 因此,我們寫完程序后,不要僅僅追求程序調(diào)通,不妨也給程序代碼炸炸油。 3、節(jié)省變量: 有的程序員在不需要變量的地方定義了變量,在需要變量的地方定義了多余的變量,我個人認(rèn)為這都不是好的 習(xí)慣,特別是動不動就定義全局變量更是值得商榷。有的讀者可能認(rèn)為我是一個守財奴,現(xiàn)在的處理器速度都 什么年代了……但我只簡單的給你展示一段代碼你就明白了: procedure TForm1.Button1Click(Sender: TObject); Var s1,s2:String; begin s1:=Inputbox('數(shù)據(jù)','請輸入用戶姓名','); if s1<>' then begin Btn_Name.Enabled:=True; s2:=Inputbox('數(shù)據(jù)','請輸入用戶住址','); if s2<>' then Btn_Adress.Enabled:=True; end; end;