新的TFileOpenDialog和旧的TOpenDialog有什么区别?
新的TFileOpenDialog和旧的TOpenDialog有什么区别?
在我的电脑(Win 7 / DXE)中,当我运行代码时,对话框看起来是一样的。
-
TOpenDialog
包装传统的GetOpenFileName
。 它适用于所有版本的Windows。 -
TFileOpenDialog
包装Vista中引入的基于COM的新对话框。 因此,它只适用于Vista或更高版本。 它比旧的对话框有更多的function,特别是与search的紧密集成。
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对话框。 - 没有指定对话框模板。
-
OnIncludeItem
,OnClose
和OnShow
事件都不分配。 据推测这些不能被TFileOpenDialog
发射。
概要
如果您继续使用TOpenDialog
那么您将在多选模式下获得无限数量的文件。 但是,如果您想自定义对话框,并且有新的对话框而不是丑陋的兼容性对话框,则需要执行以下操作:
- 在XP上使用
TOpenDialog
和对话框模板方法。 - 在Vista和更高版本中使用
TFileOpenDialog
并使用IFileDialogCustomize
实现自定义。
TOpenDialog
以下条件时, TOpenDialog
执行TFileOpenDialog
:
- 该程序运行在Vista或Windows 7下
-
UseLatestCommonDialogs
是true(这是默认的) - 没有
OnIncludeItem
,OnClose
或OnShow
事件被设置
所以在你的系统上仍然使用TOpenDialog
,你可能最终TFileOpenDialog
在大多数情况下自动执行TFileOpenDialog
,这就解释了为什么它们看起来和你一样。
备注: TFileOpenDialog
不会回退到较旧的Windows系统 – 它只会引发exception。 相反, TOpenDialog
做了某种“ TOpenDialog
”。