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

關於TreeView找父節點.

尚未結案
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-15 17:27:08 IP:163.28.xxx.xxx 未訂閱
請問我有一個XML檔案顯示於TreeView1裡面.XML檔案內容如下: 如果我選擇了A21那個Node之後,要在A21那個Node找出他的父節點,顯示於TreeView2內.如下: Root A A2 A21 並從TreeView2存成XML檔. 請問我該怎麼做? 目前我只找的到A21的上一層,也就是A2而已.Code如下:
  for (int i=0; iSelectionCount; i  )
      {
       if (TreeView1->Selections[i]->Parent!=NULL)
           Memo1->Lines->Add(TreeView1->Selections[i]->Parent->Text " --> " TreeView1->Selections[i]->Text);
       else
           Memo1->Lines->Add(TreeView1->Selections[i]->Text);
      }
請幫忙這個程式該如何修改. 謝謝.
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-15 21:11:40 IP:61.62.xxx.xxx 未訂閱
下面這個小範例會把所選的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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-15 21:58:18 IP:163.28.xxx.xxx 未訂閱
Hello Zard, 感謝. 但是這個程式他會從最下層開始記錄,不曉得需要用什麼方式可以從最上層開始記錄? 謝謝.
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-15 22:48:13 IP:61.62.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-17 18:56:33 IP:163.28.xxx.xxx 未訂閱
這樣的確是可以的. 我要做到是把選擇的放置到另一個,如圖: 如果選擇A11那個點,則可以在又邊顯示出: root A A1 A11 再選擇另一個點B21之後,則顯示: root A A1 A11 B B2 B21 請教該如何做到這樣? 謝謝.
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-18 10:18:50 IP:211.23.xxx.xxx 未訂閱
用一個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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-18 11:25:35 IP:163.28.xxx.xxx 未訂閱
Thanks. 但是這樣是只可以判斷Root是否已匯出,但其它節點則沒辦法了.. 且輸出要在TreeView上,這樣處理是否比較複雜? 可否指教一下,謝謝.
系統時間:2024-05-12 10:26:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!