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

36

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

  • 2
    TFileOpenDialog реализует открытые диалоги в стиле Vista, но возвращается к старому стилю в предыдущих версиях Windows.
  • 12
    @GolezTrol, TFileOpenDialog вызывает исключение при запуске под XP.
Показать ещё 1 комментарий
Теги:
windows-7
delphi-xe
windows-vista

2 ответа

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

Общий диалог Vista​​strong > Изображение 7770

Общий диалог совместимости Изображение 7771

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.
  • 5
    +1 для хорошего резюме.
  • 0
    Подождите минуту, вы и Уве противоречат друг другу. Я удаляю +1, но восстановлю его, как только проблема будет решена ... Я только что проверил, и Уве прав.
Показать ещё 7 комментариев
48

TOpenDialog выполняет TFileOpenDialog, когда выполняются следующие условия:

  • программа работает под управлением Vista или Windows 7
  • UseLatestCommonDialogs - true (по умолчанию)
  • no OnIncludeItem, OnClose или OnShow установлены события

Поэтому, в то время как при использовании TOpenDialog в вашей системе вы, возможно, в конечном итоге автоматически выполните TFileOpenDialog, что объясняет, почему они выглядят одинаково для вас.

Примечание: TFileOpenDialog не возвращается к старым системам Windows - это просто вызывает исключение. Напротив, TOpenDialog делает какой-то "упадок вперед".

  • 0
    Несколько очень незначительных проблем: 1) Вы пропустили любую ссылку на шаблон диалога, который должен был появиться в ваших пунктах. 2) GetOpenFileName также обычно приводит к появлению новых блестящих диалогов, при условии, что он вызывается особым образом. Я на самом деле не знаете, есть ли современные версии VCL называют GetOpenFileName в соответствующей манере, но это несколько спорный вопрос теперь, когда TFileOpenDialog используется за кулисами.
  • 0
    @ Дэвид Хеффернан, на самом деле я посмотрел на свойство Template, но поскольку оно защищено и никогда не устанавливается в стандартных диалоговых компонентах, я решил опустить его здесь. В противном случае мне пришлось бы объяснить, как его использовать.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню