Delphi 事件 --事件原来是函数指针,同时是个属性
来源:互联网 发布:3dmax mac中文破解版 编辑:程序博客网 时间:2024/06/01 14:52
总结一下在Delphi中如何使用Poperty这一语法特性。如果学习过C#的朋友应该会很容易理解,因为C#的属性就是学习自Delphi,毕竟C#和Delphi是同一个设计者。
定义一个属性Property的基本格式如下:
property 属性名 : 属性值类型 read 属性读函数 write 属性写函数
这里简单解释一下:
1。Property是属性定义关键字。
2。属性的特征类似于字段,所以属性名就像字段名,属性值类型就像字段的值类型
3。属性读函数,是属性被“读取”时所执行的操作,这样在执行“取值”操作时,具备了执行其他动作的可能。
4。属性写函数,是属性被“写入”时所执行的操作,这样在执行属性“赋值”操作时,具备了执行其他动作的可能。比如:写入edt的Text属性时,窗口会同时执行界面更新操作。
这里的函数是真正的函数,不像C#中那样的getter和setter,所以会有些难以理解。
5。属性读函数的函数声明:
function 读函数名: 属性值类型;
其中读函数名可以自定义,只要和属性声明中一样即可,该函数的返回值就是读属性操作时实际获取的值。
6。属性写函数声明(其实是一个子函数):
procedure 写函数名(value : 属性值类型)
其中写函数名可以自定义,只要和属性声明中一样即可,该函数参数value,就是对属性赋值时传递过来的实际值。
7。读函数和写函数必须设置一个,如果只设置读函数,而没有设置写函数(同时去掉write关键字),这样的属性就是只读属性,同理也可以设置只写属性
8。为了保证属性公开性的同时掩盖读写函数的可见性,可以将读写函数设置为私有,而将属性设置为共有,这样可以避免将读写函数本身暴露给调用者,否则就不太拉风了。
Delphi是一种功能很强的可视化程序开发工具。我们在使用Delphi开发WINDOWS 应用程序的过程中,虽然Delphi为每个可视化组件都提供了很多属性(Property)和事件(Event),但在实际应用中可能会碰到一些自己需要的特殊事件,这些特殊事件Delphi 又没有提供,这时我们就需要为应用程序添加这些特殊事件。当这些事件发生后,又能马上调用处理这些事件的过程。本文通过实例来说明如何为应用程序添加事件和处理事件的过程。
在Delphi中,事件实际上是专门化的属性,它是一个过程(procedure)的指针。要添加事件,首先应在所定义的类中说明一个用来指向事件过程的指针,该指针的作用是当事件一旦发生,就通过这个指针执行所指向的处理这个事件的过程。最后通过指定符 published公布定义的事件属性
先勾画一下思路:
1、建立一个类, 里面有年龄字段 FAge;
2、通过 Age 属性读写 FAge;
3、如果输入的年龄刚好是 100 岁, 将会激发一个事件, 这个事件我们给它命名为: OnHundred
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); end; {先定义一个特殊的类型: 一个对象所属的过程类型; 这是建立一个事件的前提} TMyEvent = procedure of object; {TMyClass 类} TMyClass = class strict private FAge: Integer; {年龄字段} FOnHundred: TMyEvent; {为我们刚刚定义的 TMyEvent 类型指定一个变量: FOnHundred} procedure SetAge(const Value: Integer); public procedure SetOnHundred1; {建立事件将要调用的过程} procedure SetOnHundred2; {建立事件将要调用的过程} constructor Create; property Age: Integer read FAge write SetAge; property OnHundred: TMyEvent read FOnHundred write FOnHundred; {其实事件也是属性} {事件命名一般用 On 开始} end;var Form1: TForm1;implementation{$R *.dfm}{ TMyClass }constructor TMyClass.Create;begin FOnHundred := SetOnHundred1; {在对象建立时, 我们先让事件调用 SetOnHundred1 方法}end;procedure TMyClass.SetAge(const Value: Integer);begin if (Value>0) and (Value<200) then Fage := Value; if Value=100 then OnHundred; {当输入的年龄是 100 岁时, 激活事件}end;procedure TMyClass.SetOnHundred1;begin ShowMessage('祝贺您 100 岁大寿!');end;procedure TMyClass.SetOnHundred2;begin ShowMessage('但愿我们都能活到 100 岁!');end;//测试1:procedure TForm1.Button1Click(Sender: TObject);var myClass: TMyClass;begin myClass := TMyClass.Create; myClass.Age := 99; {如果年龄不是负数而又小于 200} ShowMessage(IntToStr(myClass.Age)); {99; 对象就接受了} myClass.Free;end;//测试2:procedure TForm1.Button2Click(Sender: TObject);var myClass: TMyClass;begin myClass := TMyClass.Create; myClass.Age := 100; {这时将会激活事件, 弹出对话框: 祝贺您 100 岁大寿!} myClass.Free;end;//测试3:procedure TForm1.Button3Click(Sender: TObject);var myClass: TMyClass;begin myClass := TMyClass.Create; myClass.OnHundred := myClass.SetOnHundred2; {让事件指向另一个方法} myClass.Age := 100; {这时将会激活事件, 弹出对话框: 但愿我们都能活到 100 岁!} myClass.Free;end;{ 本节我自定义了一个事件类型: TMyEvent, 它没有参数, 一般系统定义的事件类型都是有参数的; 事件类型就是一个指针, 它指向一个过程, 事件类型定义时就指定了参数的类型和个数, 事件调用的过程的参数必须和定义时一致, 譬如 TMyEvent 没有参数, 它调用的 SetOnHundred1、SetOnHundred2 也都没有参数.}end.
- Delphi 事件 --事件原来是函数指针,同时是个属性
- Delphi 事件 --事件原来是函数指针,同时是个属性
- Delphi 属性、函数、事件参考
- Delphi 属性、函数、事件参考
- Delphi 属性、函数、事件参考
- Delphi 属性、函数、事件参考
- Delphi属性函数事件参考
- Delphi TNotifyEvent是Delphi中基本通知事件的类型
- Delphi TNotifyEvent是Delphi中基本通知事件的类型
- delphi 事件属性例子
- 班德瑞原来是个骗局
- delphi常用函数、属性、事件参考手册 (转)
- JS 中的事件是
- delphi 常用属性、方法、事件
- 晕,原来指针是这样赋值的!
- 使用“事件监听/链式事件处理方式”实现window.onload同时调用多个函数
- 原来年薪300000依旧是个悲剧
- 域名原来是这么个东西
- installing OpenCV 2.4.9 in Ubuntu 14.04 LTS
- java 动态规划求解最长公共子序列&最长公共子串问题
- 嵌入式学习参考资料
- Android开发中将LOG存入SD卡
- C++primer阅读笔记-模板与泛型编程(重载与模板)
- Delphi 事件 --事件原来是函数指针,同时是个属性
- adjacent_find
- iOS KVC & KVO
- STL map的使用(二)
- SecureZeroMemory和ZeroMemory的区别
- ToolBar居中显示文字或控件
- CSS margin 属性
- 入手Cubieboard2之制作最小Linux系统
- Hibernate – One-to-One example (Annotation)