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

DELPHI基礎教程:Delphi自定義部件開發(一)[3]

2022-06-13   來源: Delphi編程 

   按需要給部件的其它屬性賦值

  假設你想測試名為TNewComponent類型的新部件庫單元名為NewTest窗體庫單元應該是這樣的

  unit Unitl;

  interface

  uses SysUtils Windows Messages Classes Grophics Controls Forms Dialogs

  Newtest;

  type

  Tforml = class(TForm)

  procedure FormCreate(Sender: TObject)

  private

  { private申 明 }

  public

  { public申 明 }

  NewComponent: TNewComponent;

  end;

  var

  Forml: TForml;

  implementation

  {$R *DFM }

  procedure TFormlFormCreate ( Sender: TObject ) ;

  begin

  NewComponent := TNewComponentCreate ( Self )

  NewCompanentParent := Self;

  NewCompanentLeft := ;

  end;

  end

   編寫部件的面向對象技術

  部件使用者在Delphi環境中開發將遇到在包含數據和方法的對象他們將在設計階段和運行階段操作對象而編寫部件將比他們需要更多的關於對象的知識因此你應當熟悉Delphi的面向對象的程序設計

   建立部件

  部件用戶和部件編寫者最基本的區別是用戶處理對象的實例而編寫者創建新的對象類型這個概念是面向對象程序設計的基礎例如用戶創建了一個包含兩個按鈕的窗體一個標為OK另一個標為Cancel每個都是TButton的實例通過給Textdefault和Cancel等屬性賦不同的值給OnClick事件賦予不同的處理過程用戶產生了兩個不同的實例

  建立新部件一般有兩個理由

  ● 改變類型的缺省情況避免反復

  ● 為部件增加新的功能

  目的都是為了建立可重用對象如果從將來重用的角度預先計劃和設計能節省一大堆將來的工作

  在程序設計中避免不必要的重復是很重要的如果發現在代碼中一遍又一遍重寫相同的行就應當考慮將代碼放在子過程或函數中或干脆建立一個函數庫

  設計部件也是這個道理如果總是改變相同的屬性或相同的方法調用那應創建新部件

  創建新部件的另一個原因是想給已有的部件增加新的功能你可以從已有部件直接繼承(如ListBox)或從抽象對象類型繼承(如TComponentTControl)你雖然能為部件增加新功能但不能將原有部件的屬性移走如果要這樣做的話就從該父對象的祖先對象繼承

   控制部件的訪向

  Object Pascal語言為對象的各部分提供了四個級別的訪問控制訪問控制讓你定義什麼代碼能訪問對象的哪一部分通過描述訪問級別定義了部件的接口如果合理安排接口將提高部件的可用性和重用性

  除非特地描述否則加在對象裡的域方法和屬性的控制級別是published這意味著任何代碼可以訪問整個對象

  下表列出各保護級別

  表 對象定義中的保護級別

  ━━━━━━━━━━━━━━━━━━━

  保護級       用處

  ───────────────────

  private 隱藏實現細節

  protected     定義開發者接口

  public 定義運行時接口

  published 定義設計時接口

  ━━━━━━━━━━━━━━━━━━━

  所有的保護級都在單元級起作用如果對象的某一部分在庫單元中的一處可訪向則在該庫單元任意處都可訪向

  ⑴ 隱藏實現細節

  如果對象的某部分被聲明為private將使其它庫單元的代碼無法訪問該部分但包含聲明的庫單元中的代碼可以訪問就好象訪問public一樣這是和C++不同的

  對象類型的private部分對於隱藏詳細實現是很重要的既然對象的用戶不能訪問private部分你就能改變對象的實現而不影響用戶代碼

  下面是一個演示防止用戶訪問private域的例子

  unit HideInfo;

  interface

  uses SysUtils WinTypes WinProcs Messages Classes Graphics Controls Forms

  Dialogs;

  type

  TSecretForm = class(TForm) { 聲明新的窗體窗口 }

  procedure FormCreate(Sender: TObject)

  private { declare private part }

  FSecretCode: Integer; { 聲明private域 }

  end;

  var

  SecretForm: TSecretForm;

  implementation

  procedure TSecretFormFormCreate(Sender: TObject)

  begin

  FSecretCode := ;

  end;

  end

  unit TestHide; { 這是主窗體庫單元 }

  interface

  uses SysUtils WinTypes WinProcs Messages Classes Graphics Controls Forms

  Dialogs HideInfo; { 使用帶TSecretForm聲明的庫單元 }

  type

  TTestForm = class(TForm)

  procedure FormCreate(Sender: TObject)

  end;

  var

  TestForm: TTestForm;

  implementation

  procedure TTestFormFormCreate(Sender: TObject)

  begin

  SecretFormFSecretCode := ; {編譯過程將以Field identifier expected錯誤停止}

  end;

  end

  ⑵ 定義開發者接口

  將對象某部分聲明為protected可使在包含該部件聲明的庫單元之外的代碼無法訪問就象private部分protected部分的不同之處是某對象繼承該對象則包含新對象的庫單元可以訪問protected部分你能使用protected聲明定義開發者的接口也就是說對象的用戶不能訪向protected部分但開發者通過繼承就可能做到這意味著你能通過protected部分的可訪問性使部件編寫者改變對象工作方式而又不使用戶見到這些細節

  ⑶ 定義運行時接口

  將對象的某一部分定義為public可使任何代碼訪問該部分如果你沒有對域方法或屬性加以privateprotectedpublic的訪問控制描述那麼該部分就是published

  因為對象的public部分可在運行時為任何代碼訪問因此對象的public部分被稱為運行接口運行時接口對那些在設計時沒有意義的項目如依靠運行時信息的和只讀的屬性是很有用的那些設計用來供用戶調用的方法也應放在運行時接口中

[]  []  []  []  


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