下例是名为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 TSampleComponentCreate (AOwner: TComponent)
begin
inherited Create ( Aowner)
Fistvue := True; { 设置缺省值 }
end;
编写属性编辑器
Object Inspector提供所有类型属性的缺省编辑器Delphi也支持通过编写和注册属性编辑器的方法为属性设计自己的编辑器可以注册专门为自定义部件的属性设计的编辑器也可设计用于所有某类型的属性编写属性编辑器需要下列五个步骤
● 继承一个属性编辑器对象
● 将属性作为文本编辑
● 将属性作为整体编辑
● 描述编辑器属性
● 注册属性编辑器
⑴ 继承属性编辑器对象
DsgnIntf库单元中定义了几种属性编辑器它们都是从TPropertyEditor继承而来当创建属性编辑器时可以直接从TPropertyEditor中继承或从表中的任一属性编辑器中继承
表 属性编辑器的类型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
类型 编辑的属性
─────────────────────────────────────
TOrdinalProperty 所有有序的属性(整数字符枚举)
TIntegerProperty 所有整型包括子界类型
TCharProperty 字符类型或字符子集
TEnumProperty 任何枚举类型
TFloatProperty 所有浮点数
TStringProperty 字符串包括定长的字符串
TSetElementProperty 集合中的独立元素
TSetElementProperty 所有的集合并不是直接编辑集合类型而是展开成一列集合元素属性
TClassProperty 对象显示对象名并允许对象属性的展开
TMethodPropevty 方法指针主要指事件
TComponentProperty 相同窗体中的部件用户不能编辑部件的属性但能指向兼容的部件
TColorProperty 部件颜色显示颜色常量否则显示十六进制数
TFontNameProperty 字体名称
TFontProperty 字体允许展开字体的属性或弹出字体对话框
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
下面是TFloatPropertyEditor的定义
type
TFloatProperty=Class(TPropertyEditor)
public
function AllEqual: Boolean; override;
function GetValue: String; override;
procedure SetValue ( Const Value: string ) override;
end;
⑵ 象文本一样编辑属性
所有的属性都需要将它们的值在Object Inspector窗口中以文本的方式显示属性编辑器对象提供了文本表现和实际值之间转换的虚方法这些虚方法是GetValue和SetValue你的属性编辑器也能继承了一系列的方法用于读和写不同类型的值见下表
表 读写属性值的方法
━━━━━━━━━━━━━━━━━━━━━━━━━━
属性类型 Get方法 Set方法
──────────────────────────
浮点数 GetFloatValue SetFloatVallue
方法指针 GetMethodValue SetMehodValue
有序类型 GetOrdValue SetOrdValue
字符串 GetStrValue SetStrValue
━━━━━━━━━━━━━━━━━━━━━━━━━━
当覆盖GetValue方法时调用一个Get方法当覆盖SetValue方法时调用一个Set方法
属性编辑器的GetValue方法返回一个字符串以表现当前属性值缺省情况下GetValue返回unknown
属性编辑器的SetValue接收Object Inspector窗口String类型的参数并将其转换成合适的类型并设置属性值
下面是TIntegerProperty的GetValue和SetValue的例子
function TIntegerProperty GetValue: string;
begin
Result := IntToStr (GetOrdValue)
end;
proceduve TIntegerPropertySetValue (Const Value: string)
var
L: Longint;
begin
L := StrToInt(Value) { 将字符串转换为数学 }
with GetTypeData (GetPropType)^ do
if ( L < Minvalue ) or ( L > MaxValue ) then
Raise EPropertyErrorCreate (FmtloadStr(SOutOfRange
[MinValueMaxValue]))
SetOrdValue (L)
end;
⑶ 将属性作为一个整体来编辑
Delphi支持提供用户以对话框的方式可视化地编辑属性这种情况常用于对对象类型属性的编辑一个典型的例子是Font属性用户可以找开Font对话框来选择字体的属性
提供整体属性编辑对话框要覆盖属性编辑对象的Edit方法Edit方法也使用Get和Set方法
在大多数部件中使用的Color属性将标准的Windows颜色对话框作为属性编辑器下面是TColorProperty的Edit方法
procedure TColorPropertyEdit
var
ColorDialog: TColorDialog;
begin
ColorDialog := TColorDialogCreate(Application) { 创建编辑器 }
try
ColorDialogColor := GetOrdValue; { 使用已有的值 }
if ColorDialogExecute then
SetOrdValue (ColorDialogColor)
finally
ColorDialogFree;
end;
end;
⑷ 描述编辑器的属性
属性编辑必须告诉Object Inspector窗口如何采用合适的显示工具例如Object Inspector窗口需要知道属性是否有子属性或者是否能显示可能取值的列表描述编辑器的属性通常覆盖属性编辑器的GetAttributes方法
GetAttributes返回TPropertyAttributes类型的集合集合中包括表中任何或所有的值
表 属性编辑器特征标志
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
标志 含 义 相关方法
──────────────────────────────
paValuelist 编辑器能给予一组枚举值 GetValues
paSubPropertie 属性有子属性 GetPropertises
paDialog 编辑器能显示编辑对话框 Edit
PaMultiSelect 当用户选择多于一个部件时属性应能显示 N/A
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[] [] [] []