第八灵感 發表於 2023-2-15 09:48:00

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

<h1 id="弹出选择目录对话框选择文件夹">弹出选择目录对话框(选择文件夹)</h1>
<h2 id="代码">代码</h2>
<h3 id="弹出windows目录浏览器对话框">弹出Windows目录浏览器对话框</h3>
<pre><code class="language-delphi">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, , 0) then
    ShowMessage('选择的目录 ' + vPath);
end;
</code></pre>
<p><img src="https://img2023.cnblogs.com/blog/2081421/202302/2081421-20230215094707128-1937247137.png"></p>
<h3 id="弹出winapi的shbrowseforfolder对话框">弹出Winapi的<code>ShBrowseForFolder</code>对话框</h3>
<pre><code class="language-delphi">uses Vcl.FileCtrl;

procedure TForm1.Button2Click(Sender: TObject);
var
vPath: string;
begin
//默认选择的目录
vPath := 'D:\ceshi';
//显示列表的根目录,空时显示全部
//sdNewUI可调整大小,显示右键菜单
//sdNewFolder 显示“新建文件夹”按钮
//sdShowEdit 显示“文件夹”输入框
//sdValidateDir验证插入编辑框中的文件夹/文件的名称
if SelectDirectory('弹出的标题', '', vPath, , Self) then
    ShowMessage('选择的目录 ' + vPath);
end;
</code></pre>
<p><img src="https://img2023.cnblogs.com/blog/2081421/202302/2081421-20230215094751810-1954213364.png"></p>
<p>D7中<code>SelectDirectory</code>函数没有<code>Options: TSelectDirExtOpts</code>参数,弹出的<code>ShBrowseForFolder</code>对话框中没有 <strong>新建文件夹</strong> 按钮,通过直接调用API实现</p>
<pre><code class="language-delphi">uses FileCtrl, ShlObj, ActiveX;

