全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1014
推到 Plurk!
推到 Facebook!

freeandnil 無法跑??

尚未結案
ROLAND168
一般會員


發表:39
回覆:49
積分:17
註冊:2003-02-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-27 23:56:56 IP:61.229.xxx.xxx 未訂閱
請教各位:      如下程式總無法編譯??
  for i:=0 to ComponentCount - 1 do
  begin
    if (Components[i] is TDataModule) then
    begin
      Components[i].free;
      freeandnil(Components[i]);  //此行無法編譯 Components 不是   
        // tobject的後代為何會錯??
    end;
  end;
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-28 16:57:35 IP:211.76.xxx.xxx 未訂閱
引言: 請教各位: 如下程式總無法編譯??

var
  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;
您好: 請您將 Code 改成紅色部分就可以了,因為 Components[i] 是 property 為 Read-Only; 發表人 - SouthWind 於 2003/12/28 17:03:48
ROLAND168
一般會員


發表:39
回覆:49
積分:17
註冊:2003-02-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-28 22:15:03 IP:61.229.xxx.xxx 未訂閱
引言:
引言: 請教各位: 如下程式總無法編譯??

var
  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;
如此可讓原 Components free 掉嗎?? 您好: 請您將 Code 改成紅色部分就可以了,因為 Components[i] 是 property 為 Read-Only; 發表人 - SouthWind 於 2003/12/28 17:03:48
ROLAND168
一般會員


發表:39
回覆:49
積分:17
註冊:2003-02-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-28 22:15:34 IP:61.229.xxx.xxx 未訂閱
引言:
引言: 請教各位: 如下程式總無法編譯??

var
  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;
您好: 請您將 Code 改成紅色部分就可以了,因為 Components[i] 是 property 為 Read-Only; 發表人 - SouthWind 於 2003/12/28 17:03:48
如此可讓原 Components free 掉嗎??
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-29 09:19:40 IP:203.66.xxx.xxx 未訂閱
引言:
引言: 您好: 請您將 Code 改成紅色部分就可以了,因為 Components[i] 是 property 為 Read-Only;
如此可讓原 Components free 掉嗎??
ROLAND168 您好: 我自己有實驗過,是可以的.... 您可以實驗一下,在 FreeAndNil 後再加上以下的 Code
  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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-29 10:01:14 IP:218.1.xxx.xxx 未訂閱
补充一点,这样释放的写法,最好倒作写 for i:=ComponentCount-1 downto 0 do     久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
ccchen
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-29 11:12:43 IP:218.163.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-29 15:06:21 IP:203.66.xxx.xxx 未訂閱
引言: 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;
Sorry!! 才疏學淺,見笑了... 感謝 ccchen 的指正,又上了一課.. 因為我試上面 code ,再將其重新 Search 一遍沒有找到 Component ,就以為有 Free & Set Nil ... 沒想到... 可否請教 1.為何 for i:=Componentcout-1 downto 0 do 倒回來跑比較好?? 2.如果只 Free 掉 Object , 不設 nil 會發生什麼事嗎??
ccchen
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-29 15:16:35 IP:218.163.xxx.xxx 未訂閱
引言: 因為我試上面 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-12-30 16:39:36 IP:203.66.xxx.xxx 未訂閱
引言: 如果用for i:=0 to componentcount-1 do 當找到, 進行刪除後, Components[] 中少了一個元件, 到最後就會"index out of bound" Free 掉 Object , 不設 nil 不會發生任何錯誤, 只是你若檢查原變數不會是nil吧了. 即: Memory釋放了, 但未設成nil. 於此處只能也只需Free即可.
感謝 ccchen 版主詳盡的回答,霎時茅舍頓開...
ROLAND168
一般會員


發表:39
回覆:49
積分:17
註冊:2003-02-26

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-12-30 21:48:51 IP:61.229.xxx.xxx 未訂閱
引言:
引言: 因為我試上面 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-12-31 10:39:27 IP:61.222.xxx.xxx 未訂閱
引言: Database1.free將database1此元件所配置之Memory釋放 DataBase1:=nil 則將Database1這個變數之內容設為nil FreeAndNil(DataBase1)則同時完成上述兩件.
觀念更清楚,受教了
系統時間:2024-05-19 19:03:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!