應用程式常需讓使用者選擇目錄(如掃毒路徑、匯出資料夾)。C++Builder 提供兩種主要實作途徑,各有優缺點。
SHBrowseForFolder(標準 Windows 風格)shlobj.h,流程:填 BROWSEINFO → 呼叫 SHBrowseForFolder → 以 SHGetPathFromIDList 取得路徑 → GlobalFreePtr 釋放 PIDL。AnsiString SelectFolder(AnsiString Caption) {
BROWSEINFO bi = {0};
bi.hwndOwner = Application->Handle;
bi.lpszTitle = Caption.c_str();
bi.ulFlags = BIF_RETURNONLYFSDIRS; // 僅檔案系統資料夾
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
if (!pidl) return "";
char path[MAX_PATH];
SHGetPathFromIDList(pidl, path);
GlobalFreePtr(pidl);
AnsiString result = path;
if (result.LastChar() != '\\') result += '\\';
return result;
}
SelectDirectory(類似檔案開啟/儲存對話框)FileCtrl.hpp,參數:目錄字串引用、選項集合(sdAllowCreate, sdPerformCreate, sdPrompt)、說明上下文。AnsiString SelectDir(AnsiString Dir) {
if (SelectDirectory(Dir, TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt, 0))
return Dir;
return "";
}
兩者均可封裝為通用函式,根據專案需求靈活切換。