初學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
類型的變量
問題就出在這裡了
許多人誤以為這最後一段也是窗體類的一部分
在該窗體類中經常寫出這樣的代碼
Form
caption =
窗體標題
導致程序運行時得不到所要的結果
其實最後一部分根本就屬於窗體類的定義
它們不過是在同一個UNIT中而已
所以代碼應該這樣寫
self
caption =
窗體標題
問題二
將釋放對象的代碼寫在窗體的CLOSE事件中
導致Access Violation…的錯誤
一個窗體的關閉(CLOSE)與窗體的析構(Destory)
在系統處理上是有區別的
當一個窗體關閉時
窗體實際上只是隱藏起來了
它占用的資源並未從內存中釋放了
我們還是可訪問到窗體中的數據
而當窗體響應DESTORY事件時
窗體不僅僅是隱藏起來了
而且占用的系統資源也釋放出來了
因此
如果一個窗體關閉後
我們還想訪裡面的對象
就應該將這些對象的FREE代碼寫的窗體的(DESTORY)事件中
問題三
不加區別地使用String與shortString數據類型
String類型與shortString類型是有區別的
在默認的情況下(取決於$H開關)
如果你將一個變量定義為string類型
那麼會被處理成一個ANSIString類型
這種類型是動態分配內存的
以NULL為結尾
最大長度為
G
而shortString的最大長度是不能超過
個字符的
由於ANSIstring是生存期自管理類型的數據
這意昧著這種類型的數據需要更多的系統開銷
所以在程序開發中
shortString能滿足要求的話
就盡量使用它
以提高程序的運行速度
問題四
進行數據類型轉換時處理不當
犯錯誤最多的就是字符型到數字/浮點型的轉換
當將一個字符型數據轉換為整型時
我們經常這樣寫 I := StrToInt(aEdit
Text); 表面上看這一句
沒有任何問題
函數的使用
格式的寫法
都是正確的
可有一種情況我們卻沒有考慮到
如果用戶在aEdit文本框中輸入的不是數字文本的話
會怎麼樣呢?調用還會成功嗎?顯然是不會的
系統肯定會彈出一個英文的錯誤
讓我們的用戶不知所措的
正確的寫法是
I := StrToIntDef(aEdit
Text
); 這樣當轉換不成功時
第二個參數就會賦給I
類似的函數還有strToInt
Def
StrToFloatDef等等
問題五
單元引用的問題
使用那個函數
就一定要引用函數所在的單元
比如在程序開發中我們要用到一個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