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

如何砍掉一棵TreeView?

 
jck1
一般會員


發表:53
回覆:67
積分:24
註冊:2002-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-05-30 15:29:01 IP:211.22.xxx.xxx 未訂閱
我的一個程式 當程式執行時,會在form activate時去load一些資料到TreeView裡 而該程式是以showmodal的方式執行的 這樣的話 我每次執行到該程式 那個TreeView就會越長越大,每次同樣的資料都會在load一次 我想到是不是該在form close時去砍掉這棵樹 或我應該把load的方法寫在其他form event呢? 又該怎麼砍樹呢? 謝謝!!
ccchen
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-05-30 17:51:03 IP:203.217.xxx.xxx 未訂閱
引言: 我的一個程式 當程式執行時,會在form activate時去load一些資料到TreeView裡 而該程式是以showmodal的方式執行的 這樣的話 我每次執行到該程式 那個TreeView就會越長越大,每次同樣的資料都會在load一次 我想到是不是該在form close時去砍掉這棵樹 或我應該把load的方法寫在其他form event呢? 又該怎麼砍樹呢? 謝謝!!
1.FormActive,每次執行到該程式均會重複執行, FormCreate, FormShow則不會 2. Treeview之Owner為Form, 故Form Free時會將此Treeview一起Free 3. Treeview1.items[0].delete可將所有Node清除 實際上任何node之delete,均會清除所有子node 4. (2),(3)之clear均不包含TreeNode中之Data,故若加入Treenode之Data為RunTime Create, 則須自行清除 例如可寫一procedure procedure ClearNode(t:TTreenode); var i:integer; begin if t.data <> nil then //若有Data Free it t.data.free; if t.HasChildren then //檢查是否有Child Node for i:=0 to t.count-1 do //對每一ChildNode, Recursive ClearNode(t.item[i]); t.delete; //最後再刪除此Node end; 可於FormClose--ClearNode(Treeview1.items[0]), 清除所有Node, 及其Data
jck1
一般會員


發表:53
回覆:67
積分:24
註冊:2002-05-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-05-31 10:06:53 IP:211.22.xxx.xxx 未訂閱
引言: 4. (2),(3)之clear均不包含TreeNode中之Data,故若加入Treenode之Data為RunTime Create, 則須自行清除 例如可寫一procedure procedure ClearNode(t:TTreenode); var i:integer; begin if t.data <> nil then //若有Data Free it t.data.free; if t.HasChildren then //檢查是否有Child Node for i:=0 to t.count-1 do //對每一ChildNode, Recursive ClearNode(t.item[i]); t.delete; //最後再刪除此Node end; 可於FormClose--ClearNode(Treeview1.items[0]), 清除所有Node, 及其Data
我寫了一個簡單的程式測了一下 但會出現List index out of bounds(%d)的錯誤。 另t.data.free好像編譯時會錯誤,我改成t.data:= nil不知可不可?? 測試程式:我加了10個node,如果該node是奇數,我再加他5個子node。 procedure TForm1.FormCreate(Sender: TObject); var i: integer; j: integer; aNode: TTreeNode; begin for i:= 1 to 10 do begin aNode:= TreeView1.Items.AddChild(nil, inttostr(i)); if((i mod 2) = 1)then begin for j:= 1 to 5 do begin TreeView1.Items.AddChild(aNode, inttostr(j)); end; end; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); procedure ClearNode(t:TTreenode); var i:integer; begin if t.data <> nil then //若有Data Free it t.data:= nil; if t.HasChildren then //檢查是否有Child Node for i:=0 to t.count-1 do //對每一ChildNode, Recursive ClearNode(t.item[i]); t.delete; //最後再刪除此Node end; begin ClearNode(TreeView1.Items[0]); end;
huwk
資深會員


發表:26
回覆:340
積分:323
註冊:2002-04-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-05-31 13:08:09 IP:61.218.xxx.xxx 未訂閱
引言:
引言: 4. (2),(3)之clear均不包含TreeNode中之Data,故若加入Treenode之Data為RunTime Create, 則須自行清除 例如可寫一procedure procedure ClearNode(t:TTreenode); var i:integer; begin if t.data <> nil then //若有Data Free it t.data.free; if t.HasChildren then //檢查是否有Child Node for i:=0 to t.count-1 do //對每一ChildNode, Recursive ClearNode(t.item[i]); t.delete; //最後再刪除此Node end; 可於FormClose--ClearNode(Treeview1.items[0]), 清除所有Node, 及其Data
我寫了一個簡單的程式測了一下 但會出現List index out of bounds(%d)的錯誤。 另t.data.free好像編譯時會錯誤,我改成t.data:= nil不知可不可?? 測試程式:我加了10個node,如果該node是奇數,我再加他5個子node。 procedure TForm1.FormCreate(Sender: TObject); var i: integer; j: integer; aNode: TTreeNode; begin for i:= 1 to 10 do begin aNode:= TreeView1.Items.AddChild(nil, inttostr(i)); if((i mod 2) = 1)then begin for j:= 1 to 5 do begin TreeView1.Items.AddChild(aNode, inttostr(j)); end; end; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); procedure ClearNode(t:TTreenode); var i:integer; begin if t.data <> nil then //若有Data Free it t.data:= nil; if t.HasChildren then //檢查是否有Child Node for i:=0 to t.count-1 do //對每一ChildNode, Recursive 改成 for i:=t.count-1 to 0 do ClearNode(t.item[i]); t.delete; //最後再刪除此Node end; begin ClearNode(TreeView1.Items[0]); end;
------
熊的學習 http://huwk.blogspot.com
ccchen
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-05-31 15:47:36 IP:163.29.xxx.xxx 未訂閱
1.huwk所改 for i:=t.count-1 to 0 do是對的, 不小心留下了bug 2. if t.data <> nil then begin t.data.free; //free memory t.data:=nil; //將t.data之pointer填入0(不在指向任何位置) end; 如上才算完整,free 與assign nil 意義完全不同
jck1
一般會員


發表:53
回覆:67
積分:24
註冊:2002-05-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-05-31 17:04:25 IP:211.22.xxx.xxx 未訂閱
引言: 1.huwk所改 for i:=t.count-1 to 0 do是對的, 不小心留下了bug 2. if t.data <> nil then begin t.data.free; //free memory t.data:=nil; //將t.data之pointer填入0(不在指向任何位置) end; 如上才算完整,free 與assign nil 意義完全不同
可是t.data.free;在編譯時會出現錯誤 record, object or class type required
系統時間:2024-04-27 11:27:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!