首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

TreeView 載入目錄樹結構:遞迴遍歷 FindFirst/FindNext + TTreeNodes AddChild

     編輯:VC 教學

元件配置

  • `TTreeView` (名 `TreeView1`)
  • `TEdit` (名 `Edit1`, Text=`C:\`) 指定根目錄。
  • `TButton` (名 `BtnLoad`, Caption=`載入 TreeView`)
  • `TButton` (名 `BtnClear`, Caption=`清除`)
  • `TAnimate` (名 `Animate1`, CommonAVI=`aviFindComputer`) 顯示掃描動畫。

遞迴函式宣告


void __fastcall BrowDir(TTreeNodes *Nodes, AnsiString Path, TTreeNode *ParentNode);

載入按鈕事件


void __fastcall TForm1::BtnLoadClick(TObject *Sender)
{
    TreeView1->Items->Clear();
    Animate1->Active = true;
    TTreeNode *root = TreeView1->Items->Add(NULL, "我的電腦");
    root->ImageIndex = root->SelectedIndex = 0;
    BrowDir(TreeView1->Items, Edit1->Text, root);
    Animate1->Active = false;
}

遞迴實作


void __fastcall BrowDir(TTreeNodes *Nodes, AnsiString Path, TTreeNode *Parent)
{
    TSearchRec sr;
    AnsiString searchPath = IncludeTrailingPathDelimiter(Path) + "*.*";
    if (FindFirst(searchPath, faDirectory, sr) == 0) {
        do {
            if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..") {
                TTreeNode *node = Nodes->AddChild(Parent, sr.Name);
                node->ImageIndex = 1; node->SelectedIndex = 2; // 目錄圖示
                // 遞迴子目錄 (視效能可選擇延遲載入)
                BrowDir(Nodes, IncludeTrailingPathDelimiter(Path) + sr.Name, node);
            }
        } while (FindNext(sr) == 0);
        FindClose(sr);
    }
}

效能優化:延遲載入 (OnExpanding)

大目錄樹遞迴會卡死 UI。改為:`AddChild` 時附加一個假子節點 (文字「載入中...」);`TreeView1->OnExpanding` 事件中移除假節點,實際 `FindFirst` 並 `AddChild` 真實子目錄。

清除按鈕


TreeView1->Items->Clear();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved