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

TreeNode 的 Data 要如何釋放呢?

答題得分者是:bass15
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-11 10:22:40 IP:61.222.xxx.xxx 未訂閱
大家好,有問題想請教。 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-11 16:57:14 IP:210.65.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-11 17:40:40 IP:61.222.xxx.xxx 未訂閱
我有疑問, 根據 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-12 00:58:32 IP:61.59.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-17 21:45:15 IP:210.64.xxx.xxx 未訂閱
感謝 bass15 兄,問題已解決了 :-) -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
系統時間:2024-05-09 3:42:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!