Subscribe

RSS Feed (xml)

Powered By

Skin Design:
Free Blogger Skins

Powered by Blogger

星期二, 8月 07, 2007

Delphi初學者應小心的六大陷阱

Delphi初學者應小心的六大陷阱2005-07-26 08:10 作者: 子夜編譯 出處: 天極網 責任編輯:方舟 天極軟體專題專區精選
Google專區 POPO專區 QQ專區
Flash MX 視頻教程 Photoshop視頻教程 網頁設計視頻教程
PowerPoint動畫演示教程 Excel動畫教程集 Word動畫演示教程
特洛伊木馬專區 駭客知識教程專區 註冊表應用專區
Windows API開發專區 網路程式設計專區 VB資料庫程式設計專區
圖像與多媒體程式設計

  初學DelphiI的人,由於各種原因,對DelphiI中的許多概念不能很好的理解,並由此帶來了許多的問題,或者是開發出的程式穩性不好,一會能運行,一會又不能運行;或者是遇到一個問題久思不得其解,還誤以為是DelphiI自身的BUG,等等這些,浪費了我們大量的時間、精力,也影響了我們的開發效率。

  那麼如何才能避免這些錯誤了,儘量少走彎路了?筆者從事DelphiI開發多年,下面就把我的經驗總結介紹給大家,希望幫助到初學DelphiI的朋友。

  問題一:對類的概念理解不到位,程式開發中不能靈活運用。請看下面的程式:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses CommonUni;

{$R *.dfm}

end.


  在DelphiI中新建一個程式,然後添加一個按鈕,就得到了下面這段程式。這應該是大家相當熟悉的一段程式,可也就是這段程式,讓許多的人在做開發很長時間後,還不能很好理解。 該程式可分為三個個部分:第一部分,單元頭(從起始位置到TYPE之前);第二部分(從TYPE到END的部分),定義了一個從Tform繼承過來的窗體類,它包含一個Tbuttton類型的成員。最後一部分(Var到結束的部分),定義了一個Tform1類型的變量。問題就出在這裡了,許多人誤以為這最後一段也是窗體類的一部分,在該窗體類中經常寫出這樣的代碼,Form1.caption = ’窗體標題’,導致程式運行時得不到所要的結果。其實最後一部分根本就屬於窗體類的定義,它們不過是在同一個UNIT中而已,所以代碼應該這樣寫:self.caption = ’窗體標題’;

  問題二:將釋放對象的代碼寫在窗體的CLOSE事件中,導致Access Violation…的錯誤。

  一個窗體的關閉(CLOSE)與窗體的析構(Destory),在系統處理上是有區別的,當一個窗體關閉時,窗體實際上只是隱藏起來了,它佔用的資源並未從記憶體中釋放了,我們還是可訪問到窗體中的數據;而當窗體響應DESTORY事件時,窗體不僅僅是隱藏起來了,而且佔用的系統資源也釋放出來了。因此,如果一個窗體關閉後,我們還想訪裏面的對象,就應該將這些對象的FREE代碼寫的窗體的(DESTORY)事件中。

  問題三:不加區別地使用String與shortString數據類型。

  String類型與shortString類型是有區別的,在默認的情況下(取決於$H開關),如果你將一個變量定義為string類型,那麼會被處理成一個ANSIString類型。這種類型是動態分配記憶體的,以NULL為結尾,最大長度為4G,而shortString的最大長度是不能超過255個字元的。由於ANSIstring是生存期自管理類型的數據,這意昧著這種類型的數據需要更多的系統開銷,所以在程式開發中,shortString能滿足要求的話,就儘量使用它,以提高程式的運行速度。

  問題四:進行數據類型轉換時處理不當,犯錯誤最多的就是字元型到數字/浮點型的轉換。

  當將一個字元型數據轉換為整型時,我們經常這樣寫 I := StrToInt(aEdit.Text); 表面上看這一句,沒有任何問題,函數的使用,格式的寫法,都是正確的。可有一種情況我們卻沒有考慮到,如果用戶在aEdit文字方塊中輸入的不是數字文本的話,會怎麼樣呢?調用還會成功嗎?顯然是不會的,系統肯定會彈出一個英文的錯誤,讓我們的用戶不知所措的。正確的寫法是:I := StrToIntDef(aEdit.Text, 0); 這樣當轉換不成功時,第二個參數就會賦給I。類似的函數還有strToInt64Def,StrToFloatDef等等。

  問題五:單元引用的問題。使用那個函數,就一定要引用函數所在的單元。

  比如在程式開發中我們要用到一個API函數ExtractIconEx(從程式或是文件中穫得一個圖示),那麼就一要在它的USES中把單元shellApi加入進來,否則是不能透過編譯了。類似的情況還有很多,我們常常使用幫助文檔,從中查找需要的函數,可當程式編譯時,卻通不過,為什麼呢?就是因為沒有在USES中引用函數所在的單元。這個問題初學者犯得最多,應該加倍注意。

  問題六:避免循環引用,盡可能透過第三個單元實現。如果確實不可避免,應在不同位置進行引用。所謂循環引用就是A單元引用了B單元,而反過來,B單元又引用了A單元,產生循環。我們還看上面的那一段程式,在interface的下面有一個USES語句,而在implementation的下面,又有一個USES語句。循環如果確實不可避免,那麼就應該在將A單元中的引用寫在第一個USES語句中,而將B單元中的引用寫在第二個USES語句中。

沒有留言: