C++ Builder 使用 SelectDirectory 打开选择文件夹的对话框

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 &Directories, TSelectDirFileDlgOpts Options = TSelectDirFileDlgOpts() , const UnicodeString Title = UnicodeString(), const UnicodeString FolderNameLabel = UnicodeString(), const UnicodeString OkButtonLabel = UnicodeString());

  • 这个对话框允许选择多个文件夹;
  • 这个对话框需要 Vista 之后的操作系统,这个函数的内部是通过 Vista Dialogs 里面的 TFileOpenDialog 实现的。
参数 说明
const UnicodeString StartDirectory 弹出对话框的时候默认选择的文件夹
DynamicArray &Directories 返回用户选择的文件夹
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 个箭头所指位置:

Vista 之后的选择文件夹对话框
点击了 “选择文件夹” 按钮选择的文件夹

你可能感兴趣的:(C++ Builder 使用 SelectDirectory 打开选择文件夹的对话框)