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

一個關於TreeView控制項重複添加資料的問題

答題得分者是:RedSnow
jean2004
初階會員


發表:69
回覆:80
積分:39
註冊:2004-12-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-08 13:03:54 IP:222.135.xxx.xxx 未訂閱
一個關於TreeView控制項重複添加資料的問題    各位高手,我的TreeView控制項內容如圖所示,當我在“隨機1”裏添加比如“技術科”時,如果技術科已經存在了,就不添加,如何實現?
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-08 19:28:02 IP:59.115.xxx.xxx 未訂閱
jean2004 您好:    試試看下列動作是否您需要的?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TTreeNode* node = TreeView1->Selected;  // 取得被點選的項目
    bool isExist = false;  // 是否重覆的旗號,初值設為 '否定'
    for(int i=0; iCount; i  ){  // 比對被點選項目的所有子項目
        if(node->Item[i]->Text == Edit1->Text){ // 若與其中一個子項目的名稱與 Edit1 的 Text 相同
            isExist = true;  // 設定旗號為 '肯定' 值
            break;
        }
    }        if (!isExist) {  // 如果沒有重覆,就新增子項目
        TreeView1->Items->AddChild(node,Edit1->Text); // 設 Edit1 的 Text 為新增子項目名稱
    }
}
7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/08/08 19:29:16
jean2004
初階會員


發表:69
回覆:80
積分:39
註冊:2004-12-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-09 07:45:25 IP:222.135.xxx.xxx 未訂閱
大蝦,我的是運行一個按鈕就分析添加的,沒有點選TreeView控制項中的專案的,不知道大蝦的代碼我要如何改進?具體的說就是有幾組有分割符的字串,舉三組例子如下:    隨即1\質保部\技術科
隨即2\質保部\技術科
隨即1\質保部\設備科    我的代碼如下:
  void __fastcall BrowDir(TTreeNodes * Nodes,AnsiString iTemp,TTreeNode * Num)//自定義函數BrowDir
  {
      while(iTemp.AnsiPos("\\\\"))//迴圈條件
      {//去掉重複的“\”
        iTemp=StringReplace(iTemp, "\\\\", "\\", TReplaceFlags()<AddChild(Laye2,_StringSegment(iTemp , "\\" , i));
        Laye2=Layel;
      }
  }
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //Edit控制項中的文本類似:“Edit1\asdf\ASDF12\2red\sdgt”
  AnsiString iTemp=Edit1->Text;
  BrowDir(TreeView1->Items,iTemp,TreeView1->Items->Add(NULL,"天潤曲軸"));
}    _TrimStr函數是以“\”為分割符分解字串的自定義函數;
不知道要怎麼寫代碼?
發表人 - jean2004 於 2005/08/09 08:00:28
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-10 02:44:36 IP:61.230.xxx.xxx 未訂閱
jean2004 您好:    我又做了些測試,下列範例應該可以符合您的需求,試試看吧:
// 設定下列三項全域變數
int CheckLevel;
TTreeNode *LastLevel;
bool isOver = false;    // 下列兩個自定程序
void __fastcall GetLastLevel(TTreeNode *Node, TStringList *nl)
{
    bool FoundInThisLevel = false;        if (Node->Count > 0) {    // 檢查 Node 是否有子節點?
        TTreeNode *subNode;
        for (int i=0; iCount; i  ) {
            subNode = Node->Item[i];
            if (subNode->Text == nl->Strings[subNode->Level]) {  // 如果某個節點與準備建立的項目同名
                if (Node->Level < CheckLevel && subNode->HasChildren) {
                    GetLastLevel(subNode, nl);    // 有子節點就進行遞迴處理
                } else if (Node->Level 1 == CheckLevel) {  // 如果比對到了最後一層
                    isOver = true;  // 代表整個設定資料是重覆的 (已存在)
                }
                FoundInThisLevel = true;  // 本層有找到相同名稱項目
                break;
            }
        }
    }        if (LastLevel == NULL && !FoundInThisLevel) {  // 若是找到最後一層,而沒有相同名稱的話
        LastLevel = Node;  // 設定要增加子節點的上一層節點
    }
}
//---------------------------------------------------------------------------    void __fastcall SetNode(TTreeNodes *Nodes, AnsiString dataPath)
{
    while (dataPath.AnsiPos("\\\\")) {  // 清除多餘的反斜線符號
        dataPath = StringReplace(dataPath, "\\\\", "\\", TReplaceFlags()<CommaText = dataPath;    // 拆解資料行為 nodeName        CheckLevel = nodeName->Count-1;
    isOver = false;
    LastLevel = NULL;        if (Nodes->Count > 0) {  // 若有節點資料
        TTreeNode *subNode;            for (int i=0; iCount; i  ) {
            subNode = Nodes->Item[i];
            if (subNode->Level == 0) {  // 此處僅比對第一層節點
                if (subNode->Text == nodeName->Strings[subNode->Level]) {  // 如果第一層某個節點與準備建立的項目同名
                    if (subNode->HasChildren) {  // 若節點內有子節點
                        GetLastLevel(subNode, nodeName);  // 進行找尋處理
                    }
                    break;
                }
            }
        }
    }        if (!isOver) {
        if (LastLevel == NULL) { // 如果需要新增主節點
            LastLevel = Nodes->Add(NULL, nodeName->Strings[0]);  // 新增一個主節點
        }            // 處理其後的子節點
        TTreeNode *tempNode = LastLevel;
        for (int i=LastLevel->Level 1; iCount; i  ) {  // 由未重覆的節點開始加入項目資料
            tempNode = Nodes->AddChild(tempNode, nodeName->Strings[i]);
        }
    }else{
        ShowMessage("項目已存在!");
    }
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
    SetNode(TreeView1->Items, Edit5->Text);
}
如果您另有未說明的需求,請自行修改上述範例,並自行做最佳化處理。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/08/10 02:46:53
jean2004
初階會員


發表:69
回覆:80
積分:39
註冊:2004-12-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-10 07:28:45 IP:222.135.xxx.xxx 未訂閱
感謝RedSnow大蝦,我的問題解決了,謝謝!!!
系統時間:2024-05-09 22:07:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!