當前位置:編程學習大全網 - 行動軟體 - Delphi面向對象的編程方法(七)

Delphi面向對象的編程方法(七)

  程序庫單元的初始化部分 

? 初始化當前庫單元所使用的數據 或是通過interface部分將數據提供給其他應用程序 庫單元使用時 您可以在庫單元中加入壹個initialization部分 在庫單元的end前加上您的初始化語句 當壹個應用程序使用壹個庫單元時 在庫單元中的initialization部分會先於其他的代碼執行 如果壹個應用程序使用了多個庫單元 則每壹個庫單元的初始化部分都會在所有的程序代碼前執行

  使用Delphi的可視化部件及其庫單元 

當您在窗體中加入可視化部件時 如果該部件在可視化部件庫中 Delphi會在您的庫單元的interface部分的uses子句中自動加上需要使用的庫單元名稱 但有些對象在Delphi的環境中並沒有可視化部件存在 例如 您想在庫單元中加入壹個預定義的信息框 則您必須把MsgDlg庫單元加入您的uses子句中 如果您要使用TPrinter對象的話 必須將Printer庫單元加入uses子句中 在在線幫助中可以查到對象所屬的預定義庫單元

?要使用在其他庫單元中說明的函數 應在函數的前面加上這壹庫單元的名稱 並用 號隔開 例如 要在Unit 中使用Unit 中說明的Calculate函數 應使用下面的方法

 Number := Unit Calculate( );

?您可以在任何標識符如屬性 常量 變量 數據類型 函數等之前加上庫單元的名稱 您可以在自由地在任何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 Button Click(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自動產生的事件處理過程名稱會自動改為TColorBox Button Click 但您自行編寫的實現部分的代碼卻不會被自動修改 因此 如果您在改變Name屬性前編寫了程序 則您必須將事件處理過程中的對象名稱進行改變 所以 原先的Form Color要改為ColorBox Color

  從壹個對象中繼承數據和方法 

 前面的TForm 類型是很簡單的 因為它只含有域Button 和方法Button Click 但是在這個窗體上 您可以改變窗體的大小 加入或刪除窗體的最大最小化按鈕 或設置這個窗體為MDI界面 對於壹個只包含壹個域和方法的對象來講 您並沒有看到顯式的支持程序 在窗體上單擊鼠標或用Object Inspector的上端的Object Selector選中Form 對象 按動F 查閱它的在線幫助 您會在Properties和Method中找到它的繼承到的全部屬性和方法 這些是在TForm類型中說明的 TForm 是TForm的子類 直接繼承了它所有的域 方法 屬性和事件 例如窗體的顏色屬性Color就是在TForm中說明的 當您在工程中加入壹個新窗體時 就等於加入了壹個基本模型 通過不斷地在窗體中加入部件 您就自行定義了壹個新的窗體 要自定義任何對象 您都將從已經存在的對象中繼承域和方法 建立壹個該種對象的子類 例如對象TForm 就被說明為對象TForm的子類 擁有壹個窗體部件的基本屬性或方法 只有當您在窗體中加入了部件或編寫了事件處理過程時 Form 才成為您自己的類型

?壹個比較特殊的對象是從壹個範圍較廣或較壹般的對象中繼承下來的 它是這個特別對象的祖先 這個對象則稱為祖先的後代 壹個對象只能有壹個直接的祖先 但是它可以有許多後代 TForm是TForm 類型的祖先 所有的窗體對象都是TForm的後代

用F 查閱窗體的在線幫助時 您會發現TForm被稱為ponent(部件) 這是因為所有的部件都是對象

?在這個結構中所有的部件都是對象 部件類型TComponent從TObject類型中繼承數據和程序代碼 並具有額外的可以用作特殊用途的屬性 方法 事件 所以部件可以直接和用戶打交道 記錄它的狀態並存貯到文件中等等 控制類型TControl從TComponent中繼承而來 又增加了新的功能 如它可以顯示壹個對象 在上圖中 雖然TCheckBox不是直接由TObject繼承來的 但是它仍然有任何對象所擁有的屬性 因為在VCL結構中 TCheckBox終究還是從TObject 中繼承了所有功能的特殊對象 但它還有些自行定義的獨到的功能 如可以選擇記錄狀態等

  對象的範圍 

  關於對象的範圍 

?壹個對象的範圍決定了它的數據域 屬性值 方法的活動範圍和訪問範圍 在壹個對象的說明部分說明的數據域 屬性值 方法都只是在這個對象的範圍中 而且只有這個對象和它的後代才能擁有它們 雖然這些方法的實際程序代碼可能是在這個對象之外的程序庫單元中 但這些方法仍然在這個對象的範圍內 因為它們是在這個對象的說明部分中說明的

?當您在壹個對象的事件處理過程中編寫程序代碼來訪問這個對象的屬性值 方法或域時 您不需要在這些標識符之前加上這個對象變量的名稱 例如 如果您在壹個新窗體上加入壹個按鈕和壹個編輯框 並為這個按鈕編寫OnClick事件處理過程

 procedure TForm Button Click(Sender:Tobject);  begin  Color :=clFuchsia;  Edit Color :=clLime;  end;

?其中的第壹行語句是為整個窗體Form 著色 您也可以編寫如下 Form Color :=clFuchsia; 

?但您可以不必加上Form 因為Button Click方法是在TForm 對象的範圍裏 當您在壹個對象的範圍中時 您可以省略所有這個對象中的屬性值 方法 域之前的對象標識符 但是當您編寫第二個語句改變編輯框的底色時 因為此時您想訪問的是TEdit 對象的Color屬性 而不是TForm 類型的 所以您需要通過在屬性前面加上編輯框的名稱來指明Color屬性值的範圍 如果不指明 Delphi會象第壹個語句壹樣 將窗體的顏色變成綠色 因為Edit 部件是在窗體中的 它是窗體的壹個數據域 所以您同樣不必指明其從屬關系

如果Edit 是在其他窗體中 那麽您需要在編輯框之前加上這個船體對象的名稱了 例如 如果Edit 是在Form 之中 那它是Form 說明的壹個數據域 並位於Form 的範圍中 那麽您需要將第二句改為

 Form Edit Color := clLime; 

 而且需要把Unit 加入Unit 的uses子句中

lishixinzhi/Article/program/Delphi/201311/24965

  • 上一篇:唐英明在歷史上存在嗎?
  • 下一篇:手繪海報字體怎麽寫好看?pup怎麽寫字好看
  • copyright 2024編程學習大全網