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ダイアログを使用するはるかに優れたダイアログです。でラップされているDelphiでは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

[sdNewUI]私がたどり着いた回避策は、フラグを指定しないことで実行できる「古い」(Win XP) UI を使用することです。この場合、すべての項目が正しく表示されます。

ユーザーがファイルまたはフォルダーを選択する必要がある場合、これが唯一の有効なソリューションのようTFileOpenDialogです。

于 2013-03-10T00:31:44.740 に答える