熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

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

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

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

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

unit Unit;
interface

uses
Windows Messages SysUtils Variants Classes Graphics Controls Forms
Dialogs StdCtrls shellApi;

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

var
Form: TForm;
implementation

uses CommonUni;

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

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

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

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

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

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

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

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

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

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

From:http://tw.wingwit.com/Article/program/Delphi/201311/24752.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.