gpt4 book ai didi

windows - SelectDirectory 不包括某些机器上的驱动器

转载 作者:可可西里 更新时间:2023-11-01 10:04:30 25 4
gpt4 key购买 nike

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

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

它提供的一台机器:

Bad Browse

在另一个它给出:

Good Browse

这感觉像是 Windows 设置,但我不确定从哪里开始。使用 Delphi XE,Windows 10。

任何想法表示赞赏。感谢您的宝贵时间。

最佳答案

解决方法
使用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);
...

这是 IDesktopFolder.ParseDisplayName 的 MSDN不得不说:

pszDisplayName [in]
Type: LPWSTR
A null-terminated Unicode string with the display name. Because each Shell folder defines its own parsing syntax, the form this string can take may vary. The desktop folder, for instance, accepts paths such as "C:\My Docs\My File.txt". It also will accept references to items in the namespace that have a GUID associated with them using the "::{GUID}" syntax.

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

事实上 'Desktop' 作为 root 在一个系统上工作而不在另一个系统上工作是在旧/新版本的 IDesktopFolder 中进行的一些未记录的修复 接口(interface)。

技术方案
使用 '' 作为“根”,如我上面的代码所示。

显然 SelectDirectory 是微软的一个非常糟糕的设计,永远不应该使用。它在很多方面都很糟糕。我建议尽可能不要使用它。

关于windows - SelectDirectory 不包括某些机器上的驱动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37166483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com