您的位置:首页 > 编程语言 > Delphi

理解 Delphi 的类(四) - 初识类的事件

2008-01-11 02:24 246 查看
先勾画一下思路:

1、建立一个类, 里面有年龄字段 FAge;

2、通过 Age 属性读写 FAge;

3、如果输入的年龄刚好是 100 岁, 将会激发一个事件, 这个事件我们给它命名为: OnHundred

unit Unit1;

interface

uses
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: