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

  • 这个对话框允许选择多个文件夹;
  • 这个对话框需要 Vista 之后的操作系统,这个函数的内部是通过 Vista Dialogs 里面的 TFileOpenDialog 实现的。
参数 说明
const UnicodeString StartDirectory 弹出对话框的时候默认选择的文件夹
DynamicArray<UnicodeString> &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<UnicodeString> sDirectories;
    if(SelectDirectory(L"", sDirectories, TSelectDirFileDlgOpts() << sdAllowMultiselect, L"请选择存储的位置", L"文件夹名字", L"选择文件夹"))
    {
        UnicodeString sDir = L"你选择的位置是:";
        for(int i=0; i<sDirectories.Length; i++)
        {
            sDir += L"\r\n" + sDirectories[i];
        }
        ShowMessage(sDir);
    }
}

运行结果,SelectDirectory 函数后面 3 个参数显示在下面截图的 3 个箭头所指位置:

Vista 之后的选择文件夹对话框
点击了 “选择文件夹” 按钮选择的文件夹
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容