新的 TFileOpenDialog 和旧的 TOpenDialog 有什么区别?
在我的计算机(Win 7/DXE)中,当我运行代码时,对话框看起来是一样的。
2 回答
TOpenDialog
TFileOpenDialog
满足以下条件时执行:
- 该程序在 Vista(及更高版本)下运行
UseLatestCommonDialogs
为真(这是默认值)- 否
OnIncludeItem
,OnClose
或OnShow
设置了事件
因此,尽管仍在TOpenDialog
您的系统上使用,但在大多数情况下,您可能最终会自动执行TFileOpenDialog
,这就解释了为什么它们对您来说看起来一样。
备注:TFileOpenDialog
不依赖于旧的 Windows 系统(XP 及以下) - 它只是引发异常。相反,TOpenDialog
是否会出现某种“前倾”。
TOpenDialog
包裹着传统的GetOpenFileName
. 它适用于所有版本的 Windows。TFileOpenDialog
包装在 Vista 中引入的基于 COM 的新对话框。因此,它仅适用于 Vista 或更高版本。它比旧对话框具有更多功能,最值得注意的是与搜索的紧密集成。
Vista 常用对话框
兼容性常用对话框
如果调用正确,GetOpenFileName
API 实际上会在大多数情况下生成新对话框,因此您实际上无法区分。也就是说,从历史上看,VCL 的包装器的GetOpenFileName
实现并不精确,并且总是导致显示兼容性对话框。
但是新的 COM 对话框必须提供什么呢?
新对话框提供了一个更简单的自定义界面,但失去了一些通用性。如果您GetOpenFileName
在 Vista 或更高版本上使用基于旧对话框模板的自定义,则对话框会降级为缺乏功能的丑陋兼容性版本。
新对话框的另一大优势是能够选择无限数量的文件。旧GetOpenFileName
界面在固定大小的缓冲区中返回多选文件名。这可能是一个真正的限制,在我自己的代码中,当我的应用程序在 XP 上运行时,我不得不修改 VCL 代码以使这个缓冲区更大。
TOpenDialog
TFileOpenDialog
如果可能,会将工作委托给。它使用的测试要求满足以下所有条件:
- 在 Windows Vista 或更高版本上运行。
Dialogs.UseLatestCommonDialogs
全局布尔变量为真(默认为真)。如果您选择这样做,这允许您禁用新 COM 对话框的使用。- 未指定对话模板。
OnIncludeItem
,OnClose
并且OnShow
事件都没有被分配。大概这些不能被TFileOpenDialog
.
概括
如果您继续使用,TOpenDialog
那么您将在多选模式下获得无限数量的文件的好处。但是,如果您希望自定义对话框,并拥有新对话框而不是丑陋的兼容性对话框,那么您需要执行以下操作:
- 在 XP 上使用
TOpenDialog
和对话框模板方法。 - 在 Vista 和更高版本上,
TFileOpenDialog
使用IFileDialogCustomize
.