捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >基础知识 > 正文
15 2020.02

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

点击次数:295 更新时间:2020-2-15 22:25:55  【打印此页

先勾画一下思路:
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.
Tips
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:295 更新时间:2020-2-15 22:25:55  【打印此页
关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修