?
四、對特定字符串敏感的Edit控件
我們這個控件將演示控件的自定義事件的書寫。這個控件有一個類型為string的SensitiveText屬性,當用戶在輸入框中輸入的文字為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 Inspector中Evnets頁中出現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已經為我們預定義了一些常用的事件句柄,我們直接拿來使用:TnotifyEvent,TmouseEvent,TmouseMoveEvent,TkeyPressEvent等,具體可以參考VCL源碼。
思考題:
1、做一個支持累加運算的文本編輯框控件,用戶可以在編輯框中輸入正整數。當用戶按回車時,如果編輯框中輸入的不是正整數(為負數、小數或一般字符串)則觸發控件的OnError事件;如果輸入的是正整數,則開始計算從1到用戶輸入的那個正整數中所有整數的和(用1+2+3+……這種累加的辦法實現,不要用(1+n)*n/2這種直接計算的方法),并且在計算工程中如果發現計算的中間結果位數是5,則觸發OnTailFive事件。