1. 程式人生 > >Delphi 自定義事件的例子

Delphi 自定義事件的例子

我們這個控制元件將演示控制元件的自定義事件的書寫。這個控制元件有一個型別為stringSensitiveText屬性,當用戶在輸入框中輸入的文字為InvalidText時就會觸發OnSensitiveText事件。按照慣例,我先把原始碼展示給大家:

unit TextSenseEdit;

interface

uses

SysUtils, Classes, Controls, StdCtrls;

type

TSensitiveTextEvent = procedure(AText: string) of object;//方法指標

TTextSenseEdit = class(TEdit)

private

FSensitiveText: string;

FOnSensitiveText: TSensitiveTextEvent;

procedure SetSensitiveText(AValue: string);

protected

procedure Change;override;

public

published

property SensitiveText: string read FSensitiveText write SetSensitiveText;

property OnSensitiveText: TSensitiveTextEvent read FOnSensitiveText write FOnSensitiveText;

end;

procedure Register;

implementation

procedure Register;

begin

RegisterComponents('Linco', [TTextSenseEdit]);

end;

procedure TTextSenseEdit.Change;

begin

inherited;

if Text = SensitiveText then

if Assigned(OnSensitiveText) then

OnSensitiveText(Text);

end;

procedure TTextSenseEdit.SetSensitiveText(AValue: string);

begin

FSensitiveText := AValue;

end;

end.

程式碼解釋:

1)、SensitiveText屬性的新增方法大家已經熟悉了,這裡不多解釋。

2)、正如大家猜測的,Change方法正是編輯框文字發生變化時的排程方法,它將引起OnChange事件。我們可以在這個方法中監控編輯框文字發生的變化,當文字等於SensitiveText就觸發OnSensitiveText事件(具體的實現方法在後邊解釋)。

3)、Delphi中的控制元件的事件機制是通過方法指標來實現的。宣告方法指標的格式為:

方法指標名稱 = procedure(引數列表) of object;

宣告事件屬性的方法與宣告普通屬性的方法相同。在我們這個例子中,我們首先宣告一個FOnSensitiveText: TSensitiveTextEvent;私有變數,然後property OnSensitiveText: TSensitiveTextEvent read FOnSensitiveText write FOnSensitiveText; 宣告事件屬性。這樣註冊控制元件後,當用戶把控制元件放到窗體中後,就會在Object InspectorEvnets頁中出現OnSensitiveText事件,我們就可以像使用其他事件一樣使用這個事件了。

但是我們現在只是聲明瞭一個事件屬性,並沒有書寫任何程式碼來激發這個事件。我們應該在合適的時候激發此事件,顯而易見我們應該在Change方法中激發此事件:

procedure TTextSenseEdit.Change;

begin

inherited;

if Text = SensitiveText then

if Assigned(OnSensitiveText) then

OnSensitiveText(Text);

end;

if Text = SensitiveText時就判斷控制元件使用者是否為OnSetSensitiveText寫程式碼了(準確的說是是否為OnSetSensitiveText事件控制代碼賦值了),如果寫程式碼了則呼叫OnSetSensitiveText(Text);來激發OnSetSensitiveText事件,並把控制元件的Text傳遞給方法的Avalue引數。正如“方法指標”這個名字一樣,被宣告為方法指標型別的變數可以當作方法使用,用來激發事件。VCL已經為我們預定義了一些常用的事件控制代碼,我們直接拿來使用:TnotifyEventTmouseEventTmouseMoveEventTkeyPressEvent等,具體可以參考VCL原始碼。

思考題:

1、做一個支援累加運算的文字編輯框控制元件,使用者可以在編輯框中輸入正整數。當用戶按回車時,如果編輯框中輸入的不是正整數(為負數、小數或一般字串)則觸發控制元件的OnError事件;如果輸入的是正整數,則開始計算從1到使用者輸入的那個正整數中所有整數的和(用123+……這種累加的辦法實現,不要用(1+n)*n/2這種直接計算的方法),並且在計算工程中如果發現計算的中間結果位數是5,則觸發OnTailFive事件。