程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 理解 Delphi 的類(四) - 初識類的事件

理解 Delphi 的類(四) - 初識類的事件

編輯: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.


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved