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

請問物件可以自殺嗎?

答題得分者是:syntax
casper97
一般會員


發表:13
回覆:18
積分:11
註冊:2004-12-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-03-06 10:55:37 IP:203.74.xxx.xxx 訂閱
物件 new 出來,當它沒作用時,可以自己作  delete this ; 的動作嗎?
煩請各位高手不吝指教。
3Q~~

syntax
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-03-07 13:27:24 IP:61.64.xxx.xxx 訂閱
有何不可?
但不能放在解構式中,不然會錯,至於為什麼?也不難理解
因為重複已經 delete 中的東西,不能在被 delete 1 次
casper97
一般會員


發表:13
回覆:18
積分:11
註冊:2004-12-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-03-07 14:23:01 IP:203.74.xxx.xxx 訂閱
感謝 syntax 大大回覆:
我有個 Class ,內含兩個 VCL 元件(TPanel , TCppWebBrowser ),
我在 TCppWebBrowser 的 OnBeforeNavigate2 事件裡下 delete this; 敘述,
Compile OK 但在執行時會出現 EAccessViolation 的 Exception (vcl60.bpl),
我猜想是不是TCppWebBrowser 當時已被 delete,但還有其他觸發的事件未處理,
所造成的錯誤?

我應該如何解決呢?
3Q~~





Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-03-07 19:46:53 IP:211.22.xxx.xxx 未訂閱
最常設計的方式是把元件盤上的VCL元件直接放在FORM上面,當FORM Create時後就會連帶把其上的VCL元件也Create起來(由FORM的建構函數代勞),相對的當FORM消滅時其上存在的物件消滅也由FORM代勞影響。
現在你的Class是繼承某一種TComponent,而TPanel與TCppWebBrowser是額外附加在該Class裏的物件成員,那麼很自然的你就應該自己在該Class的建構函數(或適當的地方)裡把那兩個VCL物件new起來,而在適當時機裡或destructor裡面delete掉才是,這是一點建議;另外你在自訂的Class物件成員裏的TCppWebBrowser事件裡面delete this,我不懂你的用意為何!但是這種效果就好像被new出來的物件成員還沒正確delete掉之前,就要delete this,此時這個this指的是你自訂的Class(其Owner),當然會發生記憶體錯誤。以上為小弟對這個問題所做的認知,請參考!
===================引 用 文 章===================
感謝 syntax 大大回覆:
我有個 Class ,內含兩個 VCL 元件(TPanel , TCppWebBrowser ),
我在 TCppWebBrowser 的 OnBeforeNavigate2 事件裡下 delete this; 敘述,
Compile OK 但在執行時會出現 EAccessViolation 的 Exception (vcl60.bpl),
我猜想是不是TCppWebBrowser 當時已被 delete,但還有其他觸發的事件未處理,
所造成的錯誤?

我應該如何解決呢?
3Q~~





暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-03-08 00:22:33 IP:220.131.xxx.xxx 訂閱
沒有 delete this 這件事。你別想太多了。
只能由你的上一層來 delete 你。
換個角度。可以自己 new 自己嗎?
不可以吧。

===================引 用 文 章===================
物件 new 出來,當它沒作用時,可以自己作 delete this ; 的動作嗎?
煩請各位高手不吝指教。
3Q~~

syntax
尊榮會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-03-08 18:09:32 IP:61.64.xxx.xxx 訂閱
自己不能 new 自己
但是卻可以 delete 自己
這跟你無法生出自己,卻可以自殺,是一樣的道理
PS.純舉例,不建議自殺這種行為

===================引 用 文 章===================
沒有 delete this 這件事。你別想太多了。
只能由你的上一層來 delete 你。
換個角度。可以自己 new 自己嗎?
不可以吧。

===================引 用 文 章===================
物件 new 出來,當它沒作用時,可以自己作 delete this ; 的動作嗎?
煩請各位高手不吝指教。
3Q~~

syntax
尊榮會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-03-08 18:24:47 IP:61.64.xxx.xxx 訂閱
因為你沒有貼出完整程式碼,我只能猜
所以給你一點方向
你要做物件自我消滅的功能,必需要注意
1. 物件自我消滅的位置,不可以造成重複遞回消滅,不然必死
所以解構式內不能放,除非你連解構流程也有修更配合
2. 物件一旦開始消滅流程,不可以有任何地方呼叫到他,不然也是死
所以不能放在 事件 內,因為事件是被呼叫,結束後會回到自身處理剩下的事情,但無奈你已經之 delete 這時變成存取不存在的東西, 當然就錯誤囉

OnBeforeNavigate 被呼叫完後,還會做其他事,所以一定會完蛋,出錯是正常的
你要覆寫的是 在
OnBeforeNavigate 整個過程流程中的任意一個函式,或自己的程式,並加入判斷,如已經 delete 就不再繼續

所以,要看你要做什麼,來決定在那個位置 delete 自己
casper97
一般會員


發表:13
回覆:18
積分:11
註冊:2004-12-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-03-08 18:50:36 IP:203.74.xxx.xxx 訂閱
感謝各位的指導喔!
3Q~~
Casper


系統時間:2024-05-01 1:28:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!