2016-05-11 42 views
2

以下代码在不同机器上获得不同结果。一台机器只提供桌面文件夹(不需要),另一台机器提供桌面文件夹和计算机映射驱动器(需要)。SelectDirectory不包括某些机器上的驱动器

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Directory : String; 
begin 
    FileCtrl.SelectDirectory('Caption', 'Desktop', Directory, [sdNewUI, sdShowEdit]); 
end; 

其中一台机器它给出:

Bad Browse

在另一方面它给:

Good Browse

这感觉就像一个窗口的设置,但我不知道在哪里开始。使用德尔福XE,Windows 10.

任何想法表示赞赏。谢谢你的时间。

+1

如果是我,我会使用Vista中引入的新的通用文件项目对话框,这是本机文件夹选取器 –

+0

要显示根目录名称空间,您应该将'Root'参数设置为空字符串(''' '')而不是''Desktop''。 –

+0

谢谢@RemyLebeau!使用''''而不是''Desktop''解决了我的问题。 – user1627960

回答

3

解决方法
改为使用TFileOpenDialog *。
设置FileOpenDialog1.Options:= [fdoPickFolders,fdoPathMustExist]

enter image description here

现在你有一个对话框:

  • 始终工作。
  • 允许复制粘贴

*)不与TOpenDialog,不允许您只选择文件夹混淆。

为Windows XP
注意解决方案,新的TFileOpenDialog仅适用于Vista和上面。
如果包含此控件,则您的程序将无法在XP上运行。
如果您在XP上启动对话框,它将生成一个EPlatformVersionException

您可能需要使用下面的代码代替,如果你想成为向后兼容:

uses JclSysInfo; //because you have XE use JCL. 

... 
var 
    WinMajorVer: Integer; 
    Directory: string; 
    FileDialog: TFileOpenDialog; 
begin 
    WinMajorVer:= GetWindowsMajorVersionNumber; 
    if WinMajorVer < 6 then begin //pre-vista 
    //To show the root Desktop namespace, you should be setting the Root parameter to an empty string ('') instead of 'Desktop' 
    FileCtrl.SelectDirectory('Caption', '', Directory, [sdNewUI, sdShowEdit]); 
    end else begin 
    FileDialog:= TFileOpenDialog.Create(self); 
    try 
     FileDialog.Options:= [fdoPickFolders,fdoPathMustExist]; 
     if FileDialog.Execute then Directory:= FileOpenDialog1.FileName; 
    finally 
     FileDialog.Free; 
    end; 
    end; 
    Result:= Directory; 
end; 

推荐阅读:
detect windows version

编辑

FileCtrl.SelectDirectory('Caption', 'Desktop', Directory, [sdNewUI, sdShowEdit]); 

'Desktop'进入Root参数,它是像这样处理的:

... 
    SHGetDesktopFolder(IDesktopFolder); 
    IDesktopFolder.ParseDisplayName(Application.Handle, nil, 
     Root, Eaten, RootItemIDList, Flags); 
... 

下面是MSDN对IDesktopFolder.ParseDisplayName有说:

pszDisplayName [中]
类型:LPWSTR
以空结尾的Unicode字符串与显示名称。由于每个Shell文件夹都定义了自己的解析语法,因此该字符串可以采用的形式可能会有所不同例如,桌面文件夹接受诸如“C:\ My Docs \ My File.txt”之类的路径。它还将使用“:: {GUID}”语法接受对名称空间中具有与它们关联的GUID的项目的引用。

请注意,文档指出桌面文件夹将接受路径和GUID。它不接受'Desktop'。因为那既不是。

'Desktop'作为root作用于一个系统而不是另一个系统的事实是在IDesktopFolder接口的较旧/较新版本中进行的一些未公开的修复。

技术方案
使用''如所示在我的代码上方的“根”。

显然SelectDirectory是微软公司的一个非常糟糕的设计,绝对不应该使用。它只是吸引了很多方面。我建议尽可能不要使用它。

+0

* app *仍然可以在XP上运行,但*对话框*不会(在运行时调用对话框时引发'EPlatformVersionException')。 –

+0

@RemyLebeau,感谢您的帮助。我没有XP来测试,所以我不确定会发生什么。鉴于它确实从XP开始,我已经添加了一些解决方法代码。 – Johan

+0

'如果WinVer在......' - OUCH!如果使用Win32MajorVersion <6然后...'来代替它会容易得多。并使用'try/finally'来释放'TFileOpenDialog'。 –

相关问题