線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5196
推到 Plurk!
推到 Facebook!

關於sender參數

尚未結案
liouville
一般會員


發表:4
回覆:4
積分:1
註冊:2003-10-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-19 12:06:46 IP:218.166.xxx.xxx 未訂閱
假設我在一個form中拉一個button元件,在元件上雙按 然後在button元件的onlick事件上寫下如下的碼 procedrure TForm1.Button1click(Sender : TObjct) 那當我run程式時按button扭,則sender是表示button 那麼button元件本來的型態是tbutton,當他當成sender時 有轉型成tobject嗎?
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-19 12:40:55 IP:203.222.xxx.xxx 未訂閱
Sender 從來就不會是其他型態 一開始就很明顯 procedrure TForm1.Button1click(Sender : TObjct) 早就宣告了 怎會是 TButton ? Sender 是 TButton 的一個 refence 所以要 typecase 才能用成 TButton --> (Sender as TButton).Enabled := True;
liouville
一般會員


發表:4
回覆:4
積分:1
註冊:2003-10-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-19 17:39:18 IP:218.166.xxx.xxx 未訂閱
引言: Sender 從來就不會是其他型態 一開始就很明顯 procedrure TForm1.Button1click(Sender : TObjct) 早就宣告了 怎會是 TButton ? Sender 是 TButton 的一個 refence 所以要 typecase 才能用成 TButton --> (Sender as TButton).Enabled := True; 但是為何我用showmessage(sender.classname)市顯示TButton呢? 因為這邊讓我覺得很怪,它顯示的並非是TObjectㄚ?
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-20 06:53:30 IP:203.222.xxx.xxx 未訂閱
都說了不是 TButton 是 TButton 的 reference 本身是 TObject sender.classname 當然是傳回 TButton class 因為 sender 只是一個 reference 到 TButton 的 TObject 就像指標一樣,本身是指標,但是卻能存取物件或變數 just like aPointer: Poniter; aPointer := ATButton TObject(aPointer).classname --> TButton Class TButton(aPointer).classname --> still TButton Class 因為只是一個 reference, 指向 TButton 去翻 Object Pascall 的書,書上都也寫
liouville
一般會員


發表:4
回覆:4
積分:1
註冊:2003-10-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-20 10:23:00 IP:211.23.xxx.xxx 未訂閱
引言: 都說了不是 TButton 是 TButton 的 reference 本身是 TObject sender.classname 當然是傳回 TButton class 因為 sender 只是一個 reference 到 TButton 的 TObject 就像指標一樣,本身是指標,但是卻能存取物件或變數 just like aPointer: Poniter; aPointer := ATButton TObject(aPointer).classname --> TButton Class TButton(aPointer).classname --> still TButton Class 因為只是一個 reference, 指向 TButton 去翻 Object Pascall 的書,書上都也寫
對不起...我的觀念有點模糊,希望您別介意.. 那麼照這樣説話..sender本身是TObject,但是他參考到TButton囉? 那麼在使用上,sender是不是可以使用TButton的property or method呢? 但是結果是不行的.. 我搞不清處reference的特性...因為對object pascal不是很熟 別見怪....^^
jason_cyl329
高階會員


發表:123
回覆:155
積分:105
註冊:2003-05-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-21 14:18:56 IP:61.218.xxx.xxx 未訂閱
基本上是可以用的,但是要透過轉型, 像在C中把它轉成dynamic_cast(Sender)->Button的屬性就可以用
jason_cyl329
高階會員


發表:123
回覆:155
積分:105
註冊:2003-05-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-21 14:22:37 IP:61.218.xxx.xxx 未訂閱
抱歉應該是dynamic_cast(Sender)->Button的屬性
jason_cyl329
高階會員


發表:123
回覆:155
積分:105
註冊:2003-05-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-21 14:24:43 IP:61.218.xxx.xxx 未訂閱
dynamic_cast(Sender)->Button的屬性 或是(TButton*)Sender->
wpf
一般會員


發表:11
回覆:22
積分:6
註冊:2002-04-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-21 21:22:46 IP:211.161.xxx.xxx 未訂閱
delphi的語法應該是(sender as Tbutton).xxxxxxx
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-22 09:56:10 IP:218.163.xxx.xxx 未訂閱
引言: 假設我在一個form中拉一個button元件,在元件上雙按 然後在button元件的onlick事件上寫下如下的碼 procedrure TForm1.Button1click(Sender : TObjct) 那當我run程式時按button扭,則sender是表示button 那麼button元件本來的型態是tbutton,當他當成sender時 有轉型成tobject嗎?-->這可不是轉型
試想一下, 如果你讓某一個MenuItem的click也接向TForm1.Button1click(Sender : TObjct). 或者你也可以在其他程式的任何位置直接呼叫此method,而不經由任何元件之觸發 也就是此method可能由不同之元件觸發, 那麼傳入之參數就可能不是TButton了 因此delphi將此method接受之參數宣告為TObject-->表示所有繼承至TObject之物件均可當做參數傅入. 當你DoubleClick Button時, Delphi幫你呼叫了此Method並將該Button傳入做為參數, 此時實際傳入之物件當然是Button, 只是變數宣告為TObject罷了, 你可以將之轉型為TButton來存取TButton之property--如果傳入之物件不是TButton, 你可不能將之轉為TButton 如果你讓某一個MenuItem的click也接向此Method, 那麼此Menu Click時, 呼叫此method, 傳入之參數實際上就是Menu了, 如果你case成TButton就完了 故在Button1Click中正確的寫法應該是 if Sender is TButton then with (Sender as TButton) do begin .. 檢查傳入之參數是否TButton, 然後轉型成TButton來處理
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-10-24 17:20:53 IP:203.203.xxx.xxx 未訂閱
恩 不會就要問, 沒人會怪你 但是書要看 reference 指的是一種連結參考關係 Sender 是 TObject TButton 是 TButton, 也是 TObject 的後代 所以 TButton 與 Sender 在某部分的功能是相同與相容的 而 TButton 自己所延伸附加的功能, 是不能被 TObject 所使用的 就如同今天你會 唱歌 但不會跳舞, 而未來的你會唱歌也會跳舞, 唱歌是繼承以前的能力, 跳舞是後來附加的能力, 所以今天的你是不會懂如何跳舞的 因為 TObject 與 TButton 是相容的, 而且所有的物件變數, 所含的也不過是一個記憶體的位址, 所以才會說 Sender 是 TButton 的一個 reference, 兩者的值其實是一樣的, 都是指向該 TButton 的記憶體位址的值 而當你企圖使用 TObject 所沒有(但是 TButton 有)的能力時, 雖然都是指向 TButton, 但是 TObject 卻沒有處理該能力的資訊與方法, 所以就會出錯, 而當你將之 typecast 為 TButton 後, 就沒問題了 就如同未來的你回到今天, 那個你就會跳舞了 至於如何轉型, 有兩種 1.強制轉型 TButton(Sender).xxx 2.安全轉型 (Sender as TButton).xxx 強制轉型, 出錯時沒有 "例外" 保護機制, 而安全轉型有 除非你百分之百確定, 否則不要用強制轉型 另外若是你喜歡用 TButton(Sender).xx 的方法, 哪也要加入安全的處理 如 if sender is TButton then TButton(Sender).xxx else 提出例外 (以上寫法相當於安全轉型, 其實也就是安全轉型幫我們做的事) 不過因為 TObject 是所有物件的始祖, 所以任何物件都可以用 TObject 來做 reference, 用以簡化程式的寫作, 讓很多地方都長的一樣,而一樣的東西只要寫一次, 這是寫作的技巧 當然你要直接傳入 TButton 也是可以的, 只是這樣 Delphi 將會有很多地方的程式碼框架(Delphi 自動幫你增加的部分), 原本長的一樣, 會變成不一樣, 那就又要多許多程式碼框架資料了
系統時間:2024-06-16 16:34:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!