弹出选择目录对话框(选择文件夹)
代码
弹出Windows目录浏览器对话框
uses Vcl.FileCtrl;
procedure TForm1.Button1Click(Sender: TObject);
var
vPath: string;
begin
//默认选择的目录
vPath := 'D:\ceshi';
//sdAllowCreate 显示输入目录名称的编辑框“Directory Name:”
//sdPerformCreate 编辑框中目录不存在时会创建,返回编辑框中目录
//sdPrompt 录名称的编辑框中目录不存在时弹出确认框,选择“OK”时返回编辑框中目录,选择“Cancel”时返回默认选择的目录
if SelectDirectory(vPath, [sdAllowCreate, sdPrompt], 0) then
ShowMessage('选择的目录 ' + vPath);
end;
弹出Winapi的ShBrowseForFolder
对话框
uses Vcl.FileCtrl;
procedure TForm1.Button2Click(Sender: TObject);
var
vPath: string;
begin
//默认选择的目录
vPath := 'D:\ceshi';
//显示列表的根目录,空时显示全部
//sdNewUI 可调整大小,显示右键菜单
//sdNewFolder 显示“新建文件夹”按钮
//sdShowEdit 显示“文件夹”输入框
//sdValidateDir 验证插入编辑框中的文件夹/文件的名称
if SelectDirectory('弹出的标题', '', vPath, [sdNewUI, sdNewFolder, sdShowEdit, sdValidateDir], Self) then
ShowMessage('选择的目录 ' + vPath);
end;
D7中SelectDirectory
函数没有Options: TSelectDirExtOpts
参数,弹出的ShBrowseForFolder
对话框中没有 新建文件夹 按钮,通过直接调用API实现
uses FileCtrl, ShlObj, ActiveX;
function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall;
begin
if (uMsg = BFFM_INITIALIZED) and (lpData <> 0) then
SendMessage(Wnd, BFFM_SETSELECTION, Integer(True), lpdata);
result := 0;
end;
function SelectDirectoryB(const ACaption: string;
var ADirectory: string): Boolean;
var
BrowseInfo: TBrowseInfo;
Buffer: PChar;
ItemIDList: PItemIDList;
ShellMalloc: IMalloc;
begin
Result := False;
//判断默认选择目录是否存在,不存在时置为空
if not DirectoryExists(ADirectory) then
ADirectory := '';
//填充BrowseInfo结构体
FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
//获取IMalloc接口
if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
begin
//分配IMalloc大小为路径最大大小
Buffer := ShellMalloc.Alloc(MAX_PATH);
try
with BrowseInfo do
begin
hwndOwner := Application.Handle;
pidlRoot := nil;
pszDisplayName := Buffer;
//设置标题
lpszTitle := PChar(ACaption);
//设置标识
ulFlags := BIF_RETURNONLYFSDIRS or BIF_NEWDIALOGSTYLE;
//设置默认选择目录(通过回调函数SelectDirCB处理)
if ADirectory <> '' then
begin
lpfn := SelectDirCB;
lParam := Integer(PChar(ADirectory));
end;
end;
//调用API
ItemIDList := ShBrowseForFolder(BrowseInfo);
//获取选择的路径
Result := ItemIDList <> nil;
if Result then
begin
ShGetPathFromIDList(ItemIDList, Buffer);
ShellMalloc.Free(ItemIDList);
ADirectory := Buffer;
end;
finally
ShellMalloc.Free(Buffer);
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
vPath: string;
begin
vPath := 'D:\ceshi';
if SelectDirectoryB('弹出的标题', vPath) then
ShowMessage('选择的目录 ' + vPath);
end;
弹出使用Microsoft IFileDialog接口对话框
uses Vcl.FileCtrl;
procedure TForm1.Button3Click(Sender: TObject);
var
vPath: TArray<string>;
I: Integer;
begin
//TPath.GetTempPath
//dHidePinnedPlaces 导航窗格的默认视图中隐藏项目。
//sdForceShowHidden 显示隐藏的目录。
//sdAllowMultiselect 允许你在“选择目录”对话框中选择多个项目
if SelectDirectory('D:\ceshi', vPath,
[{sdHidePinnedPlaces,} sdForceShowHidden, sdAllowMultiselect], '弹出的标题', '文件夹标签', '确认按钮标签') then
begin
for I := 0 to Length(vPath) - 1 do
ShowMessage('选择的目录[' + IntToStr(I + 1) + '] ' + vPath[I]);
end;
end;
方法
Vcl.FileCtrl.SelectDirectory
function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean;
function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string; Options: TSelectDirExtOpts; Parent: TWinControl): Boolean;
function SelectDirectory(const StartDirectory: string; out Directories: TArray<string>; Options: TSelectDirFileDlgOpts = []; const Title: string = ''; const FolderNameLabel: string = ''; const OkButtonLabel: string = ''): Boolean;
unit
弹出一个”选择目录“的对话框,允许用户输入或选择一个目录。
参数
Directory 当对话框出现时,传递的值显示为当前选择的目录。返回的值为新选择的目录。
Options 指定“选择目录”对话框的自定义响应。
HelpCtx 帮助上下文 ID 号。
Caption 指定“选择目录”对话框的标题。
Root 指定要浏览的根目录。
StartDirectory 在显示“选择目录”对话框时,指定当前选择的目录。
Directories 返回新选择的目录。 如果在 TSelectDirFileDlgOpts
中启用多项选择,则 Directories
会接收整个选定目录集作为数组中的不同元素。
Title 自定义对话框中标题显示的文本。
FolderNameLabel 自定义对话框中标签显示的文本。
OkButtonLabel 自定义对话框中确定按钮显示的文本。
返回值
选择一个目录并点击 确定 按钮,将返回 True,点击 取消 按钮或关闭对话框而不选择目录,则返回 False 。
重载
SelectDirectory(string, TSelectDirOpts, Longint)
显示 Windows 目录浏览器对话框。
SelectDirectory(string, WideString, string, TSelectDirExtOpts, TWinControl)
调用 Winapi的ShBrowseForFolder
对话框
SelectDirectory( string, TArray<string>, TSelectDirFileDlgOpts, string, string, string)
对话框使用Microsoft IFileDialog接口,提供与 Microsoft Windows Vista 或更高版本的 Windows 操作系统中常见对话框相同的选项。
D7的SelectDirectory
function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload;
function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload;
unit
Vcl.FileCtrl.TSelectDirOpts
type TSelectDirOpts = set of TSelectDirOpt;
unit
TSelectDirOpts
是一组选项,用于定制 SelectDirectory
弹出的“选择目录”对话框。
-
sdAllowCreate 一个编辑框,允许你输入不存在的目录名称。 此选项不创建目录。 应用程序必须读取所选目录名称,并根据需要创建该目录。
-
sdPerformCreate 只能与 sdAllowCreate 结合使用。如果输入不存在的目录名称,“选择目录”对话框会创建该目录。
-
sdPrompt 只能与 sdAllowCreate 结合使用。 当输入的目录不存在时,显示一个消息框,并询问是否应创建该目录。 如果点击 OK 按钮并且选项集包含sdPerformCreate,则会创建目录。 如果选项集不包括 sdPerformCreate,则不会创建目录。 应用程序必须读取目录名称并创建该目录。
Vcl.FileCtrl.TSelectDirExtOpts
type TSelectDirExtOpts = set of TSelectDirExtOpt;
unit
TSelectDirExtOpts
是一组选项,用于定制 SelectDirectory
弹出的“选择目录”对话框。
- sdNewFolder 启用 sdNewUI 选项时,显示 新建文件夹 按钮。
- sdShowEdit 显示包含当前所选文件夹/文件的编辑框。 也允许输入要选择的文件夹/文件的名称。
- sdShowShares 在“选择目录”对话框中显示远程系统上的可共享资源。 这会自动启用
sdNewUI
选项。 - sdNewUI 使用此选项可显示一个新类型的对话框,可调整大小,并且包含一个 新建文件夹 按钮。 该对话框还允许你在文件夹或文件上拖放和使用右键菜单。
- sdShowFiles 在“选择目录”对话框中显示文件。
- sdValidateDir 当启用
sdShowEdit
选项时,验证插入编辑框中的文件夹/文件的名称。
Vcl.FileCtrl.TSelectDirFileDlgOpts
type TSelectDirFileDlgOpts = set of TSelectDirFileDlgOpt;
unit
TSelectDirFileDlgOpts
是一组选项,用于定制 SelectDirectory
弹出的“选择目录”对话框。
- sdHidePinnedPlaces 从导航窗格的默认视图中隐藏项目。
- sdNoDereferenceLinks 允许您使用引用的 符号链接。
- sdForceShowHidden 显示隐藏的文件和目录。
- sdAllowMultiselect 允许你在“选择目录”对话框中选择多个项目。