Delphi的属性是一个很有特色的功能,这一特性在C#里得到了很好的继承。
对于一个类来说,属性是对类中的数据进行有效修改和访问的特殊接口。在VCL中,被published
的属性还有一个特性,就是可以在界面设计过程中对属性进行设置.
属性的类型
数字、字符、布尔、枚举、TStrings、集合,类对象或者接口类型等
示例:
TEnumTest=(etNone,etTestInt,etTestString);
TTestcontrol=class(TCustomControl)
 private
   FInt : integer;
   FEnumTest :TEnumTest;
   FCaption :string;

function GetInt :Integer;
  funtion GetEnumTest:TEnumTest;
  function Caption:String;

procedure SetCatpion(AValue:String);
  procedure SetInt(AValue:Integer);
  procedure SetEnumTest(AValue:String);
published
   property IntProp :Integer read GetInt write SetInt;
   property EnumTest:TEnumTest read GetEnumTest write SetEnumTest;
   property Caption:String read FCaption write SetCaption;
end;
  
read 和 write 指令指定了访问属性的有效方法,在这些方法里可以实现对属性的访问封装。

写VCL控件最重要的就是属性编写,属性编辑器又是其中的难点。
属性编辑器一般有数字、字符串、集合、类、Color、Font类型编辑器,Delphi内建基本编辑器声明有
TPropertyEditor 所有的属性编辑器都必须继承于此或他的派生类
TOrdinalProperty 这是几个有序属性编辑器的基类,如TIntegerProperty TCharProperty TEnumProperty
TIntegerProperty 适用编辑整型属性
TCharProperty 适用编辑字符型属性
TEnumProperty 适用编辑枚举型属性
TBoolProperty 适用编辑布尔型属性
TFloatProperty 适用编辑浮点型属性
TStringProperty 适用编辑字符串型属性
TClassProperty 适用编辑对象类型
TComponentProperty 使用编辑引用一个组件属性
TSetProperty 适用编辑集合类型
上述可以查看DesignEditors.pas单元(Delphi7)
对于一些基本数据类型有时并不需要创建属性编辑器,因为数据类型本身也会数据进行检查,
在当你有特殊的检查时,你可以从上述基本编辑器派生出自己的属性编辑器

对话框型属性编辑器的编写
定义一个正对字符型属性编辑的对话框界面,在界面上放一个memo, 一个Label, 三个按钮
代码如下
unit uStringEditor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons,DesignIntf,DesignEditors;

type
  //对话框属窗体类
  TMyStringEditDlg = class(TForm)
    Memo: TMemo;
    OkButton: TBitBtn;
    CancelButton: TBitBtn;
    Label1: TLabel;
    BitBtn1: TBitBtn;
    procedure MemoKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure UpdateStatus(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
    FModified: Boolean;

protected
    function GetLines: TStrings;
    procedure SetLines(const Value: TStrings);
    function GetLinesControl: TWinControl;
  public
    { Public declarations }
    property Lines: TStrings read GetLines write SetLines;
  end;
   
   //对话框属性编辑器
    TMyStringProperty = class(TStringProperty)
    protected
      function EditDialog: TMyStringEditDlg; virtual;
    public
      procedure Edit; override;
      function GetAttributes: TPropertyAttributes; override;
    end;

var
  MyStringEditDlg: TMyStringEditDlg;

implementation
{$R *.dfm}
const                                   //v1.73 19/08/2000)
  CopyRightStr: PChar = 'String Editor v1.0 (12/06/2003)'+#13+#13+
    'Created By Donson Wan '#13+#13+   
    'Compiled in '+
    {$IFDEF VER80}  'Delphi 1.0' {$ENDIF}
    {$IFDEF VER90}  'Delphi 2.0' {$ENDIF}
    {$IFDEF VER100} 'Delphi 3.0' {$ENDIF}
    {$IFDEF VER120} 'Delphi 4.0' {$ENDIF}
    {$IFDEF VER130} 'Delphi 5.0' {$ENDIF}
    {$IFDEF VER140} 'Delphi 6.0' {$ENDIF}
    {$IFDEF VER150} 'Delphi 7.0' {$ENDIF}
    {$IFDEF VER93}  'C++Builder 1.0' {$ENDIF}
    {$IFDEF VER110} 'C++Builder 3.0' {$ENDIF}
    {$IFDEF VER125} 'C++Builder 4.0' {$ENDIF};

var
  StoredWidth, StoredHeight, StoredLeft, StoredTop: Integer;

function TMyStringEditDlg.GetLines: TStrings;
begin
  Result:=Memo.Lines;
end;

function TMyStringEditDlg.GetLinesControl: TWinControl;
begin

end;

procedure TMyStringEditDlg.MemoKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_ESCAPE then CancelButton.Click;
end;

procedure TMyStringEditDlg.SetLines(const Value: TStrings);
begin
  inherited;
  Memo.Lines.Assign(Value);
end;

procedure TMyStringEditDlg.FormDestroy(Sender: TObject);
begin
  StoredWidth := Width;
  StoredHeight := Height;
  StoredLeft := Left;
  StoredTop := Top;
end;

procedure TMyStringEditDlg.FormShow(Sender: TObject);
begin
  if StoredWidth <> 0 then
    Width := StoredWidth;
  if StoredHeight <> 0 then
    Height := StoredHeight;
  if StoredLeft <> 0 then
    Left := StoredLeft
  else
    Left := (Screen.Width - Width) div 2;
  if StoredTop <> 0 then
    Top := StoredTop
  else
    Top := (Screen.Height - Height) div 2;
end;

procedure TMyStringEditDlg.UpdateStatus(Sender: TObject);
begin
  if Sender = Memo then FModified := True;
end;
{ TMyStringProperty }

procedure TMyStringProperty.Edit;
begin
  inherited;
  with EditDialog do
  try
    Lines.Text := GetValue;
    FModified:=False;
    UpdateStatus(nil);
    //ActiveControl := GetLinesControl;
    case ShowModal of
      mrOk: begin
            SetValue(Lines.Text);
            //Designer.Modified;
            end;
    end;
  finally
    Free;
  end;
end;

function TMyStringProperty.EditDialog: TMyStringEditDlg;
begin
  Result := TMyStringEditDlg.Create(Application);
end;

function TMyStringProperty.GetAttributes: TPropertyAttributes;
begin
  Result := inherited GetAttributes + [paDialog] - [paSubProperties];
end;

procedure TMyStringEditDlg.BitBtn1Click(Sender: TObject);
begin
      MessageDlg(StrPas(CopyRightStr), mtInformation, [mbOk], 0);

end;

end.

可以用上述编辑器注册给TTestcontrol.Caption 属性
注册属性编辑器的声明为
RegisterPropertyEditor(PropertyType:PTypeInfo;
ComponentClass: Tclass;Const PropertyName:String;
EditorClass: TPropertyEditorClass);

RegisterPropertyEditor(TypeInfo(string), TTestcontrol, 'Caption',  TMyStringProperty);
如上就注册成功了,
参数1是Typeinfo(string)是取得属性运行时刻属性类型信息,
参数2是指定注册控件对象,如果不指定控件对象就注册给Delphi所有控件了, 这样你往界面上拉一个Label时,
原来不能写多行文本时现在也解决了,现在你可以在弹出属性编辑器里输,可以任意行:)

参数3是指定注册属性名
参数4就是你需要注册的属性编辑器类名了

另外还可以给你注册的属性加一个归类CategoryName,我们把上述Caption属性指定为MyCategory型属性,注册示例如

下:RegisterPropertiesInCategory('MyCategory', TTestcontrol, ['Caption']);

