呼叫event的sender討論

来源:互联网 发布:mac产品介绍 编辑:程序博客网 时间:2024/05/20 23:39
內文】http://delphi.ktop.com.tw/topic.asp?topic_id=55494

試著剖析一下TForm1.PageControl1Change(Sender: TObject):

先看看OnChange是什麽?它是一個改變事件(Event)。事件是一種特殊的屬性。那既然OnChange是屬性,它肯定屬於某種特殊的資料類型,這個資料類型又是什麽呢?按下F1在Delphi的Help中找到它:
property OnChange: TNotifyEvent;

也就是說,OnChange是TNotifyEvent類型的資料。再看看TNotifyEvent,發現這樣的一種類型:
type TNotifyEvent = procedure (Sender: TObject) of object

看起來好奇怪嘛,因爲TNotifyEvent後面加了一個of object關鍵字,而of object的作用在於變數只能通過物件來引用。所以現在可以準確的講:TNotifyEvent是一個方法類型

再看看(Sender: TObject),其中的Sender是一個TObject類型的參數,它告訴Delphi哪個元件接收這個事件並調用相應的處理過程。我們可以編寫一個單一的事件處理控制碼(Handle),通過Sender參數和If…then…語句或者Case語句配合來處理多個元件。發生事件的元件的值已經賦給了Sender參數,該參數的用途之一就在於:可以使用保留字Is來測試Sender,以便找到調用這個事件處理控制碼的元件的類型,例如:

procedure TForm1.xxx(Sender:TObject); begin   if(sender if Tedit) then   showmessage('This is a Editbox');  if(sender is Tlabel) then   showmessage('This is a Label'); end;

而Sender參數的第二個用途是:結合As操作符進行類型轉換,將若干個派生于某一父類的子類強制轉換成該父類,例如:一個Form中有一個TEdit類元件和一個TMemo元件,它們實際上都派生於TCustomEdit類,如果我要爲二者的某一事件提供同樣處理,可以將二者事件控制碼都指向自定義的過程yyy:
Procedure TForm1.yyy(Sender:TObject); begin  (sender as TcustomEdit).text:='This is some demo text'; end;

在過程中,As操作符將TEdit類和TMemo類均強制轉換成TCustomEdit類,再對TCustomEdit類的屬性賦值。注意這種轉換必須符合Delphi中類的層次關係哦!

通過上面的分析,不難理解william和T.J.B兩位前輩Form1.PageControl1Change(Form1.PageControl1)的方法了

小弟也是初通皮毛,謬誤肯定是有的,肯請各位指正,謝謝

原创粉丝点击