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

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

2013-11-23 17:48:11  來源: Delphi編程 

   Delphi部件編程

   創建屬性

  屬性(Property)是部件中最特殊的部分主要因為部件用戶在設計時可以看見和操作它們並且在交互過程中能立即得到返回結果屬性也很重要因為如果將它們設計好後將使用戶更容易地使用自己維護起來也很容易

  為了使你在部件中更好地使用屬性本部分將介紹下列內容

  ● 為什麼要創建屬性

  ● 屬性的種類

  ● 公布(publishing)繼承的屬性

  ● 定義部件屬性

  ● 編寫屬性編輯器

   為什麼要創建屬性

  屬性提供非常重要的好處最明顯的好處是屬性在設計時能出現在Object Inspector窗口中這將簡化編程工作因為你只需讀用戶所賦的值而不要處理構造對象的參數

  從部件使用者的觀點看屬性象變量用戶可以給屬性賦值或讀值就好象屬性是對象的域

  從部件編寫者的觀點看屬性比對象的域有更強的功能

  ⑴ 用戶可以在設計時設置屬性

  這是非常重要的因為不象方法只能在運行時訪問屬性使用戶在運行程序之前就能定制部件通常你的部件不應包含很多的方法它們的功能可以通過屬性來實現

  ⑵ 屬性能隱藏詳細的實現細節

  ⑶ 屬性能引起簡單地賦值之外的響應如觸發事件

  ⑷ 用於屬性的實現方法可以是虛擬方法這樣看似簡單的屬性在不同的部件中將實現不同的功能

   屬性的類型

  屬性可以是函數能返回的任何類型因為屬性的實現可以使用函數所有的Pascal類型兼容性規則都適用屬性為屬性選擇類型的最重要的方面是不同的類型出現在Object Inspector窗口中的方式不同Object Inspector將按不同的類型決定其出現的方式

  你也能在注冊部件時描述不同的屬性編輯器

  下表列出屬性出現在Object Inspector窗口中的方式

  表 屬性出現在Object Inspector窗口中的方式

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

  屬性類型       處 理 方 式

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

  簡單類型   NumericCharacter和 String屬性出現在Object Inspector中用戶可以直接編輯

  枚舉類型 枚舉類型的屬性顯示值的方式定義在代碼中選擇時將出現下拉式列表框顯示所有的可能取值

  集合類型 集合類型出現在Object Inspector窗口中時正如一個集合展開後用戶通過將集合元素設為True或False來選擇

  對象類型 作為對象的屬性本身有屬性編輯器如果對象有自己的published屬性用戶在Object Inspector中通過展開對象屬性列可以獨立編輯它們對象類型的屬性必須從TPersistent繼承

  數組類型 數組屬性必須有它們自己的屬性編輯器Object Inspector沒有內嵌對數組屬性編輯的支持

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

   公布繼承的屬性

  所有部件都從祖先類型繼承屬性當你從已有部件繼承時新部件將繼承祖先類型的所有屬性如果你繼承的是抽象類則繼承的屬性是protected或public但不是published如想使用戶訪問protected或public屬性可以將該屬性重定義為published如果你使用TWinControl繼承它繼承了CtlD屬性但是protected的因此用戶在設計和運行時不能訪問CtlD通過在新部件中將CtlD重聲明為published就改變了CtlD的訪問級別下面的代碼演示如何將CtlD聲明為published使之在設計時可被訪問

  type

  TSampleComponent=class(TWinControl)

  published

  property CtlD;

  end;

   定義部件屬性

  ⑴ 屬性的聲明

  聲明部件的屬性你要描述

  ● 屬性名

  ● 屬性的類型

  ● 讀和設置屬性值的方法

  至少部件屬性應當定義在部件對象聲明的public部分這樣可以在運行時很方便地從外部訪問為了能在設計時編輯屬性應當將屬性在published部分聲明這樣屬性能自動顯示在Object Inspector窗口中下面是典型的屬性聲明

  type

  TYourComponent=class(TComponent)

  …

  private

  FCount: Integer { 內部存儲域 }

  function GetCount: Integer; { 讀方法 }

  procedure SetCount(ACount: Integer) { 寫方法 }

  pubilic

  property Count: Integer read GetCount write SetCount;

  end;

  ⑵ 內部數據存儲

  關於如何存儲屬性的數據值Delphi沒有特別的規定通常Delphi部件遵循下列規定

  ● 屬性數據存儲在對象的數據域處

  ● 屬性對象域的標識符以F開頭例如定義在TControl中的屬性FWidth

  ● 屬性數據的對象域應聲明在private部分

  後代部件只應使用繼承的屬性自身而不能直接訪問內部的數據存儲

  ⑶ 直接訪問

  使屬性數據可用的最簡單的辦法是直接訪問屬性聲明的read 和write部分描述了怎樣不通過調用訪問方法來給內部數據域賦值但一般都用read進行直接訪問而用write進行方法訪問以改變部件的狀態

  下面的部件聲明演示了怎樣在屬性定義的read 和write部分都采用直接訪問

  type

  TYourComponent=class(TComponent)

  …

  private { 內部存儲是私有 }

  FReadOnly: Boolean; { 聲明保存屬性值的域 }

  published { 使屬性在設計時可用 }

  property ReadOnly: Boolean read FReadOnly write FReadOnly;

  end;

  ⑷ 訪問方法

  屬性的聲明語法允許屬性聲明的read和write部分用訪問方法取代對象私有數據域不管屬性是如何實現它的read 和write部分方法實現應當是private後代部件只能使用繼承的屬性訪問

  ① 讀方法

  屬性的讀方法是不帶參數的函數並且返回同屬性相同類型的值通常讀函數的名字是Get後加屬性名例如屬性Count的讀方法是GetCount不帶參數的唯一例外是數組屬性如果你不定義read方法則屬性是只寫的

  ② 寫方法

  屬性的寫方法總是只帶一個參數的過程參數可以是引用或值通常過程名是Set加屬性名例如屬性Count的寫方法名是SetCount參數的值采用設置屬性的新值因此寫方法需要執行在內部存儲數據中寫的操作

  如果沒有聲明寫方法那麼屬性是只讀的

  通常在設置新值前要檢測新值是否與當前值不同

  下面是一個簡單的整數屬性Count的寫方法

  procedure TMyComponentSetCount( value: Integer)

  begin

  if value <>FCount then

  begin

  FCount := Value;

  update;

  end;

  end;

  ⑸ 缺省屬性值

  當聲明一個屬性能有選擇地聲明屬性的缺省值部件屬性的缺省值是部件構造方法中的屬性值集例如當從Component Palette選擇某部件置於窗體中時Delphi通過調用部件構造方法創建部件並決定部件屬性初始值

  Delphi使用聲明缺省值決定是否將屬性值存在DFM文件中如果不描述缺省值Delphi將總是保存該屬性值聲明缺省值的方法是在屬性聲明後加default指令再跟缺省值

  當重聲明一個屬性時能夠描述沒有缺省值的屬性如果繼承的屬性已有一個則設立沒有缺省值的屬性的方法是在屬性聲明後加nodefault指令如果是第一次聲明屬性則沒有必要加nodefault指令因為沒有default指令即表示如此

[]  []  []  []  


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