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