首页 > 其他分享 >delphi 弹出选择目录对话框(选择文件夹)

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

时间:2023-02-15 09:55:34浏览次数:50  
标签:string SelectDirectory 对话框 delphi 选择 文件夹 目录 vPath

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

代码

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

标签:string,SelectDirectory,对话框,delphi,选择,文件夹,目录,vPath
From: https://www.cnblogs.com/txgh/p/17121717.html

相关文章

  • VBA 复制同文件夹下多工作簿中同名工作表 分别粘贴至同一工作簿的不同工作表
    VBA复制同文件夹下多工作簿中同名工作表分别粘贴至同一工作簿的不同工作表https://blog.csdn.net/qq_30687601/article/details/86929458学习日志复制指定目录下excel......
  • linux本地文件夹双向同步
    前言​ 开发时习惯将所有项目将在统一文件夹下,运行目录在其它目录;如果每次修改后又copy到运行目录就很蛋疼,于是找到了同步本地文件夹这个解决方法。监听工作目录的文件修......
  • git如何把本地文件夹和远程仓库关联
    场景:1,有一个本地项目,没有上传到git过,你在远程新建了一个仓库,想把这个本地的代码推送到该仓库2,直接想把本地代码推送到远程并创建该本地文件对应的仓库解决方法:没有仓库......
  • 组件封装-基本对话框
    <template><!--弹窗--><!--@close="closeDialog"事件--><el-dialogtitle="提示":visible.sync="dialogVisible"width="40%":before-cl......
  • SharePoint Online 分享文件夹提示功能禁用
    前言最近使用SharePointOnline站点的时候,分享文件夹出现了这个提示(Sharingfoldersisdisabled),没办法给文件夹授权。正文1.提示的信息截图,如下图: ......
  • 如何删除非空文件夹
    //引入fs模块letfs=require('fs');functiondelDir(filePath){letfiles=fs.readdirSync(filePath);//读filePath中的文件,以数组形势返回console.lo......
  • leetcode 1233. 删除子文件夹
    ​​1233.删除子文件夹​​难度中等142你是一位系统管理员,手里有一份文件夹列表 ​​folder​​,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的......
  • delphi 信息登记
    信息登记查询代码unitUnit_Driver_Info_Register;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,StrUtils,Dialo......
  • delphi cxGrid做一个可以控制单元格数量上限和下限的功能
    先看效果图效果要求:1.点击申领数量时,自动设置此物料可领上限,与可退的下限2.申领数量为0时,不更新说明:1.使用了cxGrid+FireDAC2.TFDQuery控......
  • 误删的Downloads文件夹如何找回?Downloads文件夹恢复方法~
    如果不小心误删除了Downloads文件夹,如何让其快速恢复呢?今天分享Downloads文件夹恢复方法,需要的小伙伴走起~方法1.将Downloads文件夹从Home目录恢复到Dock如果下载文......