新的TFileOpenDialog和旧的TOpenDialog有什么区别?
在我的计算机(Win 7 / DXE)中,当我运行代码时,对话框看起来相同。

最佳答案

  • TOpenDialog包装了传统的GetOpenFileName。它适用于所有版本的Windows。
  • TFileOpenDialog包装了Vista中引入的基于COM的新对话框。因此,它仅适用于Vista或更高版本。它具有比旧对话框更多的功能,尤其是与搜索的紧密集成。

  • Vista常见对话框

    兼容性通用对话框

    实际上,如果正确调用,GetOpenFileName API实际上将在大多数情况下生成新对话框,因此您实际上无法分辨出它们之间的区别。就是说,从历史上看,VCL的GetOpenFileName包装器是不精确实现的,并且总是导致显示兼容性对话框。

    但是,新的COM对话框必须提供什么呢?

    新对话框提供了一个更简单的自定义界面,但又失去了一些通用性。如果在Vista或更高版本上使用基于旧对话框模板的自定义项和GetOpenFileName,则对话框会降级为缺乏功能的丑陋兼容版本。

    新对话框的另一个主要优点是可以选择无限数量的文件。旧的GetOpenFileName接口(interface)在固定大小的缓冲区中返回了多选文件名。这可能是一个真正的限制,在我自己的代码中,我不得不修改VCL代码以使该缓冲区在我的应用程序在XP上运行时更大。

    如果可能,TOpenDialog将工作委托(delegate)给TFileOpenDialog。它使用的测试要求满足以下所有条件:
  • 在Windows Vista或更高版本上运行。
  • Dialogs.UseLatestCommonDialogs全局 bool(boolean) 变量为true(默认为true)。这样,您可以选择禁用新的COM对话框。
  • 未指定对话框模板。
  • 没有分配
  • OnIncludeItemOnCloseOnShow事件。大概这些不能由TFileOpenDialog触发。

  • 摘要

    如果继续使用TOpenDialog,则可以在多选模式下获得无限数量的文件的好处。但是,如果您希望自定义对话框,并拥有新的对话框而不是难看的兼容性对话框,则需要执行以下操作:
  • 在XP上,请使用TOpenDialog和对话框模板方法。
  • 在Vista和更高版本上,使用TFileOpenDialog并使用IFileDialogCustomize实现自定义。
  • 关于delphi - 新的TFileOpenDialog和旧的TOpenDialog有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6236275/

    10-09 16:55