建立類似總管的目錄樹,列出所有磁碟機及其子目錄。使用 TTreeView + TImageList,核心 API 為 FindFirst/FindNext/FindClose 遞迴掃描。
typedef enum { dtUnknown, dtNoDrive, dtFloppy, dtFixed, dtNetwork, dtCDROM, dtRAM } TDriveType;
// 來源於 TDirectoryComboBox 內部使用的 TDriveType,非公開文件化
磁碟機類型判斷用 WinAPI GetDriveType (回傳上述枚舉值)。
bool __fastcall TForm1::InitDirectoryTree()
{
DriveCount = GetAllDrive(); // 取得磁碟機數量
DriveType = new TDriveType[DriveCount+1];
for (int i = DriveCount; i > 0; i--) {
TTreeNode *node = DirTree->Items->Item[i];
DriveType[i] = (TDriveType)GetDriveType(node->Text.c_str());
switch (DriveType[i]) {
case dtFloppy: case dtFixed: case dtNetwork: case dtCDROM: case dtRAM:
BrowseDirectory(node->Text, node); break; // 遞迴掃描
}
}
return true;
}
void __fastcall TForm1::BrowseDirectory(AnsiString Dir, TTreeNode *Node)
{
TSearchRec sr;
TTreeNode *subNode;
if (FindFirst(Dir + "*.*", faDirectory, sr) == 0) {
do {
if ((sr.Attr & faDirectory) && sr.Name != "." && sr.Name != "..") {
subNode = DirTree->Items->AddChild(Node, sr.Name);
BrowseDirectory(Dir + sr.Name + "\\", subNode); // 遞迴
}
} while (FindNext(sr) == 0);
FindClose(sr);
}
}
可將上述邏輯封裝為自訂 VCL 元件,替代 TDirectoryListBox/TDirectoryComboBox,提供更現代 (Win9x 風格) 的目錄瀏覽介面。