如何砍掉一棵TreeView? |
|
jck1
一般會員 發表:53 回覆:67 積分:24 註冊:2002-05-23 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
引言: 我的一個程式 當程式執行時,會在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 發送簡訊給我 |
引言: 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. (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 發送簡訊給我 |
|
jck1
一般會員 發表:53 回覆:67 積分:24 註冊:2002-05-23 發送簡訊給我 |
引言: 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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |