转载:Delphi属性Property学习应用总结
2013-04-01 19:56
369 查看
Delphi属性Property学习应用总结
Property是一个很有意思的语法特性,它使得方法具有了字段的调用特征,并赋予字段执行动作的能力。
如果你使用过C++ Builder来写基于VCL的程序,我想很多人都会注意到这样一点,比如:
edt.Text = "test"; 这个时候edt文本框的内容会随之改变,但是“理论”上Text应该只是改变了Text所在的内存数据而已,为什么会导致窗口更新界面着一些列动作?
这就是因为Property这一特性,Property是Borland为C++扩展的语法特性,目的在于使C++ Builder能够方便的使用VCL库,毕竟VCL是使用Object Pascal写的。
有些扯远了,言归正传,这里还是总结一下在Delphi中如何使用Poperty这一语法特性。
如果学习过C#的朋友应该会很容易理解,因为C#的属性就是学习自Delphi,毕竟C#和Delphi是同一个设计者。
定义一个属性Property的基本格式如下:
property 属性名 : 属性值类型 read 属性读函数/属性值变量 write 属性写函数/属性值变量
这里简单解释一下:
1。Property是属性定义关键字。
2。属性的特征类似于字段,所以属性名就像字段名,属性值类型就像字段的值类型
3。属性读函数,是属性被“读取”时所执行的操作,这样在执行“取值”操作时,具备了执行其他动作的可能。
另外,属性值变量,可以是Property所在类能够访问的任何变量,如果使用了属性值变量,则相当于属性值直接从值变量中获取,这和直接赋值是没有什么差别的
4。属性写函数,是属性被“写入”时所执行的操作,这样在执行属性“赋值”操作时,具备了执行其他动作的可能。比如:写入edt的Text属性时,窗口会同时执行界面更新操作。
另外,属性值变量和3中所述类似,如果使用了,就相当于将传来的属性值直接赋值到对应的属性值变量
这里的函数是真正的函数,不像C#中那样的getter和setter,所以会有些难以理解。
5。属性读函数的函数声明:
function 读函数名: 属性值类型;
其中读函数名可以自定义,只要和属性声明中一样即可,该函数的返回值就是读属性操作时实际获取的值。
6。属性写函数声明(其实是一个子函数):
procedure 写函数名(value : 属性值类型)
其中写函数名可以自定义,只要和属性声明中一样即可,该函数参数value,就是对属性赋值时传递过来的实际值。
7。读函数和写函数必须设置一个,如果只设置读函数,而没有设置写函数(同时去掉write关键字),这样的属性就是只读属性,同理也可以设置只写属性
8。为了保证属性公开性的同时掩盖读写函数的可见性,可以将读写函数设置为私有,而将属性设置为共有,这样可以避免将读写函数本身暴露给调用者,否则就不太拉风了。
举例:
TxKernelSearchThread = class(TThread)
private
keyword_list: TStringList;
procedure SetKeyword(value: UnicodeString);
public
property Kerword:UnicodeString write SetKeyword;
。。。
end;
procedure TxKernelSearchThread.SetKeyword(value: UnicodeString);
begin
if value = '' then Exit;
ExtractStrings([' '],[' '],PWideChar(value),Self.keyword_list);
end;
上面是一个只写属性的例子。
属性的一个很重要的应用就是VCL中的控件属性,以及事件属性等,这也就解释了为什么向文本框的Text属性赋值,会更新界面操作,这正是因为属性将字段和函数的特征结合了起来。
Property是一个很有意思的语法特性,它使得方法具有了字段的调用特征,并赋予字段执行动作的能力。
如果你使用过C++ Builder来写基于VCL的程序,我想很多人都会注意到这样一点,比如:
edt.Text = "test"; 这个时候edt文本框的内容会随之改变,但是“理论”上Text应该只是改变了Text所在的内存数据而已,为什么会导致窗口更新界面着一些列动作?
这就是因为Property这一特性,Property是Borland为C++扩展的语法特性,目的在于使C++ Builder能够方便的使用VCL库,毕竟VCL是使用Object Pascal写的。
有些扯远了,言归正传,这里还是总结一下在Delphi中如何使用Poperty这一语法特性。
如果学习过C#的朋友应该会很容易理解,因为C#的属性就是学习自Delphi,毕竟C#和Delphi是同一个设计者。
定义一个属性Property的基本格式如下:
property 属性名 : 属性值类型 read 属性读函数/属性值变量 write 属性写函数/属性值变量
这里简单解释一下:
1。Property是属性定义关键字。
2。属性的特征类似于字段,所以属性名就像字段名,属性值类型就像字段的值类型
3。属性读函数,是属性被“读取”时所执行的操作,这样在执行“取值”操作时,具备了执行其他动作的可能。
另外,属性值变量,可以是Property所在类能够访问的任何变量,如果使用了属性值变量,则相当于属性值直接从值变量中获取,这和直接赋值是没有什么差别的
4。属性写函数,是属性被“写入”时所执行的操作,这样在执行属性“赋值”操作时,具备了执行其他动作的可能。比如:写入edt的Text属性时,窗口会同时执行界面更新操作。
另外,属性值变量和3中所述类似,如果使用了,就相当于将传来的属性值直接赋值到对应的属性值变量
这里的函数是真正的函数,不像C#中那样的getter和setter,所以会有些难以理解。
5。属性读函数的函数声明:
function 读函数名: 属性值类型;
其中读函数名可以自定义,只要和属性声明中一样即可,该函数的返回值就是读属性操作时实际获取的值。
6。属性写函数声明(其实是一个子函数):
procedure 写函数名(value : 属性值类型)
其中写函数名可以自定义,只要和属性声明中一样即可,该函数参数value,就是对属性赋值时传递过来的实际值。
7。读函数和写函数必须设置一个,如果只设置读函数,而没有设置写函数(同时去掉write关键字),这样的属性就是只读属性,同理也可以设置只写属性
8。为了保证属性公开性的同时掩盖读写函数的可见性,可以将读写函数设置为私有,而将属性设置为共有,这样可以避免将读写函数本身暴露给调用者,否则就不太拉风了。
举例:
TxKernelSearchThread = class(TThread)
private
keyword_list: TStringList;
procedure SetKeyword(value: UnicodeString);
public
property Kerword:UnicodeString write SetKeyword;
。。。
end;
procedure TxKernelSearchThread.SetKeyword(value: UnicodeString);
begin
if value = '' then Exit;
ExtractStrings([' '],[' '],PWideChar(value),Self.keyword_list);
end;
上面是一个只写属性的例子。
属性的一个很重要的应用就是VCL中的控件属性,以及事件属性等,这也就解释了为什么向文本框的Text属性赋值,会更新界面操作,这正是因为属性将字段和函数的特征结合了起来。
相关文章推荐
- Delphi属性Property学习应用总结
- Delphi属性Property学习应用总结
- Delphi属性Property学习应用总结
- Delphi属性Property学习应用总结
- Delphi属性Property学习应用总结
- 【转载】学习总结:初等数论(3)——原根、指标及其应用
- 在Delphi的属性 property中使用数组-第一篇转载
- 两个DIV之间的间距,clear属性灵活应用,方便控制一行div数量(转载,学习一下)
- Anroid动画总结一:属性动画(Property)简单应用
- 两个DIV之间的间距,clear属性灵活应用(转载,学习一下)
- 【转】作用域、链接属性、存储类型总结--转载学习,很清晰,很详细
- Hibernate 集合属性List 的使用----Hibernate 学习笔记总结(一)
- Vue1.0学习总结(3)———vue1.0的生命周期、vue计算属性computed的使用、vue实例(vm)上方法总结、vue结合动画使用
- EhLib DBGridEh组件在Delphi中应用全攻略总结
- Aqua Data Studio应用总结(csdn内转载)
- EhLib DBGridEh组件在Delphi中应用全攻略总结(转)
- 转载Android wakelock 学习总结第一篇
- Android属性动画(二) ------ 站在巨人的肩膀上学习总结
- Guice 学习(七)常量和属性的注入( Constant and Property Inject)
- Java学习笔记—多线程(线程池框架Executor总结,转载)