TreeNode 的 Data 要如何釋放呢? |
答題得分者是:bass15
|
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
大家好,有問題想請教。 TreeNode 有個 Data 屬性很好用,可以拿來放一些有用的資訊。
我看到了很多的範例都是使用 struct,
就是先 new 一個 struct 再把它加到 TreeNode 的 Data 裡頭。 可是我看 BCB 的 Help 裡頭又說,
Data 不會隨著 TreeNode 被 free 而跟著 free. 那我想請問大家,要怎麼 free Data 呢? --
http://www.csie.nctu.edu.tw/~chtai/software.php
好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi chtai, 我是這樣用的,不知是否正確:
在 TreeView 的 OnDeletion 事件釋放 Data procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode); begin Dispose(Node.Data); end;---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman |
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
我有疑問,
根據 Help 的說明,OnDeletion 是在 delete node 時被呼叫。
可是我並不會主動呼叫 TreeView->Delete(Node); 那,在程式關閉時,程式本身會自動去執行 delete node 的動作,
而使得 OnDeletion 被呼叫到嗎?
還是我們得手動 Delete(Node) 再關閉程式呢? 另外再延伸問個問題。
我的 Data 是 struct, 裡頭有 TStringList *sl 這樣的元素。
所以在產生新的 struct 時,我也會用 sl = new TStringList; 來產生新的 sl
這個 sl 要怎麼刪除呢? --
http://www.csie.nctu.edu.tw/~chtai/software.php
好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us My Blog: http://blog.nelson.csie.us |
bass15
高階會員 發表:24 回覆:171 積分:119 註冊:2003-10-27 發送簡訊給我 |
Node是程式自己會去Delete. 但是Node->Data裡面的東西要自己清掉..
請參考以下修改自Help的Code... Button1是加入Node, Button2是清除全部Node裡的structure
//定義structure typedef struct MyRec { AnsiString FName, LName; TStringList * slList; } TMyRec; typedef TMyRec* PMyRec; void __fastcall TForm1::Button1Click(TObject *Sender) { PMyRec MyRecPtr; static int TreeViewIndex = 0; TTreeNodes* pItems; //new出要加入Node中的structure MyRecPtr = new TMyRec; MyRecPtr->FName = Edit1->Text; MyRecPtr->LName = Edit2->Text; MyRecPtr->slList = new TStringList; MyRecPtr->slList->Add(Edit1->Text); MyRecPtr->slList->Add(Edit2->Text); //加入Node 並把structure位置用AddObject記在Node->Data裡 pItems = TreeView1->Items; pItems->AddObject(NULL, "Item" IntToStr(TreeViewIndex), MyRecPtr); TreeViewIndex ; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { PMyRec MyRecPtr = NULL; //把每個Node裡紀錄的structure拿出來delete掉 for(int i=0 ; i< TreeView1->Items->Count;i ) { MyRecPtr = (PMyRec)TreeView1->Items->Item[i]->Data; if(MyRecPtr) { delete MyRecPtr->slList; //裡面的StringList也要Delete delete MyRecPtr; //Delete掉structure TreeView1->Items->Item[i]->Data = NULL; //把Node->Data指標清掉 } } } |
chtai
高階會員 發表:68 回覆:238 積分:116 註冊:2004-05-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |