其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

DELPHI基础教程:Delphi自定义部件开发(二)[1]


发布日期:2018年08月10日
 
DELPHI基础教程:Delphi自定义部件开发(二)[1]

Delphi部件编程

创建属性

属性(Property)是部件中最特殊的部分主要因为部件用户在设计时可以看见和操作它们并且在交互过程中能立即得到返回结果属性也很重要因为如果将它们设计好后将使用户更容易地使用自己维护起来也很容易

为了使你在部件中更好地使用属性本部分将介绍下列内容

● 为什么要创建属性

● 属性的种类

● 公布(publishing)继承的属性

● 定义部件属性

● 编写属性编辑器

为什么要创建属性

属性提供非常重要的好处最明显的好处是属性在设计时能出现在Object Inspector窗口中这将简化编程工作因为你只需读用户所赋的值而不要处理构造对象的参数

从部件使用者的观点看属性象变量用户可以给属性赋值或读值就好象属性是对象的域

从部件编写者的观点看属性比对象的域有更强的功能

⑴ 用户可以在设计时设置属性

这是非常重要的因为不象方法只能在运行时访问属性使用户在运行程序之前就能定制部件通常你的部件不应包含很多的方法它们的功能可以通过属性来实现

⑵ 属性能隐藏详细的实现细节

⑶ 属性能引起简单地赋值之外的响应如触发事件

⑷ 用于属性的实现方法可以是虚拟方法这样看似简单的属性在不同的部件中将实现不同的功能

属性的类型

属性可以是函数能返回的任何类型因为属性的实现可以使用函数所有的Pascal类型兼容性规则都适用属性为属性选择类型的最重要的方面是不同的类型出现在Object Inspector窗口中的方式不同Object Inspector将按不同的类型决定其出现的方式

你也能在注册部件时描述不同的属性编辑器

下表列出属性出现在Object Inspector窗口中的方式

属性出现在Object Inspector窗口中的方式

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

属性类型 处 理 方 式

───────────────────────────────────────

简单类型 NumericCharacter和 String属性出现在Object Inspector中用户可以直接编辑

枚举类型 枚举类型的属性显示值的方式定义在代码中选择时将出现下拉式列表框显示所有的可能取值

集合类型 集合类型出现在Object Inspector窗口中时正如一个集合展开后用户通过将集合元素设为True或False来选择

对象类型 作为对象的属性本身有属性编辑器如果对象有自己的published属性用户在Object Inspector中通过展开对象属性列可以独立编辑它们对象类型的属性必须从TPersistent继承

数组类型 数组属性必须有它们自己的属性编辑器Object Inspector没有内嵌对数组属性编辑的支持

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

公布继承的属性

所有部件都从祖先类型继承属性当你从已有部件继承时新部件将继承祖先类型的所有属性如果你继承的是抽象类则继承的属性是protected或public但不是published如想使用户访问protected或public属性可以将该属性重定义为published如果你使用TWinControl继承它继承了CtlD属性但是protected的因此用户在设计和运行时不能访问CtlD通过在新部件中将CtlD重声明为published就改变了CtlD的访问级别下面的代码演示如何将CtlD声明为published使之在设计时可被访问

type

TSampleComponent=class(TWinControl)

published

property CtlD;

end;

定义部件属性

⑴ 属性的声明

声明部件的属性你要描述

● 属性名

● 属性的类型

● 读和设置属性值的方法

至少部件属性应当定义在部件对象声明的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 TMyComponentSetCount( value: Integer)

begin

if value <>FCount then

begin

FCount := Value;

update;

end;

end;

⑸ 缺省属性值

当声明一个属性能有选择地声明属性的缺省值部件属性的缺省值是部件构造方法中的属性值集例如当从Component Palette选择某部件置于窗体中时Delphi通过调用部件构造方法创建部件并决定部件属性初始值

Delphi使用声明缺省值决定是否将属性值存在DFM文件中如果不描述缺省值Delphi将总是保存该属性值声明缺省值的方法是在属性声明后加default指令再跟缺省值

当重声明一个属性时能够描述没有缺省值的属性如果继承的属性已有一个则设立没有缺省值的属性的方法是在属性声明后加nodefault指令如果是第一次声明属性则没有必要加nodefault指令因为没有default指令即表示如此

[] [] [] []

               

上一篇:DELPHI基础教程:Delphi自定义部件开发(二)[2]

下一篇:DELPHI基础教程:Delphi自定义部件开发(三)[4]