第十九章 Delphi自定义部件开辟(二)[Delphi编程]
本文“第十九章 Delphi自定义部件开辟(二)[Delphi编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
19.2.2 Delphi部件编程
19.2.2.1 成立属性
属性(Property)是部件中最特别的部份,主要因为部件用户在计划时可以瞥见和操作它们,并且在交互历程中能当即得到返回后果.属性也很重要,因为假如将它们计划好后,将利用户更简单地利用,自己保护起来也很简单.
为了使你在部件中更好地利用属性,本部份将介绍下列内容:
● 为什么要成立属性
● 属性的种类
● 公布(publishing)担当的属性
● 定义部件属性
● 编写属性编辑器
1. 为什么要成立属性
属性供应非常重要的好处,最明显的好处是属性在计划时能呈目前Object Inspector窗口中,这将简化编程工作,因为你只需读用户所赋的值,而不要处理构造对象的参数.
从部件利用者的概念看,属性象变量.用户可以给属性赋值或读值,就好象属性是对象的域.
从部件编写者的概念看属性比对象的域有更强的功效;
⑴ 用户可以在计划时设置属性
这是非常重要的,因为不象办法,只能在运行时拜候.属性利用户在运路程序之前就可以定制部件,普通你的部件不该包含很多的办法,它们的功效可以通过属性来实现.
⑵ 属性能躲藏具体的实现细节
⑶ 属性能惹起简单地赋值之外的呼应,如触发事件
⑷ 用于属性的实现办法可以是虚拟办法,这样看似简单的属性在差别的部件中,将实现差别的功效.
2. 属性的范例
属性可以是函数能返回的任何范例,因为属性的实现可以利用函数.全部的Pascal范例,兼容性法则都实用属性.为属性挑选范例的最重要的方面是差别的范例呈目前Object Inspector窗口中的方法差别.Object Inspector将按差别的范例决意其呈现的方法.
你也能在注册部件时描写差别的属性编辑器.
下表列出属性呈目前Object Inspector窗口中的方法
表19.3 属性呈目前Object Inspector窗口中的方法
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
属性范例 处 理 方 式
───────────────────────────────────────
简单范例 Numeric、Character和 String属性呈目前Object Inspector中,用户可
以直接编辑
列举范例 列举范例的属性显示值的方法定义在代码中.挑选时将呈现下拉
式列表框,显示全部的大概取值.
调集范例 调集范例呈目前Object Inspector窗口中时正如一个调集,展开后,用
户通过将调集元素设为True或False来挑选.
对象范例 作为对象的属性本身有属性编辑器,假如对象有自己的published属
性,用户在Object Inspector中通过展开对象属性列,可以独立编辑它们,
对象范例的属性必须从TPersistent担当.
数组范例 数组属性必须有它们自己的属性编辑器,Object Inspector没有内嵌对数
组属性编辑的支持.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
3. 公布担当的属性
全部部件都从祖先范例担当属性.当你从已有部件担当时,新部件将担当祖先范例的全部属性.假如你担当的是抽象类,则担当的属性是protected或public,但不是published.如想利用户拜候protected或public属性,可以将该属性重定义为published.假如你利用TWinControl担当,它担当了Ctl3D属性,但是protected的,因此用户在计划和运行时不能拜候Ctl3D,通过在新部件中将Ctl3D重声明为published,就改变了Ctl3D的拜候级别.下面的代码演示若何将Ctl3D声明为published,使之在计划时可被拜候.
type
TSampleComponent=class(TWinControl)
published
property Ctl3D;
end;
4. 定义部件属性
⑴ 属性的声明
声明部件的属性,你要描写:
● 属性名
● 属性的范例
● 读和设置属性值的办法
至少,部件属性该当定义在部件对象声明的public部份,这样可以在运行时很便利地从外部拜候;为了能在计划时编辑属性,该当将属性在published部份声明,这样属性能自动显示在Object Inspector窗口中.下面是典型的属性声明:
type
TYourComponent=class(TComponent)
…
private
FCount: Integer { 内部存储域 }
function GetCount: Integer; { 读办法 }
procedure SetCount(ACount: Integer); { 写办法 }
pubilic
property Count: Integer read GetCount write SetCount;
end;
⑵ 内部数据存储
关于若何存储属性的数据值,Delphi没有分外的规定,普通Delphi部件遵守下列规定:
● 属性数据存储在对象的数据域处
● 属性对象域的标识符以F开首,比方定义在TControl中的属性FWidth
● 属性数据的对象域应声明在private部份
后代部件只应利用担当的属性自身,而不能直接拜候内部的数据存储.
⑶ 直接拜候
使属性数据可用的最简单的办法是直接拜候.属性声明的read 和write部份描写了怎样不通过调用拜候办法来给内部数据域赋值.但普通都用read举行直接拜候,而用write举行办法拜候,以改变部件的状况.
下面的部件声明演示了怎样在属性定义的read 和write部份都采取直接拜候:
type
TYourComponent=class(TComponent)
…
private { 内部存储是私有 }
FReadOnly: Boolean; { 声明保存属性值的域 }
published { 使属性在计划时可用 }
property ReadOnly: Boolean read FReadOnly write FReadOnly;
end;
⑷ 拜候办法
属性的声明语法答应属性声明的read和write部份用拜候办法代替对象私有数据域.不管属性是若何实现它的read 和write部份,办法实现该当是private,后代部件只能利用担当的属性拜候.
① 读办法
属性的读办法是不带参数的函数,并且返回同属性相同范例的值.普通读函数的名字是"Get"后加属性名,比方,属性Count的读办法是GetCount.不带参数的唯一例外是数组属性.假如你不定义read办法,则属性是只写的.
② 写办法
属性的写办法老是只带一个参数的历程.参数可以是引用或值.普通历程名是"Set"加属性名.比方,属性Count的写办法名是SetCount.参数的值采取设置属性的新值,因此,写办法需求履行在内部存储数据中写的操作.
假如没有声明写办法,那么属性是只读的.
普通在设置新值前要检测新值能否与当前值差别.
下面是一个简单的整数属性Count的写办法:
procedure TMyComponent.SetCount( value: Integer);
begin
if value <>FCount then
begin
FCount := Value;
update;
end;
end;
以上是“第十九章 Delphi自定义部件开辟(二)[Delphi编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |