我要投稿
  • 您当前的位置:365bet官方 -> 技术教程 -> 软件开发教程 -> Delphi教程 -> 教程内容
  • [ 收藏本页教程 ]
  • 属性和控件编辑器Delphi教程

    教程作者:佚名    教程来源:不详   教程栏目:Delphi教程    收藏本页
     
    Delphi提供了开放的API,是程序员可以增强Delphi IDE的功能。共有4种开放工具的APIs:属性编辑器、控件编辑器、专家/导航和版本控制系统。本文讨论属性编辑器和控件编辑器,给出的例子说明如何写自己的Delphi属性、控件编辑器。

    属性编辑器
    属性编辑器是Delphi IDE的扩展。这听起来非常复杂和困难,但是实际上是很简单的。我们可以为枚举类型构造一个属性编辑器。记得TForm的颜色属性吗?当我们想改变它的值,看到了下拉框中列出了所有的可选值。那就是枚举类型的属性编辑器,我们也同样能做到,只需要几行代码,没什么特别的。注意到程序员并没有写一个属性编辑器,而是通知Delphi使用枚举类型的属性编辑器,为它的枚举特别定义的。

    现有的属性编辑器

    在我们搞清楚属性编辑器到底内部是什么之前,先看看Delphi中已有的。开始一个新工程,在implementation中加入"uses DsgnIntf;"编译,打开browser查找TPropertyEditor(只要输入TPrope):

    Object Browser

    如果没算错的话,在DSGNINTF中注册了至少21个客户属性编辑器(custom property editors),注意:事实上,还有更多的属性编辑器在其他单元中,例如C:\DELPHI\LIB\PICEDIT.DCU.中的TPictureEditor。

    TPropertyEditor

    对象察看器为所有的属性提供缺省的编辑。我们可以使用不同的方法重载这种行为,来使用特别的属性编辑器(21种预制的属性编辑器都扩充了对象察看器来处理其属性)。那么,究竟是怎样工作的呢?它是起源一个基类,我们必需重载已达到我们的目的。五个新的Delphi 2.0的方法-其中三个是变量相关的-在编译开关{$IFDEF WIN32}中一保证一下代码在所有的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 WIN32}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 WIN32}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 WIN32}procedure Revert;{$ENDIF}procedure SetValue(const Value: string); virtual;{$IFDEF WIN32}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属性都将出现在对象察看器中,当设计者进行读写属性的值时,其属性编辑器(为这种属性类型的)将被使用。

    在以下的时间里,我们将只注意方法中的需要被重载的重要部分,属性编辑器的行为。

    GetAttributes

    这是最重要的方法,他决定了属性编辑器的类型和行为。有三种属性编辑器(除了缺省的编辑框):下拉框(我们在前面提到过的),分属性列表和对话框。
    GetAttributes返回TPropertyAttributes类型,包含了一下内容:

    • paValueList:属性编辑器能返回属性的枚举列表。如果GetValues调用过程附带值,这个属性必需设置。这将使在对象察看其中的属性的右边出现下拉按钮。
    • paSubProperties: 属性编辑器有子属性时,将在当前属性下方显示成标准的大纲格式。如果GetProperties产生属性对象时这个属性必需设置。
    • paDialog:表示这个编辑方法将产生对话框。这将在对象察看其中的属性右边出现'...'按钮。
    • paSortList: 对象察看器将把GetValues返回的列表按照字母排序。
    • paAutoUpdate: 每当编辑发生改变是调用SetValue方法,而不是改变别提交时。例如Caption属性。
    • paMultiSelect: 允许多个控件被选择时显示属性的值。有些属性不适合多选的情况。例如Name属性。
    • paReadOnly: 属性值不允许改变。
    • GetValue:返回属性的串值,缺省时返回'(unknown)',这应该被重载以返回适当的值。
    • GetValues:当GetAttributes返回paValueList时被调用。它必须为每一个属性所接受的值调用参数函数。TEnumProperty将在列举中传递所有的参数。
    • SetValue(Value):设置属性的值。属性编辑器必须能够知道调用哪一个SetXxxValue函数。如果字符串不是合适的格式或不是合法的值,属性编辑器应该产生一个例外,描述产生的问题。SetValue可以忽略所有的改变,允许通过Edit方法编辑所有的属性。例如Picture属性。
    • Edit
      当'...'按钮被安下或是属性被连击识别调用。这样,例如弹出一个对话框,通过更有效的方法,而不是简单的文本来编辑属性。例如Font属性。

    TFileNameProperty

    使用这几个重要的方法我们就能写出自己的属性编辑器了:为filename建立一个大卡文件对话框属性编辑器。我们得记住编写控件从本质来说是非可视化的任务,写书信编辑器并不复杂。我们需要制定一个我们说想要的'Dialog'类型,所以我们在GetAttributes中返回[paDialog]。然后,我们在Edit过程中处理,这次包含一个TOpenDialog来找到任何存在的文件。

    unit FileName;interfaceusesSysUtils, DsgnIntf;
    TypeTFileNameProperty = class(TStringProperty)publicfunction GetAttributes: TPropertyAttributes; override;procedure Edit; override;end;
    procedure Register;
    implementationusesDialogs, Forms;
    function TFileNameProperty.GetAttributes: TPropertyAttributes;beginResult := [paDialog]end {GetAttributes};
    procedure TFileNameProperty.Edit;beginwith TOpenDialog.Create(Application) dotryTitle := GetName; { name of property as OpenDialog caption }Filename := GetValue;Filter := 'All Files (*.*)|*.*';HelpContext := 0;Options := Options + [ofShowHelp, ofPathMustExist, ofFileMustExist];if Execute then SetValue(Filename);finallyFreeendend {Edit};
    procedure Register;beginRegisterPropertyEditor(TypeInfo(TFileName),nil, '', TFileNameProperty)end;end.

    注意到我们调用属性编辑器的GetName函数来得到属性的名字。

    属性编辑器需要注册过程(register)在delphi中来注册它本身(确切的说是在delphi应用程序中)。我们可以只为一个控件注册属性编辑器,也可以我所有的相同类型的属性注册。例如上面的例子TFileNameProperty就是为所有的控件做的。当然,属性编辑器必需安装了并且首先注册。

    为了在Register过程中注册,我们需要调用RegisterPropertyEditor。它有4个参数:第一个是属性类型的类型信息的指针。这里,我们使用内置的函数TypeInfo。第二个是这个编辑器应用的控件类型,如果为nil,这个编辑器为所有控件的所有给定的类型的属性。这里,我们希望属性编辑器为所有的控件的TFileName类型工作。所以只需要把第二个参数置为nil。第三个参数时属性的名字,这个参数只有在第二个参数指定了控件的类型的情况下才有作用。同样,我们把它置为空字符串。第四个参数属性编辑器的自己的类型,这里是TFileNamePr

    我要投稿   -   广告合作   -   关于本站   -   友情连接   -   网站地图   -   联系我们   -   版权声明   -   设为首页   -   加入收藏   -   网站留言
    Copyright © 2009 - 20012 www.www.ct131.com All Rights Reserved.365bet官方 版权所有