Подтвердить что ты не робот

В чем разница между новым TFileOpenDialog и старым TOpenDialog?

В чем разница между новым TFileOpenDialog и старым TOpenDialog?
На моем компьютере (Win 7/DXE), когда я запускаю код, диалоги выглядят одинаково.

4b9b3361

Ответ 1

  • TOpenDialog обертывает традиционный GetOpenFileName. Он работает во всех версиях Windows.
  • TFileOpenDialog завершает новый диалог на основе COM, который был представлен в Vista. Поэтому он работает только на Vista или позже. Он имеет больше функциональности, чем старые диалоги, в первую очередь тесная интеграция с поиском.

Общий диалог Vista​​strong > Vista common dialog

Общий диалог совместимости Compatibility common dialog

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 делает какой-то "упадок вперед".