人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

第109章 Delphi自定義部件開發(二)

第109章 Delphi自定義部件開發(二)

更新時間:2022-07-09 文章作者:未知 信息來源:網絡 閱讀次數:

19.2.2 Delphi部件編程 

  19.2.2.1 創建屬性 

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

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

  ● 為什么要創建屬性

   ● 屬性的種類

  ● 公布(publishing)繼承的屬性

   ● 定義部件屬性

   ● 編寫屬性編輯器 

  1. 為什么要創建屬性

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

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

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

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

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

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

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

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

  2. 屬性的類型

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

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

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

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

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

  屬性類型       處 理 方 式

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

  簡單類型   Numeric、Character和 String屬性出現在Object Inspector中,用戶可

  以直接編輯

  枚舉類型 枚舉類型的屬性顯示值的方式定義在代碼中。選擇時將出現下拉  

  式列表框,顯示所有的可能取值。

  集合類型 集合類型出現在Object Inspector窗口中時正如一個集合,展開后,用         

  戶通過將集合元素設為True或False來選擇。

  對象類型 作為對象的屬性本身有屬性編輯器,如果對象有自己的published屬

  性,用戶在Object Inspector中通過展開對象屬性列,可以獨立編輯它們,

  對象類型的屬性必須從TPersistent繼承。

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

  組屬性編輯的支持! 

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

  3. 公布繼承的屬性

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

  type

  TSampleComponent=class(TWinControl)

  published

  property Ctl3D;

  end;  

  4. 定義部件屬性

 、 屬性的聲明

  聲明部件的屬性,你要描述:

  ● 屬性名

   ● 屬性的類型

  ● 讀和設置屬性值的方法 

  至少,部件屬性應當定義在部件對象聲明的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 TMyComponent.SetCount( value: Integer);

  begin

  if value <>FCount then

  begin

  FCount := Value;

  update;

  end;

  end;  

 、 缺省屬性值

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

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

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

  下例是名為IsTrue的布爾類型屬性設置缺省值True的過程: 

  type

  TSampleComponent=class(TComponent)

  private

  FIsaTrue: Boolean;

  pubilic

  constructor Create (AOwner: TComponent); Overvide;

  published

  property Istrue: Boolean read FIsTrue write FIsTrue default True;

  end;  

  constructor TSampleComponent.Create (AOwner: TComponent);

  begin

  inherited Create ( Aowner);

  Fistvue := True; { 設置缺省值 }

  end;  

  5. 編寫屬性編輯器

  Object Inspector提供所有類型屬性的缺省編輯器,Delphi也支持通過編寫和注冊屬性編輯器的方法為屬性設計自己的編輯器。可以注冊專門為自定義部件的屬性設計的編輯器,也可設計用于所有某類型的屬性。編寫屬性編輯器需要下列五個步驟:

  ● 繼承一個屬性編輯器對象

  ● 將屬性作為文本編輯

   ● 將屬性作為整體編輯

  ● 描述編輯器屬性

  ● 注冊屬性編輯器 

 、 繼承屬性編輯器對象

  DsgnIntf庫單元中定義了幾種屬性編輯器。它們都是從TPropertyEditor繼承而來。當創建屬性編輯器時,可以直接從TPropertyEditor中繼承或從表中的任一屬性編輯器中繼承。 

[1] [2] [3] [4]  下一頁

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 来凤县| 卓尼县| 正定县| 沙坪坝区| 古浪县| 梧州市| 河北省| 嘉兴市| 全南县| 邢台市| 北川| 柳江县| 威远县| 新乡县| 屏南县| 内丘县| 石台县| 特克斯县| 大冶市| 建平县| 常德市| 邯郸市| 翁源县| 三河市| 乐安县| 兴安县| 永川市| 鄯善县| 锡林浩特市| 改则县| 阿拉善左旗| 灌云县| 耒阳市| 瑞丽市| 墨脱县| 绍兴县| 高雄市| 衡阳县| 阿勒泰市| 红安县| 碌曲县|