2012-04-05 2 views
5

Эта проблема возникает только для приложений, которые ранее были разработаны под Delphi 7 и перенесены в Delphi 2007, запущенных на WinXP.Topendialog, не отображающий расширения файлов

Я пробовал целую вечность, чтобы решить эту проблему без везения.

Насколько мне известно, Topendialog - это оболочка диалогового окна Win32, и он должен наследовать параметры папки Windows, которые в моем случае установлены для отображения расширений файлов всех файлов.

Теперь, если я создаю новое приложение и бросаю на него Topendialog, то при его запуске он отображает расширения файлов, как ожидалось.

Если я опустил тот же диалог в существующее приложение и запустил его, он не будет показывать расширения файлов.

Если факт, если я напишу строку имени файла в свойстве имени файла перед вызовом диалога a la 'Myfile.txt', когда отображается диалоговое окно, имя файла отображается как «Myfile», расширение не отображается, и ни один из них не отображается делать любые файлы в списке.

Есть ли у кого-нибудь еще такое поведение?

У кого-нибудь есть обходные пути?

Редактировать: Изображения, загруженные в список различий между Topendialog на новый проект и существующий проект.

As shown on new project

As shown on existing project

+0

Я не уверен, что это может быть связано, но ... «D7, перенесенный на D2007», может намекнуть на разницу в отношении тем Windows. У вас есть манифест в вашем приложении (через XPMan или «Включить темы времени исполнения» в параметрах проекта)? –

+0

Что произойдет, если вы сбросите 'TOpenDialog' на вновь созданной форме в вашем существующем приложении? Что произойдет, если вы создадите объект «TOpenDialog» во время выполнения? – splash

+0

@ Andy k: Было бы полезно, если бы вы разместили скриншоты, иллюстрирующие проблему. (Открытые диалоги могут выглядеть несколько иначе, в зависимости от множества факторов. Это может помочь определить проблему, которая, честно говоря, звучит очень странно для меня ...) –

ответ

3

ОК, у меня есть обходной путь для этой проблемы.

Оказалось, что вызов SHGetSettings в нужном месте фактически предотвращает возникновение проблемы.

Таким образом, обходным путем является включение его в исходный код проекта с самого начала.

например

программа Бла;

использует

форм, shlobj,

мля,
.... и т.д.

{$ R * .TLB}

{$ R * .RES}

var ShellFlags: TShellFlagState;

начало
SHGetSettings (ShellFlags, SSF_SHOWEXTENSIONS); .....

Я понятия не имею, почему это заставляет работать, это не должно иметь никакого значения, поскольку это единственный запрос, но он работает.

Итак, благодаря Justmade за то, что вы предлагаете API-вызов.

Смежные вопросы