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.
    转载:https://www.cnblogs.com/del/archive/2008/01/11/1034525.html
  • 相关阅读:
    Vmware
    Centos8
    Jmeter系列(37)- 详解 ForEach控制器
    【解决】k8s 1.15.2 镜像下载方案
    【解决】MacOS下 Python3.7 使用 pyinstaller 打包后执行报错 Failed to execute script pyi_rth__tkinter
    【解决】venv 的名字在 zsh prompt 中不显示
    【解决】could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
    《Linux 性能优化实战—倪朋飞 》学习笔记 CPU 篇
    【解决】MongoDB 线上业务处理,数据去重脚本实现
    【解决】docker 容器中 consul集群问题处理
  • 原文地址:https://www.cnblogs.com/fansizhe/p/12723798.html
Copyright © 2011-2022 走看看