⑸ 缺省属性值 当声明一个属性,能有选择地声明属性的缺省值。部件属性的缺省值是部件构造方法中的属性值集。例如,当从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中继承或从表中的任一属性编辑器中继承。 表19.4 属性编辑器的类型 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 类型 编辑的属性 ───────────────────────────────────── 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,你的属性编辑器也能继承了一系列的方法用于读和写不同类型的值。见下表: 表19.5 读写属性值的方法 ━━━━━━━━━━━━━━━━━━━━━━━━━━ 属性类型 "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 EPropertyError.Create (FmtloadStr(SOutOfRange, [MinValue,MaxValue])); SetOrdValue (L); end; ⑶ 将属性作为一个整体来编辑 Delphi支持提供用户以对话框的方式可视化地编辑属性。这种情况常用于对对象类型属性的编辑。一个典型的例子是Font属性,用户可以找开Font对话框来选择字体的属性。 提供整体属性编辑对话框,要覆盖属性编辑对象的Edit方法。Edit方法也使用"Get"和"Set"方法。 在大多数部件中使用的Color属性将标准的Windows颜色对话框作为属性编辑器。下面是TColorProperty的Edit方法 procedure TColorProperty.Edit var ColorDialog: TColorDialog; begin ColorDialog := TColorDialog.Create(Application); { 创建编辑器 } try ColorDialog.Color := GetOrdValue; { 使用已有的值 } if ColorDialog.Execute then SetOrdValue (ColorDialog.Color); finally ColorDialog.Free; end; end; ⑷ 描述编辑器的属性 属性编辑必须告诉Object Inspector窗口如何采用合适的显示工具。例如Object Inspector窗口需要知道属性是否有子属性,或者是否能显示可能取值的列表。描述编辑器的属性通常覆盖属性编辑器的GetAttributes方法。 GetAttributes返回TPropertyAttributes类型的集合。集合中包括表中任何或所有的值: 表19.6 属性编辑器特征标志 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 标志 含 义 相关方法 ────────────────────────────── paValuelist 编辑器能给予一组枚举值 GetValues paSubPropertie 属性有子属性 GetPropertises paDialog 编辑器能显示编辑对话框 Edit PaMultiSelect 当用户选择多于一个部件 时,属性应能显示 N/A ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Color属性是灵活的,它允许在Object Inspector窗口中以多种方式选择他们。或者键入,或者从列表中选择定编辑器。因此TColorProperty的GetAttributes方法在返回值中包含多种属性。 function TColorProperty.GetAttributes: TProrertyAttributes; begin Result := [PaMultiselect, paDialog, paValuelist]; end; ⑸ 注册属性编辑器 一旦创建属性编辑器,必须在Delphi中注册。注册属性编辑器时,要与某种属性相联。 调用RegisterPropertyEditor过程来注册属性编辑器。该过程接受四个参数: ● 要编辑的属性的类型信息的指针。这总是通过调用调用TypeInfo函数得到,如TypeInfo ( TMyComponent ) ● 编辑器应用的部件类型,如果该参数为nil则编辑器应用于所给的类型的所有属性 ● 属性名,该参数只有在前一参数描述了部件的情况下才可用 ● 使用该属性编辑器的属性的类型 下面引用了注册标准部件的过程: procedure Register; begin RegisterPropertyEditor (TypeInfo(TComponent), nil, TComponentProperty, RegisterPropertyEditor(TypeInfo(TComponentName), TComponent, 'Name', (ComponentNamePropety); RegisterPropertyEditor (TypeInfo(TMenuItem), TMenu, '', TMenuItemProperty); end;  
2/2 首页 上一页 1 2 |