、 內(nèi)部數(shù)據(jù)存儲
關于如何存儲屬性的數(shù)據(jù)值,Delphi沒有特別的規(guī)定,通常Delphi部件遵循下列規(guī)定:
● 屬性數(shù)據(jù)存儲在對象的數(shù)據(jù)域處
● 屬性對象域的標識符以F開頭,例如定義在TControl中的屬性FWidth
● 屬性數(shù)據(jù)的對象域應聲明在private部分
后代部件只應使用繼承的屬性自身,而不能直接訪問內(nèi)部的數(shù)據(jù)存儲。
、 直接訪問
使屬性數(shù)據(jù)可用的最簡單的辦法是直接訪問。屬性聲明的read 和write部分描述了怎樣不通過調用訪問方法來給內(nèi)部數(shù)據(jù)域賦值。但一般都用read進行直接訪問,而用write進行方法訪問,以改變部件的狀態(tài)。
下面的部件聲明演示了怎樣在屬性定義的read 和write部分都采用直接訪問:
type
TYourComponent=class(TComponent)
…
private { 內(nèi)部存儲是私有 }
FReadOnly: Boolean; { 聲明保存屬性值的域 }
published { 使屬性在設計時可用 }
property ReadOnly: Boolean read FReadOnly write FReadOnly;
end;
、 訪問方法
屬性的聲明語法允許屬性聲明的read和write部分用訪問方法取代對象私有數(shù)據(jù)域。不管屬性是如何實現(xiàn)它的read 和write部分,方法實現(xiàn)應當是private,后代部件只能使用繼承的屬性訪問。
、 讀方法
屬性的讀方法是不帶參數(shù)的函數(shù),并且返回同屬性相同類型的值。通常讀函數(shù)的名字是“Get”后加屬性名,例如,屬性Count的讀方法是GetCount。不帶參數(shù)的唯一例外是數(shù)組屬性。如果你不定義read方法,則屬性是只寫的。
、 寫方法
屬性的寫方法總是只帶一個參數(shù)的過程。參數(shù)可以是引用或值。通常過程名是 "Set"加屬性名。例如,屬性Count的寫方法名是SetCount。參數(shù)的值采用設置屬性的新值,因此,寫方法需要執(zhí)行在內(nèi)部存儲數(shù)據(jù)中寫的操作。
如果沒有聲明寫方法,那么屬性是只讀的。
通常在設置新值前要檢測新值是否與當前值不同。
下面是一個簡單的整數(shù)屬性Count的寫方法:
procedure TMyComponent.SetCount( value: Integer);
begin
if value <>FCount then
begin
FCount := Value;
update;
end;
end;
、 缺省屬性值
當聲明一個屬性,能有選擇地聲明屬性的缺省值。部件屬性的缺省值是部件構造方法中的屬性值集。例如,當從Component Palette選擇某部件置于窗體中時,Delphi通過調用部件構造方法創(chuàng)建部件,并決定部件屬性初始值。
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也支持通過編寫和注冊屬性編輯器的方法為屬性設計自己的編輯器?梢宰詫iT為自定義部件的屬性設計的編輯器,也可設計用于所有某類型的屬性。編寫屬性編輯器需要下列五個步驟:
● 繼承一個屬性編輯器對象
● 將屬性作為文本編輯
● 將屬性作為整體編輯
● 描述編輯器屬性
● 注冊屬性編輯器
、 繼承屬性編輯器對象
DsgnIntf庫單元中定義了幾種屬性編輯器。它們都是從TPropertyEditor繼承而來。當創(chuàng)建屬性編輯器時,可以直接從TPropertyEditor中繼承或從表中的任一屬性編輯器中繼承。
表19.4 屬性編輯器的類型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
類型 編輯的屬性
─────────────────────────────────────
TOrdinalProperty 所有有序的屬性(整數(shù)、字符、枚舉)
TIntegerProperty 所有整型,包括子界類型
TCharProperty 字符類型或字符子集
TEnumProperty 任何枚舉類型
TFloatProperty 所有浮點數(shù)
TStringProperty 字符串,包括定長的字符串
TSetElementProperty 集合中的獨立元素
TSetElementProperty 所有的集合,并不是直接編輯集合類型,而是展開成一列
集合元素屬性
TClassProperty 對象,顯示對象名,并允許對象屬性的展開
TMethodPropevty 方法指針,主要指事件
TComponentProperty 相同窗體中的部件,用戶不能編輯部件的屬性,
但能指向兼容的部件
TColorProperty 部件顏色,顯示顏色常量,否則顯示十六進制數(shù)
TFontNameProperty 字體名稱
TFontProperty 字體,允許展開字體的屬性或彈出字體對話框
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
下面是TFloatPropertyEditor的定義:
type
TFloatProperty=Class(TPropertyEditor)
public
function AllEqual: Boolean; override;
function GetValue: String; override;
procedure SetValue ( Const Value: string ); override;
end;
相關推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |