zoukankan      html  css  js  c++  java
  • 理解 Delphi 的类(四) 初识类的事件

    先勾画一下思路:
    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.
    
  • 相关阅读:
    hdu 5723 Abandoned country 最小生成树 期望
    OpenJ_POJ C16G Challenge Your Template 迪杰斯特拉
    OpenJ_POJ C16D Extracurricular Sports 打表找规律
    OpenJ_POJ C16B Robot Game 打表找规律
    CCCC 成都信息工程大学游记
    UVALive 6893 The Big Painting hash
    UVALive 6889 City Park 并查集
    UVALive 6888 Ricochet Robots bfs
    UVALive 6886 Golf Bot FFT
    UVALive 6885 Flowery Trails 最短路
  • 原文地址:https://www.cnblogs.com/del/p/1034525.html
Copyright © 2011-2022 走看看