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