新的TFileOpenDialog和旧的TOpenDialog有什么区别?

新的TFileOpenDialog和旧的TOpenDialog有什么区别?
在我的电脑(Win 7 / DXE)中,当我运行代码时,对话框看起来是一样的。

  • TOpenDialog包装传统的GetOpenFileName 。 它适用于所有版本的Windows。
  • TFileOpenDialog包装Vista中引入的基于COM的新对话框。 因此,它只适用于Vista或更高版本。 它比旧的对话框有更多的function,特别是与search的紧密集成。

Vista常用对话框 Vista常用对话框

兼容性通用对话框 兼容性通用对话框

如果调用正确, GetOpenFileName API实际上会在大多数情况下产生新的对话框,所以您实际上无法区分它们。 也就是说,历史上,VCL的GetOpenFileName封装器实现不精确,并始终导致显示兼容性对话框。

但是新的COM对话框提供了什么呢?

新的对话框提供了一个更容易的定制界面,在一些普遍性的损失。 如果您在Vista或更高版本上使用基于旧对话框模板的自定义GetOpenFileName ,则对话框会降级为缺乏function的丑陋兼容版本。

新对话框的另一大优点是可以select无限数量的文件。 旧的GetOpenFileName接口在固定大小的缓冲区中返回多选文件名。 这可能是一个真正的限制,在我自己的代码中,我必须破解VCL代码,以便在我的应用在XP上运行时使这个缓冲区更大。

如果可能, TOpenDialog将把工作委托给TFileOpenDialog 。 它使用的testing需要以下所有条件都是正确的:

  • 在Windows Vista或更高版本上运行。
  • Dialogs.UseLatestCommonDialogs全局布尔variables为true(默认为true)。 如果您select这样做,您可以禁用新的COM对话框。
  • 没有指定对话框模板。
  • OnIncludeItemOnCloseOnShow事件都不分配。 据推测这些不能被TFileOpenDialog发射。

概要

如果您继续使用TOpenDialog那么您将在多选模式下获得无限数量的文件。 但是,如果您想自定义对话框,并且有新的对话框而不是丑陋的兼容性对话框,则需要执行以下操作:

  • 在XP上使用TOpenDialog和对话框模板方法。
  • 在Vista和更高版本中使用TFileOpenDialog并使用IFileDialogCustomize实现自定义。

TOpenDialog以下条件时, TOpenDialog执行TFileOpenDialog

  1. 该程序运行在Vista或Windows 7下
  2. UseLatestCommonDialogs是true(这是默认的)
  3. 没有OnIncludeItemOnCloseOnShow事件被设置

所以在你的系统上仍然使用TOpenDialog ,你可能最终TFileOpenDialog在大多数情况下自动执行TFileOpenDialog ,这就解释了为什么它们看起来和你一样。

备注: TFileOpenDialog不会回退到较旧的Windows系统 – 它只会引发exception。 相反, TOpenDialog做了某种“ TOpenDialog ”。