DELPHI自定義事件

 unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
   //定義一個事件格式,要傳參數的格式 後面必須要加上of object
   TeacherArgnyEvent = procedure(ErrorCount: Integer) of object;

type
TTeacher = class(TObject)
private
    FStudentErrorCount: Integer;
    FOnTeacherArngy: TeacherArgnyEvent; //定義一個內部事件,private裏的只能在TTeacher類內部調用
    procedure SetStudentErrorCount(Value: Integer);
public
    constructor Create;
    destructor Destroy; override;
    property StudentErrorCount: Integer read FStudentErrorCount write SetStudentErrorCount ;
    property OnTeacherArngy: TeacherArgnyEvent read FOnTeacherArngy write FOnTeacherArngy ; //定義一個外部的事件,在其它的對象裏面可以通過FTeacher.ONTeacherArngy這樣調用。讀寫是通過內部的FOnTeacherArngy
end;

type
TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure IfTeacherArngy(EC: Integer); //自己定義事件觸發時要執行的函數,和Button控件在事件列表中雙擊時出來的那段代碼一樣,只是這裏是你自己定義的,而不是DELPHI給你生成的
private
    FTeacher: TTeacher ;
public
    { Public declarations }
end;

 


var
Form1: TForm1;

implementation

{$R *.dfm}

{ TTeacher }

constructor TTeacher.Create;
begin
FStudentErrorCount := 0;
end;

destructor TTeacher.Destroy;
begin

inherited;
end;

procedure TTeacher.SetStudentErrorCount(Value: Integer);
begin
FStudentErrorCount := Value;
if FStudentErrorCount > 3 then    //給StudentErrorCount賦值的時候,判斷是否觸發FOnTeacherArngy事件
    if Assigned(FOnTeacherArngy) then   //看FOnTeacherArngy是否爲空,不爲空則執行該事件,如果不判斷是否爲空,則執行下面一句的時候可能會有錯誤
      FOnTeacherArngy(FStudentErrorCount);
end;

{ TForm }

procedure TForm1.FormCreate(Sender: TObject);
begin
FTeacher := TTeacher.Create ;     //創建一個TTeacher的實例
FTeacher.OnTeacherArngy := IfTeacherArngy; //把FOrm1裏的IfTeacherArngy過程賦值給FTeacher的OnTeacherArngy,這樣它就不爲空了
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FTeacher.Free ;   //窗體關閉時釋放
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FTeacher.StudentErrorCount := FTeacher.StudentErrorCount + 1; //給StudentErrorCount賦值 ,我只是給他賦值,就會觸發那個事件
// 有了這個類,就不用下面這一段了,給 StudentErrorCount屬性賦值就能達到下面這段代碼的效果。
// if FTeacher.StudentErrorCount > 3 then
//    ShowMessage('Student 錯誤了' + IntToStr(ec) + '次,老師生氣了。');
end;

procedure TForm1.IfTeacherArngy(EC: Integer);
begin
ShowMessage('Student 錯誤了' + IntToStr(ec) + '次,老師生氣了。'); //事件觸發時的情況,和Button控件在事件列表中雙擊時出來的那段代碼一樣,只是這裏是你自己定義的,而不是DELPHI給你生成的
end;

end.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章