4

可能重复:
Delphi:使用 TOpenDialog 选择目录

我需要在我的项目上打开一个特定的文件夹。当我使用 opendialog1 时,我只能打开一个文件。打开一个文件夹怎么样?

想要 - 在 Delphi 中打开文件夹对话框

PS:我用的是 Delphi 2010

4

3 回答 3

16

在 Vista 及更高版本上,您可以使用TFileOpenDialog.

var
  OpenDialog: TFileOpenDialog;
  SelectedFolder: string;
.....
OpenDialog := TFileOpenDialog.Create(MainForm);
try
  OpenDialog.Options := OpenDialog.Options + [fdoPickFolders];
  if not OpenDialog.Execute then
    Abort;
  SelectedFolder := OpenDialog.FileName;
finally
  OpenDialog.Free;
end;

看起来像这样:

在此处输入图像描述

于 2012-03-02T07:35:31.480 回答
11

你在SelectDirectory单位里找FileCtrl。它有两个重载版本:

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;

您要使用的取决于您使用的 Delphi 版本,以及您正在寻找的特定外观和功能;我(通常发现第二个版本非常适合现代版本的 Delphi 和 Windows,用户似乎对“通常预期的外观和功能”感到满意。

于 2012-03-02T04:10:30.173 回答
6

您还可以使用TBrowseForFolder操作类 ( stdActns.pas):

var
  dir: string;
begin
  with TBrowseForFolder.Create(nil) do try
    RootDir  := 'C:\';
    if Execute then
      dir := Folder;
  finally
    Free;
  end;
end;

或直接使用 WinApi 函数SHBrowseForFolder(第二次SelectDirectory重载使用它,而不是第一次重载,它在运行时创建自己的带有所有控件的 delphi 窗口):

var
  dir : PChar;
  bfi : TBrowseInfo;
  pidl : PItemIDList;
begin
  ZeroMemory(@bfi, sizeof(bfi));
  pidl := SHBrowseForFolder(bfi);
  if pidl <> nil then try
    GetMem(dir, MAX_PATH + 1);
    try
      if SHGetPathFromIDList(pidl, dir) then begin
        // use dir
      end;
    finally
      FreeMem(dir);
    end;
  finally
    CoTaskMemFree(pidl);
  end;
end;
于 2012-03-02T06:43:39.097 回答