DELPHI - 如何使用opendialog1选择文件夹?

5
我需要打开项目中的一个特定文件夹。当我使用opendialog1时,我只能打开文件。如何打开一个文件夹?
可能是重复问题:
Delphi:使用TOpenDialog选择目录

wanted - open folder dialog in Delphi

PS:我使用Delphi 2010


4
肯恩的回答(到目前为止唯一的回答)很棒,但这似乎是一个重复的问题:https://dev59.com/9ms05IYBdhLWcg3wIehj - Argalatyr
实际上,您可以使用TOpenDialog的派生类 - TSaveDialog(是的,这很快速和简单)。 - OnTheFly
2
投票关闭了,但我会错过teran的回答 - TLama
3个回答

19

在Windows 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;

这是它的外观:

在此输入图片描述


11

你正在寻找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;

您想使用的方法取决于您所使用的Delphi版本以及您需要的具体外观和功能。我通常发现第二个版本在现代版本的Delphi和Windows上运行得非常完美,并且用户对“通常预期的外观和功能”感到满意。


2
+1 Ken,顺便说一下,单元名称是FileCtrl - RRUZ
1
这两个函数很久以前就从FileCtrl单元中移出了。 - Remy Lebeau
Rodrigo,感谢您的更正。已修复。@Remy,XE2文档表明您是错误的。如果它们“很久以前”被移动,文档应该提到这一事实。 - Ken White
没事了。其他的FileCtrl函数确实很久以前就被移动到了SysUtils中,它们的FileCtrl引用已经被弃用了。我原以为SelectDirectory()也是其中之一,但我刚刚检查了一下,发现并不是这样。 - Remy Lebeau

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;

第13行和第14行可以替换为 CoTaskMemFree - OnTheFly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接