範例展示啟動時建立「我的電腦」根節點,列出所有磁碟機 (A: 為軟碟機圖示,其餘為硬碟圖示),並遞歸掃描子目錄 (僅顯示第一層,展開時再載入下一層)。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
CurrentDir = GetCurrentDir();
UpdateTreeView();
UpdateListView(); // 配合 ListView 顯示檔案 (程式碼略)
}
void __fastcall TForm1::UpdateTreeView()
{
TTreeNode *rNode, *mNode;
TreeView1->Items->Clear();
rNode = TreeView1->Items->Add(NULL, "我的電腦");
rNode->ImageIndex = rNode->SelectedIndex = 1; // 我的電腦圖示
mNode = TreeView1->Items->AddChild(rNode, "A:");
mNode->ImageIndex = mNode->SelectedIndex = 2; // 軟碟機圖示
AddDirectory("A:", mNode);
for (int i = 1; i < DriveComboBox1->Items->Count; i++) {
AnsiString drv = AnsiString(char('B' + i)) + ":";
mNode = TreeView1->Items->AddChild(rNode, drv);
mNode->ImageIndex = mNode->SelectedIndex = 3; // 硬碟圖示
AddDirectory(drv, mNode);
}
}
void TForm1::AddDirectory(AnsiString path, TTreeNode *fNode)
{
TSearchRec sr;
TTreeNode *mNode;
if (FindFirst(path + "\\*.*", faDirectory, sr) == 0) {
do {
if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..") {
mNode = TreeView1->Items->AddChild(fNode, sr.Name);
mNode->ImageIndex = 0; mNode->SelectedIndex = 4; // 資料夾圖示
// 註解掉遞歸呼叫,改由展開事件動態載入
// AddDirectory(path + "\\" + sr.Name, mNode);
}
} while (FindNext(sr) == 0);
FindClose(sr);
}
}
void __fastcall TForm1::TreeView1Changing(TObject *Sender, TTreeNode *Node, bool &AllowChange)
{
Screen->Cursor = crHourGlass;
TSearchRec sr; TTreeNode *NodeTmp = Node;
AnsiString DirName, DirTmp;
// 組合完整路徑
DirName = Node->Text;
for (int i = Node->Level; i > 1; i--) {
NodeTmp = NodeTmp->Parent;
DirTmp = NodeTmp->Text;
if (DirTmp.SubString(DirTmp.Length(), 1) != "\\") DirTmp += "\\";
DirName.Insert(DirTmp, 0);
}
if (DirName.SubString(DirName.Length(), 1) != "\\") DirName += "\\";
// 掃描該節點下的子目錄
for (int j = 0; j < Node->Count; j++) {
if (Node->Item[j]->Count == 0) { // 尚未載入
if (FindFirst(DirName + Node->Item[j]->Text + "\\*.*", faAnyFile, sr) == 0) {
do {
if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..") {
Node->Item[j]->ImageIndex = 0;
Node->Item[j]->SelectedIndex = 4;
TreeView1->Items->AddChild(Node->Item[j], sr.Name);
}
} while (FindNext(sr) == 0);
FindClose(sr);
}
}
}
Screen->Cursor = crDefault;
}
TDriveComboBox 自動取得磁碟機清單。