5

我在使用 Vcl.FileCtrl 函数 SelectDirectory(它是 ShBrowseForFolder Win32 API 的一个薄包装器)时遇到了一个非常奇怪问题

我使用以下代码允许用户浏览文件或文件夹:

  if SelectDirectory('Sélectionnez un élément à ajouter :', '', S, [sdNewFolder,
    sdShowFiles, sdNewUI]) then

执行此代码时,“浏览文件夹”对话框正确显示,显示用户桌面的内容:

桌面文件少于 100 个的 SelectDirectory

但是,当桌面文件夹中的项目数量过多时(在我的计算机上,我可以通过大约 100 个桌面图标来重现该问题),相同的调用会产生完全不同的显示:

具有 100 多个桌面文件的 SelectDirectory

在这种情况下,桌面项目不再显示。我只被允许浏览我的主文件夹,并且由于我丢失了“我的电脑”图标,我无法选择此目录之外的文件/文件夹。

我正在寻找我在这里缺少的东西。为了正确显示,根项目可以拥有的子项目数量是否有限制?拥有很多桌面图标当然不是​​一个好习惯,但据我所知,这不应阻止此对话框正常运行。我不确定 Delphi 包装器是否有问题,或者这是否是我在 MSDN 上没有看到的 API 的限制......

任何提示表示赞赏!

4

2 回答 2

7

是的,我可以重现这种行为。这显然是 Windows 的限制,并且有问题的 API 没有为您提供任何增加缓冲区的方法。我认为您使用它解决它的机会SHBrowseForFolder接近于零。因为SHBrowseForFolder现在是一个遗留 API。

如果您正在浏览文件夹,那么您应该IFileOpenDialog在文件夹选择模式下使用。这是一个更好的对话框,它使用了新的 Vista 对话框。在由TFileOpenDialog. 只使用它,如果Win32MajorVersion>=6!对于 XP,您需要重新调用SHBrowseForFolder.

if Win32MajorVersion>=6 then
begin
  FileOpenDialog1.Title := 'Sélectionnez un élément à ajouter :';
  FileOpenDialog1.Options := FileOpenDialog1.Options + [fdoPickFolders];
  if FileOpenDialog1.Execute then
    Beep;
end else
begin
  // revert to SelectDirectory
end;
于 2013-03-08T12:13:54.213 回答
1

我想到的解决方法是使用“旧”(Win XP)UI,这可以通过不指定[sdNewUI]标志来完成。在这种情况下,所有项目都正确显示。

当用户必须选择文件或文件夹时,这似乎是唯一有效的解决方案,这TFileOpenDialog是无法做到的。

于 2013-03-10T00:31:44.740 回答