FireMonkey应用程序中的TFileOpenDialog

4
我正在使用FireMonkey,并希望用户使用TFileOpenDialog提供的界面选择目录(我认为SelectDirectory接口已经过时,即使使用sdNewUI选项)。
首先,把VCL.Dialogs单元(用于使用TFileOpenDialog)包含在FireMonkey应用程序中是否有害?
其次,仅在Windows Vista及以上版本才能实现此功能。这是检查兼容的Windows版本的正确方法吗?
{IFDEF WIN32 or WIN64}
  if Win32MajorVersion >= 6 then
    // Create TOpenFileDialog with fdoPickFolders option

你的 Vista 测试没问题。个人认为不需要使用 TFileOpenDialog,直接使用 IFileDialog 更好。 - David Heffernan
我应该如何使用fdoPickFolders选项来完成这个任务呢?难道IFileDialog只是标准TOpenDialog/TSaveDialog的接口吗?还是我漏掉了什么? - Steve Magness
1
不,IFileDialog 是 Vista 的文件对话框,在所有形式上都是如此。其他所有内容都是遗留问题。调用 IFileDialog.SetOptions 并传递 FOS_PICKFOLDERS - David Heffernan
2个回答

3

为了以后的参考,使用IFileDialog来创建Windows Vista及以上版本的文件夹对话框:

uses
  ShlObj, ActiveX;

...

var
  FolderDialog : IFileDialog;
  hr: HRESULT;
  IResult: IShellItem;
  FileName: PChar;
  Settings: DWORD;
begin
  if Win32MajorVersion >= 6 then
    begin
      hr := CoCreateInstance(CLSID_FileOpenDialog,
                   nil,
                   CLSCTX_INPROC_SERVER,
                   IFileDialog,
                   FolderDialog);

      if hr = S_OK then
        begin
          FolderDialog.GetOptions(Settings);
          FolderDialog.SetOptions(Settings or FOS_PICKFOLDERS);
          FolderDialog.GetOptions(Settings);
          FolderDialog.SetOptions(Settings or FOS_FORCEFILESYSTEM);
          FolderDialog.SetOkButtonLabel(PChar('Select'));
          FolderDialog.SetTitle(PChar('Select a Directory'));

          hr := FolderDialog.Show(Handle);
          if hr = S_OK then
            begin
              hr := FolderDialog.GetResult(IResult);

              if hr = S_OK then
                begin
                  IResult.GetDisplayName(SIGDN_FILESYSPATH,FileName);
                  ConfigPathEdit.Text := FileName;
                end;
            end;
        end;
    end;
end;

0
if SelectDirectory('Select a directory', chosenDirectory, chosenDirectory) then

9
虽然这段代码可能解决了问题,但是加入一个解释说明这个解决方案如何、为什么能够解决问题,将会有助于提高您的帖子质量,并可能导致更多的投票支持。请记住,您正在为未来的读者回答问题,而不仅仅是回答现在提问的人。请编辑您的答案,添加解释,并说明适用的限制和假设。 - Suraj Rao

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