Delphi提供了开放的API是程序员可以增强Delphi IDE的功能共有种开放工具的APIs:属性编辑器控件编辑器专家/导航和版本控制系统本文讨论属性编辑器和控件编辑器给出的例子说明如何写自己的Delphi属性控件编辑器
属性编辑器 属性编辑器是Delphi IDE的扩展这听起来非常复杂和困难但是实际上是很简单的我们可以为枚举类型构造一个属性编辑器记得TForm的颜色属性吗?当我们想改变它的值看到了下拉框中列出了所有的可选值那就是枚举类型的属性编辑器我们也同样能做到只需要几行代码没什么特别的注意到程序员并没有写一个属性编辑器而是通知Delphi使用枚举类型的属性编辑器为它的枚举特别定义的 现有的属性编辑器 在我们搞清楚属性编辑器到底内部是什么之前先看看Delphi中已有的开始一个新工程在implementation中加入"uses DsgnIntf;"编译打开browser查找TPropertyEditor(只要输入TPrope): 如果没算错的话在DSGNINTF中注册了至少个客户属性编辑器(custom property editors)注意事实上还有更多的属性编辑器在其他单元中例如C:\DELPHI\LIB\PICEDITDCU中的TPictureEditor TPropertyEditor 对象察看器为所有的属性提供缺省的编辑我们可以使用不同的方法重载这种行为来使用特别的属性编辑器(种预制的属性编辑器都扩充了对象察看器来处理其属性)那么究竟是怎样工作的呢?它是起源一个基类我们必需重载已达到我们的目的五个新的Delphi 的方法其中三个是变量相关的在编译开关{$IFDEF WIN}中一保证一下代码在所有的delphi版本中适用 TypeTPropertyEditor = classprotectedfunction GetPropInfo: PPropInfo;function GetFloatValue: Extended;function GetFloatValueAt(Index: Integer): Extended;function GetMethodValue: TMethod;function GetMethodValueAt(Index: Integer): TMethod;function GetOrdValue: Longint;function GetOrdValueAt(Index: Integer): Longint;function GetStrValue: string;function GetStrValueAt(Index: Integer): string;{$IFDEF WIN}function GetVarValue: variant;function GetVarValueAt(Index: Integer): variant;{$ENDIF}procedure Modified;procedure SetFloatValue(Value: Extended);procedure SetMethodValue(const Value: TMethod);procedure SetOrdValue(Value: Longint);procedure SetStrValue(const Value: string);{$IFDEF WIN}procedure SetVarValue(const Value: variant);{$ENDIF} publicdestructor Destroy; override; procedure Activate; virtual;function AllEqual: Boolean; virtual;procedure Edit; virtual;function GetAttributes: TPropertyAttributes; virtual;function GetComponent(Index: Integer): TComponent;function GetEditLimit: Integer; virtual;function GetName: string; virtual;procedure GetProperties(Proc: TGetPropEditProc); virtual;function GetPropType: PTypeInfo;function GetValue: string; virtual;procedure GetValues(Proc: TGetStrProc); virtual;procedure Initialize; virtual;{$IFDEF WIN}procedure Revert;{$ENDIF}procedure SetValue(const Value: string); virtual;{$IFDEF WIN}procedure ValueAvailable: Boolean;{$ENDIF} property Designer: TFormDesigner read FDesigner;property PrivateDirectory: string read GetPrivateDirectory;property PropCount: Integer read FPropCount;property Value: string read GetValue write SetValue;end; TPropertyEditor编辑对象察看器中一个或是一串控件的一个属性属性编辑器根据属性的类型而被创建由RegisterPropertyEditor注册的类型决定稍候有一个指示程序员如何使用这些工程的例子所有的published属性都将出现在对象察看器中当设计者进行读写属性的值时其属性编辑器(为这种属性类型的)将被使用 <P |