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