function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall;
begin
if (uMsg = BFFM_INITIALIZED) and (lpData &lt;&gt; 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 &lt;&gt; 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 &lt;&gt; '' then
      begin
          lpfn := SelectDirCB;
          lParam := Integer(PChar(ADirectory));
      end;
      end;
      //调用API
      ItemIDList := ShBrowseForFolder(BrowseInfo);
      //获取选择的路径
      Result := ItemIDList &lt;&gt; 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;
</code></pre>
<h3 id="弹出使用microsoft-ifiledialog接口对话框">弹出使用Microsoft IFileDialog接口对话框</h3>
<pre><code class="language-delphi">uses Vcl.FileCtrl;

procedure TForm1.Button3Click(Sender: TObject);
var
vPath: TArray&lt;string&gt;;
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);
end;
end;
</code></pre>
<p><img src="https://img2023.cnblogs.com/blog/2081421/202302/2081421-20230215094818801-648320856.png"></p>
<h2 id="方法">方法</h2>
<h3 id="vclfilectrlselectdirectory">Vcl.FileCtrl.SelectDirectory</h3>
<pre><code class="language-delphi">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&lt;string&gt;; Options: TSelectDirFileDlgOpts = []; const Title: string = ''; const FolderNameLabel: string = ''; const OkButtonLabel: string = ''): Boolean;
</code></pre>
<p><strong>unit</strong></p>
<p>Vcl.FileCtrl</p>
<p>弹出一个”选择目录“的对话框,允许用户输入或选择一个目录。</p>
<p><strong>参数</strong></p>
<p><em>Directory</em>当对话框出现时,传递的值显示为当前选择的目录。返回的值为新选择的目录。</p>
<p><em>Options</em>指定“选择目录”对话框的自定义响应。</p>
<p><em>HelpCtx</em>帮助上下文 ID 号。</p>
<p><em>Caption</em>指定“选择目录”对话框的标题。</p>
<p><em>Root</em>指定要浏览的根目录。</p>
<p><em>StartDirectory</em>在显示“选择目录”对话框时,指定当前选择的目录。</p>
<p><em>Directories</em>返回新选择的目录。 如果在 <code>TSelectDirFileDlgOpts</code> 中启用多项选择,则 <code>Directories</code> 会接收整个选定目录集作为数组中的不同元素。</p>
<p><em>Title</em>   自定义对话框中标题显示的文本。</p>
<p><em>FolderNameLabel</em>自定义对话框中标签显示的文本。</p>
<p><em>OkButtonLabel</em>自定义对话框中确定按钮显示的文本。</p>
<p><strong>返回值</strong></p>
<p>选择一个目录并点击 <strong>确定</strong> 按钮,将返回 <em>True</em>,点击 <strong>取消</strong> 按钮或关闭对话框而不选择目录,则返回 <em>False</em> 。</p>
<p><strong>重载</strong></p>
<p><code>SelectDirectory(string, TSelectDirOpts, Longint)</code></p>
<p>显示 Windows 目录浏览器对话框。</p>
<p><code>SelectDirectory(string, WideString, string, TSelectDirExtOpts, TWinControl)</code></p>
<p>调用 Winapi的<code>ShBrowseForFolder</code> 对话框</p>
<p><code>SelectDirectory( string, TArray&lt;string&gt;, TSelectDirFileDlgOpts, string, string, string)</code></p>
<p>对话框使用Microsoft IFileDialog接口,提供与 Microsoft Windows Vista 或更高版本的 Windows 操作系统中常见对话框相同的选项。</p>
<h3 id="d7的selectdirectory">D7的SelectDirectory</h3>
<pre><code class="language-delphi">function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload;
function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload;
</code></pre>
<p><strong>unit</strong></p>
<p>FileCtrl</p>
<h3 id="vclfilectrltselectdiropts">Vcl.FileCtrl.TSelectDirOpts</h3>
<pre><code class="language-delphi">type TSelectDirOpts = set of TSelectDirOpt;
</code></pre>
<p><strong>unit</strong></p>
<p>Vcl.FileCtrl</p>
<p><code>TSelectDirOpts</code> 是一组选项,用于定制 <code>SelectDirectory</code> 弹出的“选择目录”对话框。</p>
<ul>
<li>
<p><em>sdAllowCreate</em>一个编辑框,允许你输入不存在的目录名称。 此选项不创建目录。 应用程序必须读取所选目录名称,并根据需要创建该目录。</p>
</li>
<li>
<p><em>sdPerformCreate</em>只能与 <em>sdAllowCreate</em> 结合使用。如果输入不存在的目录名称,“选择目录”对话框会创建该目录。</p>
</li>
<li>
<p><em>sdPrompt</em>只能与 <em>sdAllowCreate</em> 结合使用。 当输入的目录不存在时,显示一个消息框,并询问是否应创建该目录。 如果点击 <strong>OK</strong> 按钮并且选项集包含<em>sdPerformCreate</em>,则会创建目录。 如果选项集不包括 <em>sdPerformCreate</em>,则不会创建目录。 应用程序必须读取目录名称并创建该目录。</p>
</li>
</ul>
<h3 id="vclfilectrltselectdirextopts">Vcl.FileCtrl.TSelectDirExtOpts</h3>
<pre><code class="language-delphi">type TSelectDirExtOpts = set of TSelectDirExtOpt;
</code></pre>
<p><strong>unit</strong></p>
<p>Vcl.FileCtrl</p>
<p><code>TSelectDirExtOpts</code> 是一组选项,用于定制 <code>SelectDirectory</code> 弹出的“选择目录”对话框。</p>
<ul>
<li><em>sdNewFolder</em>启用 <em>sdNewUI</em> 选项时,显示 <strong>新建文件夹</strong> 按钮。</li>
<li><em>sdShowEdit</em>显示包含当前所选文件夹/文件的编辑框。 也允许输入要选择的文件夹/文件的名称。</li>
<li><em>sdShowShares</em>在“选择目录”对话框中显示远程系统上的可共享资源。 这会自动启用 <code>sdNewUI</code> 选项。</li>
<li><em>sdNewUI</em>使用此选项可显示一个新类型的对话框,可调整大小,并且包含一个 <strong>新建文件夹</strong> 按钮。 该对话框还允许你在文件夹或文件上拖放和使用右键菜单。</li>
<li><em>sdShowFiles</em>在“选择目录”对话框中显示文件。</li>
<li><em>sdValidateDir</em>当启用<code>sdShowEdit</code>选项时,验证插入编辑框中的文件夹/文件的名称。</li>
</ul>
<h3 id="vclfilectrltselectdirfiledlgopts">Vcl.FileCtrl.TSelectDirFileDlgOpts</h3>
<pre><code class="language-delphi">type TSelectDirFileDlgOpts = set of TSelectDirFileDlgOpt;
</code></pre>
<p><strong>unit</strong></p>
<p>Vcl.FileCtrl</p>
<p><code>TSelectDirFileDlgOpts</code> 是一组选项,用于定制 <code>SelectDirectory</code> 弹出的“选择目录”对话框。</p>
<ul>
<li><em>sdHidePinnedPlaces</em>从导航窗格的默认视图中隐藏项目。</li>
<li><em>sdNoDereferenceLinks</em>允许您使用引用的 符号链接。</li>
<li><em>sdForceShowHidden</em>显示隐藏的文件和目录。</li>
<li><em>sdAllowMultiselect</em>允许你在“选择目录”对话框中选择多个项目。</li>
</ul>
<h2 id="参考">参考</h2>
<p>SHBrowseForFolderA</p>
<p>SHBrowseForFolderW</p><br><br>
来源:https://www.cnblogs.com/txgh/p/17121717.html
頁: [1]
查看完整版本: delphi 弹出选择目录对话框(选择文件夹)