love fish大鵬一曰同風(fēng)起,扶搖直上九萬(wàn)里

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          friends

          link

          最新評(píng)論

          Delphi初學(xué)者應(yīng)小心的六大陷阱(轉(zhuǎn))

          初學(xué)DelphiI的人,由于各種原因,對(duì)DelphiI中的許多概念不能很好的理解,并由此帶來(lái)了許多的問(wèn)題,或者是開(kāi)發(fā)出的程序穩(wěn)性不好,一會(huì)能運(yùn)行,一會(huì)又不能運(yùn)行;或者是遇到一個(gè)問(wèn)題久思不得其解,還誤以為是DelphiI自身的BUG,等等這些,浪費(fèi)了我們大量的時(shí)間、精力,也影響了我們的開(kāi)發(fā)效率。
            
            那么如何才能避免這些錯(cuò)誤了,盡量少走彎路了?筆者從事DelphiI開(kāi)發(fā)多年,下面就把我的經(jīng)驗(yàn)總結(jié)介紹給大家,希望幫助到初學(xué)DelphiI的朋友。
            
            問(wèn)題一:對(duì)類(lèi)的概念理解不到位,程序開(kāi)發(fā)中不能靈活運(yùn)用。請(qǐng)看下面的程序:
            
            unit Unit1;
            interface
            
            uses
            Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
            Dialogs, StdCtrls, shellApi;
            
            type
            TForm1 = class(TForm)
            Button1: TButton;
            private
            { Private declarations }
            public
            { Public declarations }
            end;
            
            var
            Form1: TForm1;
            implementation
            
            uses CommonUni;
            
            
            在DelphiI中新建一個(gè)程序,然后添加一個(gè)按鈕,就得到了下面這段程序。這應(yīng)該是大家相當(dāng)熟悉的一段程序,可也就是這段程序,讓許多的人在做開(kāi)發(fā)很長(zhǎng)時(shí)間后,還不能很好理解。 該程序可分為三個(gè)個(gè)部分:第一部分,單元頭(從起始位置到TYPE之前);第二部分(從TYPE到END的部分),定義了一個(gè)從Tform繼承過(guò)來(lái)的窗體類(lèi),它包含一個(gè)Tbuttton類(lèi)型的成員。最后一部分(Var到結(jié)束的部分),定義了一個(gè)Tform1類(lèi)型的變量。問(wèn)題就出在這里了,許多人誤以為這最后一段也是窗體類(lèi)的一部分,在該窗體類(lèi)中經(jīng)常寫(xiě)出這樣的代碼,F(xiàn)orm1.caption = ’窗體標(biāo)題’,導(dǎo)致程序運(yùn)行時(shí)得不到所要的結(jié)果。其實(shí)最后一部分根本就屬于窗體類(lèi)的定義,它們不過(guò)是在同一個(gè)UNIT中而已,所以代碼應(yīng)該這樣寫(xiě):self.caption = ’窗體標(biāo)題’;
            
            問(wèn)題二:將釋放對(duì)象的代碼寫(xiě)在窗體的CLOSE事件中,導(dǎo)致Access Violation…的錯(cuò)誤。
            
            一個(gè)窗體的關(guān)閉(CLOSE)與窗體的析構(gòu)(Destory),在系統(tǒng)處理上是有區(qū)別的,當(dāng)一個(gè)窗體關(guān)閉時(shí),窗體實(shí)際上只是隱藏起來(lái)了,它占用的資源并未從內(nèi)存中釋放了,我們還是可訪(fǎng)問(wèn)到窗體中的數(shù)據(jù);而當(dāng)窗體響應(yīng)DESTORY事件時(shí),窗體不僅僅是隱藏起來(lái)了,而且占用的系統(tǒng)資源也釋放出來(lái)了。因此,如果一個(gè)窗體關(guān)閉后,我們還想訪(fǎng)里面的對(duì)象,就應(yīng)該將這些對(duì)象的FREE代碼寫(xiě)的窗體的(DESTORY)事件中。
            
            問(wèn)題三:不加區(qū)別地使用String與shortString數(shù)據(jù)類(lèi)型。
            
            String類(lèi)型與shortString類(lèi)型是有區(qū)別的,在默認(rèn)的情況下(取決于$H開(kāi)關(guān)),如果你將一個(gè)變量定義為string類(lèi)型,那么會(huì)被處理成一個(gè)ANSIString類(lèi)型。這種類(lèi)型是動(dòng)態(tài)分配內(nèi)存的,以NULL為結(jié)尾,最大長(zhǎng)度為4G,而shortString的最大長(zhǎng)度是不能超過(guò)255個(gè)字符的。由于ANSIstring是生存期自管理類(lèi)型的數(shù)據(jù),這意昧著這種類(lèi)型的數(shù)據(jù)需要更多的系統(tǒng)開(kāi)銷(xiāo),所以在程序開(kāi)發(fā)中,shortString能滿(mǎn)足要求的話(huà),就盡量使用它,以提高程序的運(yùn)行速度。
            
            問(wèn)題四:進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換時(shí)處理不當(dāng),犯錯(cuò)誤最多的就是字符型到數(shù)字/浮點(diǎn)型的轉(zhuǎn)換。
            
            當(dāng)將一個(gè)字符型數(shù)據(jù)轉(zhuǎn)換為整型時(shí),我們經(jīng)常這樣寫(xiě) I := StrToInt(aEdit.Text); 表面上看這一句,沒(méi)有任何問(wèn)題,函數(shù)的使用,格式的寫(xiě)法,都是正確的。可有一種情況我們卻沒(méi)有考慮到,如果用戶(hù)在aEdit文本框中輸入的不是數(shù)字文本的話(huà),會(huì)怎么樣呢?調(diào)用還會(huì)成功嗎?顯然是不會(huì)的,系統(tǒng)肯定會(huì)彈出一個(gè)英文的錯(cuò)誤,讓我們的用戶(hù)不知所措的。正確的寫(xiě)法是:I := StrToIntDef(aEdit.Text, 0); 這樣當(dāng)轉(zhuǎn)換不成功時(shí),第二個(gè)參數(shù)就會(huì)賦給I。類(lèi)似的函數(shù)還有strToInt64Def,StrToFloatDef等等。
            
            問(wèn)題五:?jiǎn)卧玫膯?wèn)題。使用那個(gè)函數(shù),就一定要引用函數(shù)所在的單元。
            
            比如在程序開(kāi)發(fā)中我們要用到一個(gè)API函數(shù)ExtractIconEx(從程序或是文件中獲得一個(gè)圖標(biāo)),那么就一要在它的USES中把單元shellApi加入進(jìn)來(lái),否則是不能通過(guò)編譯了。類(lèi)似的情況還有很多,我們常常使用幫助文檔,從中查找需要的函數(shù),可當(dāng)程序編譯時(shí),卻通不過(guò),為什么呢?就是因?yàn)闆](méi)有在USES中引用函數(shù)所在的單元。這個(gè)問(wèn)題初學(xué)者犯得最多,應(yīng)該加倍注意。
            
            問(wèn)題六:避免循環(huán)引用,盡可能通過(guò)第三個(gè)單元實(shí)現(xiàn)。如果確實(shí)不可避免,應(yīng)在不同位置進(jìn)行引用。所謂循環(huán)引用就是A單元引用了B單元,而反過(guò)來(lái),B單元又引用了A單元,產(chǎn)生循環(huán)。我們還看上面的那一段程序,在interface的下面有一個(gè)USES語(yǔ)句,而在implementation的下面,又有一個(gè)USES語(yǔ)句。循環(huán)如果確實(shí)不可避免,那么就應(yīng)該在將A單元中的引用寫(xiě)在第一個(gè)USES語(yǔ)句中,而將B單元中的引用寫(xiě)在第二個(gè)USES語(yǔ)句中。

          posted on 2006-08-30 10:09 liaojiyong 閱讀(280) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Delphi

          主站蜘蛛池模板: 分宜县| 德兴市| 琼结县| 泰和县| 瓦房店市| 巴林左旗| 衡东县| 稷山县| 安多县| 濉溪县| 诏安县| 延川县| 西贡区| 沙河市| 苏尼特左旗| 若羌县| 酉阳| 舟曲县| 凤庆县| 丰镇市| 峨边| 台中县| 拉萨市| 开江县| 临颍县| 永年县| 独山县| 三门峡市| 永济市| 浦北县| 都昌县| 天水市| 江门市| 香河县| 靖安县| 绵竹市| 佛学| 桦川县| 成武县| 清涧县| 新绛县|