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

動態元件釋放時ERROR

答題得分者是:hahalin
peterpcc
一般會員


發表:6
回覆:37
積分:13
註冊:2004-09-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-03 12:52:16 IP:221.239.xxx.xxx 未訂閱
v_arrayNum:=5;  //此數不固定,是抓資料後決定   v_num:=v_arrayNum;   while v_num>0 do           // 釋放   begin     xtfcLabel1[v_num-1].free;     xtRichEdit[v_num-1].free;     xtTabSheet[v_num-1].free;     v_num:=v_num+1;   end;    // if xtfcLabel1 <> nil then FreeAndNil(xtfcLabel1);        SetLength(xtTabSheet,v_ArrayNum);     //確定數目     SetLength(xtRichEdit,v_ArrayNum);     SetLength(xtfcLabel1,v_ArrayNum);     v_num:=0;     while v_num nil then FreeAndNil(xtTabSheet); 這兩種寫法都過不了關,請問我該如何才能釋放這動態元件呢?
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-03 13:05:24 IP:147.8.xxx.xxx 未訂閱
v_arrayNum:=5;  //此數不固定,是抓資料後決定
  v_num:=v_arrayNum;
  while v_num>0 do           // 釋放
  begin
    xtfcLabel1[v_num-1].free;
    xtRichEdit[v_num-1].free;
    xtTabSheet[v_num-1].free;
    dec(v_num);
  end;
http://pywong.hk.st http://www.lazybones.ca
peterpcc
一般會員


發表:6
回覆:37
積分:13
註冊:2004-09-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-03 13:34:55 IP:221.239.xxx.xxx 未訂閱
謝謝您,不過我剛剛修了這錯誤後,依然是原來的error. 請問我這樣的釋放方式是正確的嗎?
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-03 14:45:04 IP:61.222.xxx.xxx 未訂閱
可以用這樣方式釋放。    For I:=Low(xtTabSheet) to High(xtTabSheet) do
  if assigned(xtTabSheet[I]) then FreeAndNil(xtTabSheet[I]);    觀念上應該是這樣建立的。
xtTabSheet[v_num]:=tTabSheet.Create(Self);{指的是Form}
xtTabSheet[v_num].Parent := PageControl4;
xtTabSheet[v_num].PageControl:=PageControl4;
....
peterpcc
一般會員


發表:6
回覆:37
積分:13
註冊:2004-09-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-03 15:47:10 IP:221.239.xxx.xxx 未訂閱
剛剛試用過,很奇怪的是,元件並未釋放掉,一直增加,name名都是"回覆1".
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-03 16:03:33 IP:61.222.xxx.xxx 未訂閱
我試是正確的。 不曉得您出了什麼問題?
For I:=Low(xtTabSheet) to High(xtTabSheet) do
begin
  xtTabSheet[I]:=tTabSheet.Create(Self);
  xtTabSheet[I].Parent := PageControl4;
  xtTabSheet[I].PageControl:=PageControl4;
  xtTabSheet[I].Caption:='回覆' inttostr(I 1);      xtRichEdit[I] := TRichEdit.Create(Self);
  xtRichEdit[I].Parent := xtTabSheet[I];
  .....
end;
補充一點。在釋放物件後 For I:=Low(xtTabSheet) to High(xtTabSheet) do if assigned(xtTabSheet[I]) then FreeAndNil(xtTabSheet[I]); setLength(xtTabSheet,0);{或 Finalize(xtTabSheet);}
peterpcc
一般會員


發表:6
回覆:37
積分:13
註冊:2004-09-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-03 17:03:54 IP:221.239.xxx.xxx 未訂閱
謝謝您的熱心,我想先說一下我的企圖. 我想把一個問題,對方回覆的內容都顯示在PageControl上, 資料是從資料庫取得回覆的筆數,再動態產生TabSheet & 內中的元件.    按照您的做法來試做,我來回來回的按,就變成圖中那樣了.
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-03 17:19:46 IP:61.222.xxx.xxx 未訂閱
1. 可能是時機不對。什麼時機建立、什麼時機釋放。 2. 目前看來有二層。 [回復問題][此問題...追蹤]..... 是否為複數?若是,則陣列如何處理。 在 [此問題...追蹤]下是否又建立PageControl
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-03 17:30:06 IP:218.170.xxx.xxx 未訂閱
peterpcc你好 我做了個小範例,似乎還可以滿足你的需求    http://delphi.ktop.com.tw/loadfile.php?TOPICID=19049193&CC=426027    參考看看    
peterpcc
一般會員


發表:6
回覆:37
積分:13
註冊:2004-09-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-03 17:37:49 IP:221.239.xxx.xxx 未訂閱
謝謝二位的示範,我剛剛也做了一個測試,發現用botton的方式是可以消除掉, 但我若寫在同一程式內時就出問題了. 我是先查有沒有產生過,有就清除,再產生. 後來清除那段我將之換到一個獨立的botton上,按botton後果然能去除TabSheet 如果這樣的話,我能在哪處去下 For I:=Low(xtTabSheet) to High(xtTabSheet) do if assigned(xtTabSheet[I]) then FreeAndNil(xtTabSheet[I]); setLength(xtTabSheet,0); 這段敘述呢?
peterpcc
一般會員


發表:6
回覆:37
積分:13
註冊:2004-09-27

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-12-03 17:50:39 IP:221.239.xxx.xxx 未訂閱
謝謝hahalin. 最後發現,只要用hahalin寫的 PageControl4.Pages[v_num].Free; 這樣的方式,就能完全去除掉TabSheet了.
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-12-03 18:01:28 IP:218.170.xxx.xxx 未訂閱
你還是要注意一下 tabsheet內的控制項,他的owner是誰... 如果owner不是tabsheet,那麼在tabsheet free後,這些控制項還是沒有free掉喔!
系統時間:2024-11-23 20:47:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!