delphi 弹出选择目录对话框(选择文件夹)

Posted txgh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 弹出选择目录对话框(选择文件夹)相关的知识,希望对你有一定的参考价值。

弹出选择目录对话框(选择文件夹)

代码

弹出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

Vcl.FileCtrl

弹出一个”选择目录“的对话框,允许用户输入或选择一个目录。

参数

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

FileCtrl

Vcl.FileCtrl.TSelectDirOpts

type TSelectDirOpts = set of TSelectDirOpt;

unit

Vcl.FileCtrl

TSelectDirOpts 是一组选项,用于定制 SelectDirectory 弹出的“选择目录”对话框。

  • sdAllowCreate 一个编辑框,允许你输入不存在的目录名称。 此选项不创建目录。 应用程序必须读取所选目录名称,并根据需要创建该目录。

  • sdPerformCreate 只能与 sdAllowCreate 结合使用。如果输入不存在的目录名称,“选择目录”对话框会创建该目录。

  • sdPrompt 只能与 sdAllowCreate 结合使用。 当输入的目录不存在时,显示一个消息框,并询问是否应创建该目录。 如果点击 OK 按钮并且选项集包含sdPerformCreate,则会创建目录。 如果选项集不包括 sdPerformCreate,则不会创建目录。 应用程序必须读取目录名称并创建该目录。

Vcl.FileCtrl.TSelectDirExtOpts

type TSelectDirExtOpts = set of TSelectDirExtOpt;

unit

Vcl.FileCtrl

TSelectDirExtOpts 是一组选项,用于定制 SelectDirectory 弹出的“选择目录”对话框。

  • sdNewFolder 启用 sdNewUI 选项时,显示 新建文件夹 按钮。
  • sdShowEdit 显示包含当前所选文件夹/文件的编辑框。 也允许输入要选择的文件夹/文件的名称。
  • sdShowShares 在“选择目录”对话框中显示远程系统上的可共享资源。 这会自动启用 sdNewUI 选项。
  • sdNewUI 使用此选项可显示一个新类型的对话框,可调整大小,并且包含一个 新建文件夹 按钮。 该对话框还允许你在文件夹或文件上拖放和使用右键菜单。
  • sdShowFiles 在“选择目录”对话框中显示文件。
  • sdValidateDir 当启用sdShowEdit选项时,验证插入编辑框中的文件夹/文件的名称。

Vcl.FileCtrl.TSelectDirFileDlgOpts

type TSelectDirFileDlgOpts = set of TSelectDirFileDlgOpt;

unit

Vcl.FileCtrl

TSelectDirFileDlgOpts 是一组选项,用于定制 SelectDirectory 弹出的“选择目录”对话框。

  • sdHidePinnedPlaces 从导航窗格的默认视图中隐藏项目。
  • sdNoDereferenceLinks 允许您使用引用的 符号链接
  • sdForceShowHidden 显示隐藏的文件和目录。
  • sdAllowMultiselect 允许你在“选择目录”对话框中选择多个项目。

参考

SHBrowseForFolderA

SHBrowseForFolderW

以上是关于delphi 弹出选择目录对话框(选择文件夹)的主要内容,如果未能解决你的问题,请参考以下文章

delphi中如何opendialog1.FileName;只能打开文件,如何打开目录获得目录路径

java 弹出选择目录框(选择文件夹),获取选择的文件夹路径

选择一个文件夹 - Delphi

新手问题,delphi 的保存对话框

JAVA GUI问题。如何触动按钮后弹出文件浏览器和文件名选择框,选择保存目录?

C#的文件管理 点击浏览按钮 出现对话框选择文件路径