具有大量shell项时,SelectDirectory / ShBrowseForFolder问题

时间:2013-03-08 12:01:03

标签: delphi winapi windows-shell

我遇到了一个非常奇怪的问题:Vcl.FileCtrl函数 SelectDirectory (这是 ShBrowseForFolder Win32 API的一个薄包装器。)

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

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

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

SelectDirectory with less than 100 desktop files

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

SelectDirectory with more than 100 desktop files

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

我正在寻找我在这里失踪的东西。根项目对于正确显示的子项目数量是否有限制?拥有大量桌面图标通常不是一个好习惯,但据我所知,不应该阻止此对话框正常运行。我不确定Delphi包装器中是否有错误,或者这是我在MSDN上没有看到的API的限制......

任何暗示都赞赏!

2 个答案:

答案 0 :(得分:7)

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

如果您正在浏览文件夹,则应在文件夹选择模式下使用IFileOpenDialog。这是一个使用新Vista对话框的更好的对话框。在由TFileOpenDialog包装的Delphi中。仅在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;

答案 1 :(得分:1)

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

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