VCL (三) 属性编辑器相关推荐

  1. 【Spring 基础篇三】属性注入与属性编辑器

         上篇我们了解了一下applicationContext.xml的两种注入方式,本篇我们来了解一下关于属性的注入以及操作.      在敲代码的过程中,我们很容易遇到这样的问题,比如一个Lis ...

  2. 【Spring】—-常用属性注入及属性编辑器(三)

    对于对象的注入,我们使用ref方式,可以指定注入的对象,下面看下属性的注入,以及当spring无法转换基本类型进行注入时,如何编写一个类似转换器的东西来完成注入. [属性注入] 常见属性的注入:int ...

  3. C#控件开发---控件属性编辑器

    最近项目需要用到自定义控件的属性需要多选,我们知道默认的属性一般都是下拉输入之类的,也有多选,但是我需要的是checkbox,没有现成的,百度发现微软有提供接口UITypeEditor ,继承这个基类 ...

  4. springMVC4(9)属性编辑器剖析入参类型转换原理

    我们通过Http请求提交的参数都以字符串的形式呈现,但最终在springMVC的方法入参中,我们却能得到各种类型的数据,包括Number.Boolean.复杂对象类型.集合类型.Map类型等,这些都是 ...

  5. 我眼中的Linux设备树(三 属性)

    三 属性(property) device_type = "memory"就是一个属性,等号前边是属性,后边是值.节点是一个逻辑上相对独立的实体,属性是用来描述节点特性的,根据需要 ...

  6. Spring - Java/J2EE Application Framework 应用框架 第 4 章 属性编辑器,数据绑定,校验与BeanWeapper(Bean封装)

    第 4 章 属性编辑器,数据绑定,校验与BeanWeapper(Bean封装) 4.1. 简介 是否需要对业务逻辑进行验证是一个常见的问题. 有关这一点存在两种截然想法的回答,Spring提出的验证模 ...

  7. 用mel编写自定义节点的属性编辑器界面

    用mel编写自定义节点的属性编辑器界面比较麻烦,而且网上例子又少,下面给出一个范例,说明基本的格式 // 初始化节点时调用 global proc initControl(string $attrNa ...

  8. css亮黄色_写给前端工程师的色彩常识:色彩三属性及其在CSS中的应用

    关注前端达人,与你共同进步 大家好,本篇文章,笔者将给大家聊聊关于设计方面的一些常识,你也许会很奇怪的问,前端工程师有必要了解设计相关的常识吗?那我的答案就是十分有必要.因为我们这个工作岗位做的产品直 ...

  9. 写给前端工程师的色彩常识:色彩三属性及其在CSS中的应用

    关注前端达人,与你共同进步 大家好,本篇文章,笔者将给大家聊聊关于设计方面的一些常识,你也许会很奇怪的问,前端工程师有必要了解设计相关的常识吗?那我的答案就是十分有必要.因为我们这个工作岗位做的产品直 ...

最新文章

  1. java多if语句的优化方案_Java代码多分支语句优化
  2. Simulink仿真教程6---对控制系统的阶跃响应进行仿真
  3. qemu虚拟机与外部网络的通信
  4. 福布斯2015中国非上市潜力企业100强
  5. Ethernet II帧格式
  6. 2015.08.17 Ubuntu 14.04+cuda 7.5+caffe安装配置
  7. Linux之间配置SSH互信(SSH免密码登录)
  8. 比特币被盗事件频发,这次是 6300 万美元
  9. android RN开发环境搭建
  10. java调用有道翻译接口
  11. 下行文格式图片_通知的格式及范文图片_通知格式 通知的格式及范文
  12. 更改html默认浏览器,怎么更改默认浏览器?默认浏览器设置在哪里
  13. Mac制作windows10安装U盘
  14. 平台电子签章实现方法
  15. 理想电压源和理想电流源
  16. EMC电磁兼容1:EMC、EMI、EMS是什么?它们之间有什么关系?
  17. 业务系统(HANA/SAP/OA/ERP/OA)
  18. 计算机90学时培训小结,90学时培训总结
  19. ORM框架Gorm-删除记录
  20. 电子计算机机房施工及验收规范

热门文章

  1. 抖音热门游戏Fill one-line puzzle game解法的Python代码实现
  2. 五、延迟初始化和密封类(Kolin)
  3. 【字节青训营】Day1 HTML+CSS笔记
  4. 局域网(以太网和IEEE 802.11,VLAN)
  5. 什么是 JavaScript?
  6. 董明珠为华为发声,格力将引进鸿蒙操作系统
  7. Unity2D-Dash SpeedUp
  8. zip、z01、z02等压缩分卷解压缩报错问题
  9. 上市首日大涨15%,投出优步的私募巨头TPG迎来开门红?
  10. 开始做mvc 框架 家庭理财项目。