先勾畫一下思路:
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);
//測試2:
var
myClass: TMyClass;
begin
myClass := TMyClass.Create;
myClass.Age := 99; {如果年齡不是負數而又小於 200}
ShowMessage(IntToStr(myClass.Age)); {99; 對象就接受了}
myClass.Free;
end;procedure TForm1.Button2Click(Sender: TObject);
//測試3:
var
myClass: TMyClass;
begin
myClass := TMyClass.Create;
myClass.Age := 100; {這時將會激活事件, 彈出對話框: 祝賀您 100 歲大壽!}
myClass.Free;
end;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.