利用 TTreeView + TImageList 實作類似總管的目錄樹:根節點為「我的電腦」,子節點列出所有磁碟機 (A: 起),展開節點時遞迴列出子目錄。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
CurrentDir = GetCurrentDir();
UpdateTreeView();
UpdateListView(); // 假設同步顯示檔案列表
}
void __fastcall TForm1::UpdateTreeView()
{
TTreeNode *root, *drvNode;
TreeView1->Items->Clear();
root = TreeView1->Items->Add(NULL, "我的電腦");
root->ImageIndex = root->SelectedIndex = 1; // 圖示索引
drvNode = TreeView1->Items->AddChild(root, "A:\\");
drvNode->ImageIndex = drvNode->SelectedIndex = 2;
AddDirectory("A:\\", drvNode);
for (int i = 1; i < DriveComboBox1->Items->Count; i++) {
AnsiString drv = AnsiString(char('B'+i)) + ":\\";
drvNode = TreeView1->Items->AddChild(root, drv);
drvNode->ImageIndex = drvNode->SelectedIndex = 3;
AddDirectory(drv, drvNode);
}
}
void TForm1::AddDirectory(AnsiString path, TTreeNode *parent)
{
TSearchRec sr;
TTreeNode *node;
if (FindFirst(path + "*.*", faDirectory, sr) == 0) {
do {
if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..") {
node = TreeView1->Items->AddChild(parent, sr.Name);
node->ImageIndex = 0; node->SelectedIndex = 4;
// AddDirectory(path + sr.Name + "\\", node); // 如需深層遞迴請啟用
}
} while (FindNext(sr) == 0);
FindClose(sr);
}
}
void __fastcall TForm1::TreeView1Changing(TObject *Sender, TTreeNode *Node, bool &AllowChange)
{
Screen->Cursor = crHourGlass;
// 組合完整路徑
AnsiString fullPath = Node->Text;
for (TTreeNode *p = Node->Parent; p && p->Level > 0; p = p->Parent) {
AnsiString txt = p->Text;
if (txt.SubString(txt.Length(),1) != "\\") txt += "\\";
fullPath = txt + fullPath;
}
if (fullPath.SubString(fullPath.Length(),1) != "\\") fullPath += "\\";
// 針對尚未載入子節點的項目 (Count==0) 進行載入
for (int j = 0; j < Node->Count; j++) {
TTreeNode *child = Node->Item[j];
if (child->Count == 0) {
TSearchRec sr;
if (FindFirst(fullPath + child->Text + "\\*.*", faAnyFile, sr) == 0) {
do {
if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..") {
child->ImageIndex = 0; child->SelectedIndex = 4;
TreeView1->Items->AddChild(child, sr.Name);
}
} while (FindNext(sr) == 0);
FindClose(sr);
}
}
}
Screen->Cursor = crDefault;
}
此法採延遲載入,展開時才讀取子目錄,效能優於一次性遞迴全盤。可搭配 TDriveComboBox 取得磁碟機清單。