freeandnil 無法跑?? |
尚未結案
|
ROLAND168
一般會員 發表:39 回覆:49 積分:17 註冊:2003-02-26 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 請教各位: 如下程式總無法編譯??您好: 請您將 Code 改成紅色部分就可以了,因為 Components[i] 是 property 為 Read-Only; 發表人 - SouthWind 於 2003/12/28 17:03:48var tmpComponent:TComponent; .......... for i:=0 to ComponentCount - 1 do begin if (Components[i] is TDataModule) then begin // Components[i].free; // freeandnil(Components[i]); tmpComponent := Components[i]; freeandnil(tmpComponent); end; end; |
ROLAND168
一般會員 發表:39 回覆:49 積分:17 註冊:2003-02-26 發送簡訊給我 |
引言:引言: 請教各位: 如下程式總無法編譯??如此可讓原 Components free 掉嗎?? 您好: 請您將 Code 改成紅色部分就可以了,因為 Components[i] 是 property 為 Read-Only; 發表人 - SouthWind 於 2003/12/28 17:03:48var tmpComponent:TComponent; .......... for i:=0 to ComponentCount - 1 do begin if (Components[i] is TDataModule) then begin // Components[i].free; // freeandnil(Components[i]); tmpComponent := Components[i]; freeandnil(tmpComponent); end; end; |
ROLAND168
一般會員 發表:39 回覆:49 積分:17 註冊:2003-02-26 發送簡訊給我 |
引言:如此可讓原 Components free 掉嗎??引言: 請教各位: 如下程式總無法編譯??您好: 請您將 Code 改成紅色部分就可以了,因為 Components[i] 是 property 為 Read-Only; 發表人 - SouthWind 於 2003/12/28 17:03:48var tmpComponent:TComponent; .......... for i:=0 to ComponentCount - 1 do begin if (Components[i] is TDataModule) then begin // Components[i].free; // freeandnil(Components[i]); tmpComponent := Components[i]; freeandnil(tmpComponent); end; end; |
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言:ROLAND168 您好: 我自己有實驗過,是可以的.... 您可以實驗一下,在 FreeAndNil 後再加上以下的 Code引言: 您好: 請您將 Code 改成紅色部分就可以了,因為 Components[i] 是 property 為 Read-Only;如此可讓原 Components free 掉嗎?? for i:=0 to ComponentCount - 1 do begin if (Components[i] is TDataModule) then begin ShowMessage('TDataModule found!!'); end; end;如果沒有彈出 'TDataModule found!!' 訊息就 OK 啦... 修正一下我之前講的,嚴格說起來說 property 是 Read-Only 是不太對的... 詳情請看 property 的 Help 說明 .... |
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
1. Free 和 設成nil 基本上是兩件事
假設你有一元件DataBase1:TDatabase, 則DataBas1只是一個變數,是一個object reference, 指向一塊memory, 此memory含TDatabase元件之一切
Database1.free將database1此元件所配置之Memory釋放
DataBase1:=nil 則將Database1這個變數之內容設為nil
FreeAndNil(DataBase1)則同時完成上述兩件. 2.
for i:=0 to ComponentCount - 1 do //應改為for i:=Componentcout-1 downto 0 do begin if (Components[i] is TDataModule) then begin Components[i].free; freeandnil(Components[i]); //1.前一行已free,不可再free一次 //2.想一想, 你可以free 此元件所占之memory, 但無法知道此元件變數所在之位址, 因此無法給定nil,所以compiler告訴你此處須接受一var .而components[i]只指名了元件之位置卻不知變數何在故compiler視為constant. end; end;3.var tmpComponent:TComponent; ... tmpComponent := Components[i]; freeandnil(tmpComponent); 這Compiler是可以過, 不過沒什麼意義, 該TDataBase是Free了, 但是tmpComponent這個變數被assign成nil, 原來的變數並不會被assign成nil 4. 因此如下即可 for i:=ComponentCount - 1 down to 0 if (Components[i] is TDataModule) then TDataMoodule(Components[i]).free; |
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 1. Free 和 設成nil 基本上是兩件事 假設你有一元件DataBase1:TDatabase, 則DataBas1只是一個變數,是一個object reference, 指向一塊memory, 此memory含TDatabase元件之一切 Database1.free將database1此元件所配置之Memory釋放 DataBase1:=nil 則將Database1這個變數之內容設為nil FreeAndNil(DataBase1)則同時完成上述兩件. 2.Sorry!! 才疏學淺,見笑了... 感謝 ccchen 的指正,又上了一課.. 因為我試上面 code ,再將其重新 Search 一遍沒有找到 Component ,就以為有 Free & Set Nil ... 沒想到... 可否請教 1.為何 for i:=Componentcout-1 downto 0 do 倒回來跑比較好?? 2.如果只 Free 掉 Object , 不設 nil 會發生什麼事嗎??for i:=0 to ComponentCount - 1 do //應改為for i:=Componentcout-1 downto 0 do begin if (Components[i] is TDataModule) then begin Components[i].free; freeandnil(Components[i]); //1.前一行已free,不可再free一次 //2.想一想, 你可以free 此元件所占之memory, 但無法知道此元件變數所在之位址, 因此無法給定nil,所以compiler告訴你此處須接受一var .而components[i]只指名了元件之位置卻不知變數何在故compiler視為constant. end; end;3.var tmpComponent:TComponent; ... tmpComponent := Components[i]; freeandnil(tmpComponent); 這Compiler是可以過, 不過沒什麼意義, 該TDataBase是Free了, 但是tmpComponent這個變數被assign成nil, 原來的變數並不會被assign成nil 4. 因此如下即可for i:=ComponentCount - 1 down to 0 if (Components[i] is TDataModule) then TDataMoodule(Components[i]).free; |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
引言: 因為我試上面 code ,再將其重新 Search 一遍沒有找到 Component ,就以為有 Free & Set Nil ... 沒想到... 可否請教 1.為何 for i:=Componentcout-1 downto 0 do 倒回來跑比較好?? 2.如果只 Free 掉 Object , 不設 nil 會發生什麼事嗎??如果用for i:=0 to componentcount-1 do 當找到, 進行刪除後, Components[] 中少了一個元件, 到最後就會"index out of bound" Free 掉 Object , 不設 nil 不會發生任何錯誤, 只是你若檢查原變數不會是nil吧了. 即: Memory釋放了, 但未設成nil. 於此處只能也只需Free即可. |
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
|
ROLAND168
一般會員 發表:39 回覆:49 積分:17 註冊:2003-02-26 發送簡訊給我 |
引言:再次感謝版主!!引言: 因為我試上面 code ,再將其重新 Search 一遍沒有找到 Component ,就以為有 Free & Set Nil ... 沒想到... 可否請教 1.為何 for i:=Componentcout-1 downto 0 do 倒回來跑比較好?? 2.如果只 Free 掉 Object , 不設 nil 會發生什麼事嗎??如果用for i:=0 to componentcount-1 do 當找到, 進行刪除後, Components[] 中少了一個元件, 到最後就會"index out of bound" Free 掉 Object , 不設 nil 不會發生任何錯誤, 只是你若檢查原變數不會是nil吧了. 即: Memory釋放了, 但未設成nil. 於此處只能也只需Free即可. |
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |