В чем разница между новым TFileOpenDialog и старым TOpenDialog?
На моем компьютере (Win 7/DXE), когда я запускаю код, диалоги выглядят одинаково.
В чем разница между новым TFileOpenDialog и старым TOpenDialog?
Ответ 1
-
TOpenDialog
обертывает традиционныйGetOpenFileName
. Он работает во всех версиях Windows. -
TFileOpenDialog
завершает новый диалог на основе COM, который был представлен в Vista. Поэтому он работает только на Vista или позже. Он имеет больше функциональности, чем старые диалоги, в первую очередь тесная интеграция с поиском.
Общий диалог Vistastrong >
Общий диалог совместимости
API GetOpenFileName
на самом деле будет создавать новые диалоги в большинстве ситуаций, если их правильно вызывать, поэтому вы не можете сказать разницу. Тем не менее, исторически оболочка VCL для GetOpenFileName
была реализована неточно и всегда приводила к отображению диалогового окна совместимости.
Но что может предложить новый COM-диалог?
Новый диалог предлагает гораздо более легкий интерфейс настройки при потере некоторой общности. Если вы используете старую настройку шаблона на основе шаблона с помощью GetOpenFileName
в Vista или позже, то диалоги деградируют до уродливых версий совместимости, которые не имеют функциональности.
Другим большим преимуществом новых диалогов является возможность выбора неограниченного количества файлов. Старый GetOpenFileName
интерфейс возвращал имена файлов с несколькими вариантами в буфере фиксированного размера. Это может быть реальным ограничением, и в моем собственном коде мне пришлось взломать код VCL, чтобы увеличить этот буфер, когда мое приложение работает на XP.
TOpenDialog
, если возможно, делегирует работу TFileOpenDialog
. Для тестирования, который он использует, требуется следующее:
- Работает в Windows Vista или более поздней версии.
-
Dialogs.UseLatestCommonDialogs
глобальная логическая переменная имеет значение true (по умолчанию это значение true). Это позволяет отключить использование нового диалогового окна COM, если вы решите сделать это. - Не указан шаблон диалога.
-
OnIncludeItem
,OnClose
иOnShow
события не назначены. Предположительно, они не могут быть запущены с помощьюTFileOpenDialog
.
Резюме
Если вы продолжаете использовать TOpenDialog
, вы сможете воспользоваться неограниченным количеством файлов в режиме множественного выбора. Однако, если вы хотите настроить диалог и иметь новые диалоги, а не уродливые диалоги совместимости, вам необходимо сделать следующее:
- В XP используйте
TOpenDialog
и метод шаблона диалога. - В Vista и позже используйте
TFileOpenDialog
и выполните настройку с помощьюIFileDialogCustomize
.
Ответ 2
TOpenDialog
выполняет TFileOpenDialog
, когда выполняются следующие условия:
- программа работает под управлением Vista или Windows 7
-
UseLatestCommonDialogs
- true (по умолчанию) - no
OnIncludeItem
,OnClose
илиOnShow
установлены события
Поэтому, в то время как при использовании TOpenDialog
в вашей системе вы, возможно, в конечном итоге автоматически выполните TFileOpenDialog
, что объясняет, почему они выглядят одинаково для вас.
Примечание: TFileOpenDialog
не возвращается к старым системам Windows - это просто вызывает исключение. Напротив, TOpenDialog
делает какой-то "упадок вперед".