關於TreeView找父節點. |
尚未結案
|
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
請問我有一個XML檔案顯示於TreeView1裡面.XML檔案內容如下:
for (int i=0; i請幫忙這個程式該如何修改. 謝謝. |
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
下面這個小範例會把所選的node所有Parent一一列出來.
如果一Tree如下: Root A A2 A21 點選A21在Memo1所得的結果為 A21 A2 A Root void GetEachRoot(TTreeNode* node, TStrings* NodeList) { NodeList->Add(node->Text); if (node->Parent) GetEachRoot(node->Parent, NodeList); } void __fastcall TForm1::TreeView1Click(TObject *Sender) { Memo1->Lines->Clear(); if (TreeView1->Selected) { GetEachRoot(TreeView1->Selected, Memo1->Lines); } } |
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
|
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
引言: Hello Zard, 感謝. 但是這個程式他會從最下層開始記錄,不曉得需要用什麼方式可以從最上層開始記錄? 謝謝.其實從最下層找上去會比較有效率, 如果一定要從最上層開始找, 必須用上述的方法找到最上層, 在從最上層找下去, 這樣就必須多做一個loop, 不是比較沒效率? 如果你要的是從第一筆列印到最後一筆, 只要把TStrings倒過來取資料, 或是利用一些First-In-Last-Out的技巧把結果列出來, 不就是從第一筆開始了嗎?下面我用一個Stack來保存資料, 在列印的時利用First-In-Last-Out的特性自第一筆開始印 用這個方法若一Tree如下: Root A A2 A21 點選A21在Memo1所得的結果為 Root A A2 A21 void GetEachRoot(TTreeNode* node, TStack* NodeList) { NodeList->Push(node); if (node->Parent) GetEachRoot(node->Parent, NodeList); } void __fastcall TForm1::TreeView1Click(TObject *Sender) { Memo1->Lines->Clear(); if (TreeView1->Selected) { TStack* NodeList = new TStack(); GetEachRoot(TreeView1->Selected, NodeList); int iCount = NodeList->Count(); for(int i = 0; i < iCount; i ) { Memo1->Lines->Add( ((TTreeNode*)NodeList->Pop())->Text ); } delete NodeList; } }發表人 - zard 於 2005/02/15 22:49:45 |
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
|
Zard
尊榮會員 發表:24 回覆:396 積分:539 註冊:2003-11-26 發送簡訊給我 |
用一個Flag判斷是否Root已匯出, 若已匯出則不在處理Root
void GetEachRoot(TTreeNode* node, TStack* NodeList) { NodeList->Push(node); if (node->Parent) GetEachRoot(node->Parent, NodeList); } void __fastcall TForm1::Button1Click(TObject *Sender) { static BOOL bRootExported = FALSE; if (TreeView1->Selected) { TStack* NodeList = new TStack(); GetEachRoot(TreeView1->Selected, NodeList); if (bRootExported) (TTreeNode*)NodeList->Pop(); // 忽略Root else bRootExported = TRUE; int iCount = NodeList->Count(); for(int i= 0; i < iCount; i ) { Memo1->Lines->Add( ((TTreeNode*)NodeList->Pop())->Text ); } delete NodeList; } } |
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |