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

C++Builder TreeView 動態載入目錄樹的三種策略與效能比較

     編輯:關於C++

將磁碟目錄結構載入 TTreeView 是檔案管理介面的經典需求。本文提出三種載入策略,由簡單到高效能逐步優化,並提供完整實作代碼。

策略一:啟動時完整遞迴載入(簡單但慢)

  • 遞迴函數 BrowseDirectory 一次走訪所有子目錄與檔案,建立完整樹狀節點。
  • 優點:節點展開極快(已在記憶體)。
  • 缺點:啟動慢、記憶體佔用大、大型磁碟可能卡死 UI。

策略二:延遲載入(虛擬模式,展開時載入下一層)

  • 啟動時僅建立根節點(磁碟機)。
  • OnChanging 事件中:若節點無子節點,動態列舉該路徑下的子目錄並加入。
  • 問題:無法預知子目錄是否還有下一層,導致節點左側不顯示「+」號,使用者無法直觀判斷是否可展開。

策略三:預載入兩層(折衷方案,推薦)

  • 啟動時建立根節點及其直接子目錄(第一層)。
  • OnChanging 時:對被展開節點的「每一個子節點」,若其無子節點,則列舉該子節點下的目錄(即載入第三層)。
  • 效果:節點永遠有正確的「+」號,展開響應快,記憶體隨使用增長。

關鍵代碼片段(策略三核心)

void __fastcall TForm1::TreeView3Change(TObject *Sender, TTreeNode *Node) {
    // 組合完整路徑
    AnsiString fullPath = Node->GetFullPath(); // 需自行實作或用迴圈向上拼接
    if (fullPath.LastChar() != '\\') fullPath += '\\';

    // 對 Node 的每個子節點,若尚無子節點則載入其下一層目錄
    for (int i = 0; i < Node->Count; i++) {
        TTreeNode *child = Node->Item[i];
        if (child->Count == 0) {
            TSearchRec sr;
            if (FindFirst(fullPath + child->Text + "\\*.*", faAnyFile, sr) == 0) {
                do {
                    if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..")
                        TreeView3->Items->AddChild(child, sr.Name);
                } while (FindNext(sr) == 0);
                FindClose(sr);
            }
        }
    }
}

文中包含三種策略的完整專案建立步驟、組件配置與事件代碼,開發者可直接比較體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved