44

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

4

2 回答 2

49

TOpenDialogTFileOpenDialog满足以下条件时执行:

  1. 该程序在 Vista(及更高版本)下运行
  2. UseLatestCommonDialogs为真(这是默认值)
  3. OnIncludeItemOnCloseOnShow设置了事件

因此,尽管仍在TOpenDialog您的系统上使用,但在大多数情况下,您可能最终会自动执行TFileOpenDialog,这就解释了为什么它们对您来说看起来一样。

备注:TFileOpenDialog不依赖于旧的 Windows 系统(XP 及以下) - 它只是引发异常。相反,TOpenDialog是否会出现某种“前倾”。

于 2011-06-04T12:43:20.023 回答
36
  • TOpenDialog包裹着传统的GetOpenFileName. 它适用于所有版本的 Windows。
  • TFileOpenDialog包装在 Vista 中引入的基于 COM 的新对话框。因此,它仅适用于 Vista 或更高版本。它比旧对话框具有更多功能,最值得注意的是与搜索的紧密集成。

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

兼容性常用对话框 兼容性常用对话框

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

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

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

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

TOpenDialogTFileOpenDialog如果可能,会将工作委托给。它使用的测试要求满足以下所有条件:

  • 在 Windows Vista 或更高版本上运行。
  • Dialogs.UseLatestCommonDialogs全局布尔变量为真(默认为真)。如果您选择这样做,这允许您禁用新 COM 对话框的使用。
  • 未指定对话模板。
  • OnIncludeItem,OnClose并且OnShow事件都没有被分配。大概这些不能被TFileOpenDialog.

概括

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

  • 在 XP 上使用TOpenDialog和对话框模板方法。
  • 在 Vista 和更高版本上,TFileOpenDialog使用IFileDialogCustomize.
于 2011-06-04T12:41:04.387 回答