呼叫event的sender討論

內文】 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)的方法了

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值