SelectDirectory 可以打开 3 种不同的打开文件夹对话框。
- 目前比较常用的选择文件夹对话框
- 老式的选择文件夹对话框
- 和选择文件一样的选择文件夹对话框
一. 目前比较常用的选择文件夹对话框
bool __fastcall SelectDirectory(const UnicodeString Caption, const WideString Root, UnicodeString &Directory, TSelectDirExtOpts Options = TSelectDirExtOpts() << TSelectDirExtOpt::sdNewUI, TWinControl *Parent = NULL);
参数 | 说明 |
---|---|
const UnicodeString Caption | 对话框标题 |
const WideString Root | 只显示这个路径里面的文件夹。 空字符串为没有限制 |
UnicodeString &Directory | 返回用户选择的文件夹 |
TSelectDirExtOpts Options | 选项,默认选项为 sdNewUI |
TWinControl *Parent | 对话框的父窗口,默认为 NULL |
选项 | 说明 |
---|---|
sdNewUI | 新版UI,对话框可以改变大小,可以拖拽和使用右键菜单,允许包含创建新文件夹按钮 |
sdNewFolder | 显示新建文件夹按钮,选项需要包含 sdNewUI |
sdShowEdit | 显示文件夹名称编辑框 |
sdShowShares | 显示网络上其他电脑共享的文件夹,选项需要包含 sdNewUI |
sdShowFiles | 显示文件,如果不包含这个选项则只显示文件夹 |
sdValidateDir | 这个选项需要同时包含 sdShowEdit,如果编辑里面的内容改变了会触发 TBrowseForFolder::OnValidate 事件【注1】 |
【注1】这个 SelectDirectory 函数的内部是通过 TBrowseForFolder 来实现的,如果需要这个功能,需要在程序里面直接使用 TBrowseForFolder 这个类来完成这个功能,SelectDirectory 函数无法使用 OnValidate 事件。
例子:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
UnicodeString sDir;
if(SelectDirectory(L"请选择存储的位置", L"", sDir, TSelectDirExtOpts() << TSelectDirExtOpt::sdNewUI << TSelectDirExtOpt::sdNewFolder << TSelectDirExtOpt::sdShowEdit, this))
{
ShowMessage(L"你选择的位置是:\r\n" + sDir);
}
}
运行结果:
二. 老式的选择文件夹对话框
bool __fastcall SelectDirectory(System::UnicodeString &Directory, TSelectDirOpts Options, int HelpCtx);
参数 | 说明 |
---|---|
UnicodeString &Directory | 返回用户选择的文件夹 |
TSelectDirOpts Options | 选项 |
int HelpCtx | 帮助索引 |
选项 | 说明 |
---|---|
sdAllowCreate | 显示文件夹名字的编辑框 |
sdPerformCreate | 允许新建文件夹,需要与 sdAllowCreate 同时使用 |
sdPrompt | 提示是否新键文件夹,需要与 sdAllowCreate 和 sdPerformCreate 同时使用 |
例子:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
UnicodeString sDir;
if(SelectDirectory(sDir, TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt, 0))
{
ShowMessage(L"你选择的位置是:\r\n" + sDir);
}
}
运行结果:
三. 和选择文件一样的选择文件夹对话框
bool __fastcall SelectDirectory(const UnicodeString StartDirectory, DynamicArray
- 这个对话框允许选择多个文件夹;
- 这个对话框需要 Vista 之后的操作系统,这个函数的内部是通过 Vista Dialogs 里面的 TFileOpenDialog 实现的。
参数 | 说明 |
---|---|
const UnicodeString StartDirectory | 弹出对话框的时候默认选择的文件夹 |
DynamicArray |
返回用户选择的文件夹 |
TSelectDirFileDlgOpts Options | 选项 |
const UnicodeString Title | 标题 |
const UnicodeString FolderNameLabel | 文件夹名的标签 |
const UnicodeString OkButtonLabel | 确定按钮显示的文字 |
选项 | 说明 |
---|---|
sdHidePinnedPlaces | 隐藏指定的文件夹【注2】 |
sdNoDereferenceLinks | 如果包含了这个选项,文件夹的快捷方式当作一个文件处理了,是一个后缀为 .lnk 的文件 |
sdForceShowHidden | 显示隐藏的文件夹 |
sdAllowMultiselect | 允许选择多个文件夹 |
【注2】这个函数内部是通过 IFileDialog 实现的,这个选项隐藏的是通过 IFileDialog::AddPlace 添加的项目,对于这个函数来说,无法访问 IFileDialog,如果包含了这个选项只能是默认的情况,就是隐藏了所有的标准的路径,只剩下了经常访问的文件夹。
例子:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
DynamicArray sDirectories;
if(SelectDirectory(L"", sDirectories, TSelectDirFileDlgOpts() << sdAllowMultiselect, L"请选择存储的位置", L"文件夹名字", L"选择文件夹"))
{
UnicodeString sDir = L"你选择的位置是:";
for(int i=0; i
运行结果,SelectDirectory 函数后面 3 个参数显示在下面截图的 3 个箭头所指位置: