2013-03-08 5 views
5

biegnę do bardzo dziwny problem z funkcją Vcl.FileCtrl SelectDirectory (która jest cienka owijka wokół SHBrowseForFolder Win32 API).SelectDirectory/SHBrowseForFolder problem, gdy o wiele elementów powłokowych

używam następujący kod, aby umożliwić użytkownikowi przeglądanie w poszukiwaniu pliku lub folderu:

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

Podczas wykonywania tego kodu „Przeglądaj dla folderu” dialog jest poprawnie wyświetlane, wyświetlając zawartość z pulpitu użytkownika:

SelectDirectory with less than 100 desktop files

Ale gdy liczba elementów w folderze pulpitu jest zbyt duży (. na moim komputerze, mogę odtworzyć problem przez posiadające około 100 ikon na pulpicie), to samo wezwanie produkuje całkowicie inny wyświetlacz:

SelectDirectory with more than 100 desktop files

W tym przypadku, elementy pulpitu nie są pokazane już. Mogę eksplorować tylko mój katalog domowy, a ponieważ zgubiłem ikonę "Mój komputer", nie mogę wybrać pliku/folderu poza tym katalogiem.

Szukam czego tu brakuje. Czy istnieje limit liczby podelementów, które może mieć element główny dla poprawnego wyświetlania? Posiadanie wielu ikon na pulpicie nie jest z pewnością dobrą praktyką, ale z tego, co wiem, nie powinno uniemożliwiać normalnego działania tego okna dialogowego. Nie jestem pewien, czy coś jest nie tak w opakowaniu Delphi, czy jest to ograniczenie API, którego nie widziałem na MSDN ...

Jakaś wskazówka doceniona!

+1

Widzę to samo z tym samym wywołaniem API z VB6. Każde więcej niż 97 obiektów podrzędnych "Pulpitu" i po prostu pokazuje folder profilu użytkownika. – Deanna

Odpowiedz

1

Obejście Przyszedłem jest użycie „starych” (Win XP) UI, które mogą być wykonywane przez nie określając flagę [sdNewUI]. W takim przypadku wszystkie elementy są poprawnie wyświetlane.

To wydaje się być jedynym prawidłowym rozwiązaniem, gdy użytkownik musi wybrać pliki LUB foldery, do których nie jest zdolny element TFileOpenDialog.

7

Tak, mogę odtworzyć to zachowanie. Jest to wyraźnie ograniczenie systemu Windows, a omawiane API nie oferuje żadnego sposobu na zwiększenie buforów. Myślę, że twoje szanse na obejście go przy użyciu SHBrowseForFolder są bliskie zeru. Ponieważ SHBrowseForFolder jest już starszym API.

Jeśli przeglądasz foldery, powinieneś użyć IFileOpenDialog w trybie wyboru folderu. To o wiele ładniejsze okno dialogowe, które wykorzystuje nowe okna dialogowe Vista. W Delphi jest opakowany przez TFileOpenDialog. Używaj tego tylko wtedy, gdy Win32MajorVersion>=6! W przypadku XP musisz zadzwonić ponownie pod numer 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; 
+0

Dlaczego jest dziedzictwo "SHBrowseForFolder"? Jest to miły, perfekcyjnie działający GUI w mojej opinii. –

+0

+1 za francuski! Ale -1 za odtworzenie oczywistego błędu gramatycznego w danym ciągu ... –

+0

To dziedzictwo ze względu na 'IFileDialog'. Tak właśnie mają to robić nowe aplikacje. Dokumentacja dla 'SHBrowseForFolder' mówi tak. –

Powiązane problemy