程序庫單元的初始化部分
初始化當前庫單元所使用的數據或是通過interface部分將數據提供給其他應用程序庫單元使用時您可以在庫單元中加入一個initialization部分在庫單元的end前加上您的初始化語句當一個應用程序使用一個庫單元時在庫單元中的initialization部分會先於其他的代碼執行如果一個應用程序使用了多個庫單元則每一個庫單元的初始化部分都會在所有的程序代碼前執行
使用Delphi的可視化部件及其庫單元
當您在窗體中加入可視化部件時如果該部件在可視化部件庫中Delphi會在您的庫單元的interface部分的uses子句中自動加上需要使用的庫單元名稱但有些對象在Delphi的環境中並沒有可視化部件存在例如您想在庫單元中加入一個預定義的信息框則您必須把MsgDlg庫單元加入您的uses子句中如果您要使用TPrinter對象的話必須將Printer庫單元加入uses子句中在在線幫助中可以查到對象所屬的預定義庫單元
要使用在其他庫單元中說明的函數應在函數的前面加上這一庫單元的名稱並用號隔開例如要在Unit中使用Unit中說明的Calculate函數應使用下面的方法
Number := UnitCalculate();
您可以在任何標識符如屬性常量變量數據類型函數等之前加上庫單元的名稱您可以在自由地在任何Delphi庫單元中加入程序代碼但不要改變由Delphi生成的程序
建立與窗體無關的新庫單元
如果您想在工程中建立一個和任何窗體無關的新庫單元可以現選用File|New Unit這時一個新的庫單元加入了工程新庫單元的代碼如下
unit Unit;
interface
implementation
end
Delphi將根據您的工程中的文件數目為您的庫單元選擇名稱您可以在程序骨架間加入您的程序代碼
當編譯您的工程時這個新加入的庫單元會被編譯為一個具有DCU後綴的文件這個新生成的文件是鏈接到工程的可執行文件上的機器代碼
將庫單元加入工程
將庫單元加入工程是比較簡單的無論是您自己建立的庫單元還是Delphi建立的與窗體有關的庫單元如果已經完成則先打開您想加入庫單元的工程(可以用Open Project打開工程)再選用File|Open File然後選擇您想加入的源程序(PAS文件)並選擇OK即可則庫單元被加入到應用程序中
用Delphi的對象進行編程
Delphi是基於面向對象編程的先進開發環境面向對象的程序設計(OOP)是結構化語言的自然延伸OOP的先進編程方法會產生一個清晰而又容易擴展及維護的程序一旦您為您的程序建立了一個對象您和其他的程序員可以在其他的程序中使用這個對象完全不必重新編制繁復的代碼對象的重復使用可以大大地節省開發時間切實地提高您和其他人的工作效率
什麼是對象
一個對象是一個數據類型對象就象記錄一樣是一種數據結構按最簡單的理解我們可以將對象理解成一個記錄但實際上對象是一種定義不確切的術語它常用來定義抽象的事務是構成應用程序的項目其內涵遠比記錄要豐富在本書中對象可被理解為可視化部件如按鈕標簽表等
了解對象最關鍵的是掌握對象的特性一個對象其最突出的特征有三個封裝性繼承性多態性
對象的封裝性
對對象最基本的理解是把數據和代碼組合在同一個結構中這就是對象的封裝特性將對象的數據域封閉在對象的內部使得外部程序必需而且只能使用正確的方法才能對要讀寫的數據域進行訪問封裝性意味著數據和代碼一起出現在同一結構中如果需要的話可以在數據周圍砌上圍牆只有用對象類的方法才能在圍牆上打開缺口
對象的繼承性
繼承性的含義直接而且顯然它是指把一個新的對象定義成為已存在對象的後代新對象繼承了舊類的一切東西在往新對象中添加任何新內容以前父類的每一個字段和方法都已存在於子類中父類是創建子類的基石
對象的多態性
多態性是在對象體系中把設想和實現分開的手段如果說繼承性是系統的布局手段多態性就是其功能實現的方法多態性意味著某種概括的動作可以由特定的方式來實現這取決於執行該動作的對象多態性允許以類似的方式處理類體系中類似的對象根據特定的任務一個應用程序被分解成許多對象多態性把高級設計處理的設想如新對象的創建對象在屏幕上的重顯程序運行的其它抽象描述等留給知道該如何完美的處理它們的對象去實現
通過Delphi實例了解對象
讓我們結合Delphi的實例討論對象的概念:
當您要建立一個新工程時Delphi 將顯示一個窗體作為設計的基礎在程序編輯器中Delphi將這個窗體說明為一個新的對象類型並同時在與窗體相關聯的庫單元中生成了創建這個新窗體對象的程序代碼
unit Unit;
interface
uses SysUtils Windows Messages Classes Graphics Controls Forms Dialogs;
type
TForm = class(TForm) {窗體的類型說明開始}
private{ Private declarations }
public{ Public declarations }
end; {窗體的類型說明結束}
var
Form: TForm; {說明一個窗體變量}
implementation
{$R *DFM}
end
新的窗體類型是TForm它是從TForm繼承下來的一個對象它具有對象的特征含有域或方法由於您未給窗體加入任何部件所以它只有從TForm類中繼承的域和方法在窗體對象的類型說明中您是看不到任何域方法的說明的Form稱為TForm類型的實例(instance)您可以說明多個對象類型的實例例如在多文檔界面(MDI)中管理多個子窗口時就要進行這樣的說明每一個實例都有自己的說明但所有的實例卻共用相同的代碼
假設您向窗體中加入了一個按鈕部件並對這個按鈕建立了一個OnClick事件處理過程再查看Unit的源程序會發現TForm的類型說明部分如下
type
TForm = class(TForm)
Button: TButton;
procedure ButtonClick(Sender: TObject);
private{ Private declarations }
public{ Public declarations }
end;
現在TForm對象有了一個名為Button的域它是您在窗體中加入的按鈕TButton是一個對象類型Button是Tbutton的一個實例它被TForm對象所包含作為它的數據域每當您在窗體中加入一個部件時部件的名稱就會作為TFom的域加入到類型說明中來在Delphi中您所編寫的事件處理過程都是窗體對象的方法每當您建立一個事件處理過程就會在窗體的對象類型中說明一個方法
當您使用Object Inspector來改變對象(部件)的名稱時這個名稱的改變會反映到程序中例如在Object Inspector中將Form的Name屬性命名為ColorBox您會發現在類型說明部分會將前文的TForm改為
TColorBox=class(TForm);
並且在變量說明部分會說明ColorBox為TColorBox類型的變量由Delphi自動產生的事件處理過程名稱會自動改為TColorBoxButtonClick但您自行編寫的實現部分的代碼卻不會被自動修改因此如果您在改變Name屬性前編寫了程序則您必須將事件處理過程中的對象名稱進行改變所以原先的FormColor要改為ColorBoxColor
從一個對象中繼承數據和方法
前面的TForm類型是很簡單的因為它只含有域Button和方法ButtonClick但是在這個窗體上您可以改變窗體的大小加入或刪除窗體的最大最小化按鈕或設置這個窗體為MDI界面對於一個只包含一個域和方法的對象來講您並沒有看到顯式的支持程序在窗體上單擊鼠標或用Object Inspector的上端的Object Selector選中Form對象按動F查閱它的在線幫助您會在Properties和Method中找到它的繼承到的全部屬性和方法這些是在TForm類型中說明的TForm是TForm的子類直接繼承了它所有的域方法屬性和事件例如窗體的顏色屬性Color就是在TForm中說明的當您在工程中加入一個新窗體時就等於加入了一個基本模型通過不斷地在窗體中加入部件您就自行定義了一個新的窗體要自定義任何對象您都將從已經存在的對象中繼承域和方法建立一個該種對象的子類例如對象TForm就被說明為對象TForm的子類擁有一個窗體部件的基本屬性或方法只有當您在窗體中加入了部件或編寫了事件處理過程時Form才成為您自己的類型
一個比較特殊的對象是從一個范圍較廣或較一般的對象中繼承下來的它是這個特別對象的祖先這個對象則稱為祖先的後代一個對象只能有一個直接的祖先但是它可以有許多後代TForm是TForm類型的祖先所有的窗體對象都是TForm的後代
用F查閱窗體的在線幫助時您會發現TForm被稱為component(部件)這是因為所有的部件都是對象
在這個結構中所有的部件都是對象部件類型TComponent從TObject類型中繼承數據和程序代碼並具有額外的可以用作特殊用途的屬性方法事件所以部件可以直接和用戶打交道記錄它的狀態並存貯到文件中等等控制類型TControl從TComponent中繼承而來又增加了新的功能如它可以顯示一個對象在上圖中雖然TCheckBox不是直接由TObject繼承來的但是它仍然有任何對象所擁有的屬性因為在VCL結構中TCheckBox終究還是從TObject 中繼承了所有功能的特殊對象但它還有些自行定義的獨到的功能如可以選擇記錄狀態等
對象的范圍
關於對象的范圍
一個對象的范圍決定了它的數據域屬性值方法的活動范圍和訪問范圍在一個對象的說明部分說明的數據域屬性值方法都只是在這個對象的范圍中而且只有這個對象和它的後代才能擁有它們雖然這些方法的實際程序代碼可能是在這個對象之外的程序庫單元中但這些方法仍然在這個對象的范圍內因為它們是在這個對象的說明部分中說明的
當您在一個對象的事件處理過程中編寫程序代碼來訪問這個對象的屬性值方法或域時您不需要在這些標識符之前加上這個對象變量的名稱例如如果您在一個新窗體上加入一個按鈕和一個編輯框並為這個按鈕編寫OnClick事件處理過程
procedure TFormButtonClick(Sender:Tobject);
begin
Color :=clFuchsia;
EditColor :=clLime;
end;
其中的第一行語句是為整個窗體Form著色您也可以編寫如下
FormColor :=clFuchsia;
但您可以不必加上Form因為ButtonClick方法是在TForm對象的范圍裡當您在一個對象的范圍中時您可以省略所有這個對象中的屬性值方法域之前的對象標識符但是當您編寫第二個語句改變編輯框的底色時因為此時您想訪問的是TEdit對象的Color屬性而不是TForm類型的所以您需要通過在屬性前面加上編輯框的名稱來指明Color屬性值的范圍如果不指明Delphi會象第一個語句一樣將窗體的顏色變成綠色因為Edit部件是在窗體中的它是窗體的一個數據域所以您同樣不必指明其從屬關系
如果Edit是在其他窗體中那麼您需要在編輯框之前加上這個船體對象的名稱了例如如果Edit是在Form之中那它是Form說明的一個數據域並位於Form的范圍中那麼您需要將第二句改為
FormEditColor := clLime;
而且需要把Unit加入Unit的uses子句中
一個對象的范圍擴展到這個對象的所有後代TForm的所有屬性值方法和事件都在TForm的范圍中因為TForm是TForm的後代您的應用程序不能說明和祖先的數據域重名的類型變量等如果Delphi顯示了一個標識符被重復定義的信息就有可能是一個數據域和其祖先對象(例如TForm)的一個數據域有了相同的名稱可以嘗試改變這個標識符的名稱
From:http://tw.wingwit.com/Article/program/Delphi/201311/24965.html