Delphi 新的TFileOpenDialog和旧的TopEndDialog有什么区别?
新的TFileOpenDialog和旧的TopEndDialog有什么区别?Delphi 新的TFileOpenDialog和旧的TopEndDialog有什么区别?,delphi,windows-7,windows-vista,fileopendialog,opendialog,Delphi,Windows 7,Windows Vista,Fileopendialog,Opendialog,新的TFileOpenDialog和旧的TopEndDialog有什么区别? 在我的计算机(Win 7/DXE)中,当我运行代码时,对话框看起来是一样的。 TOpenDialog包装了传统的GetOpenFileName。它适用于所有版本的Windows TFileOpenDialog包装了Vista中引入的新的基于COM的对话框。因此,它只适用于Vista或更高版本。它比旧的对话框有更多的功能,尤其是与搜索的紧密集成 Vista公用对话框 兼容性通用对话框 如果调用正确,在大多数情况下,
在我的计算机(Win 7/DXE)中,当我运行代码时,对话框看起来是一样的。
包装了传统的TOpenDialog
。它适用于所有版本的WindowsGetOpenFileName
包装了Vista中引入的新的基于COM的对话框。因此,它只适用于Vista或更高版本。它比旧的对话框有更多的功能,尤其是与搜索的紧密集成TFileOpenDialog
GetOpenFileName
API实际上会生成新的对话框,因此您实际上无法区分它们之间的区别。也就是说,从历史上看,VCL的GetOpenFileName
包装器的实现不精确,并且总是导致显示兼容性对话框
但是,新的COM对话框必须提供什么呢
新的对话框提供了一个更简单的定制界面,但失去了一些通用性。如果在Vista或更高版本上使用基于旧对话框模板的自定义,则对话框将降级为缺乏功能的丑陋兼容版本
新对话框的另一大优势是能够选择无限数量的文件。旧的GetOpenFileName
接口在固定大小的缓冲区中返回了多选文件名。这可能是一个真正的限制,在我自己的代码中,我不得不破解VCL代码,以便在我的应用程序在XP上运行时使缓冲区更大
TOpenDialog
将尽可能将工作委托给TFileOpenDialog
。它使用的测试要求满足以下所有条件:
- 在Windows Vista或更高版本上运行
全局布尔变量为true(默认值为true)。这允许您在选择使用新COM对话框时禁用该对话框对话框。UseLatestCommonDialogs
- 未指定对话框模板
、OnIncludeItem
和OnClose
事件均未分配。大概这些不能由OnShow
触发TFileOpenDialog
TOpenDialog
,您将在多选模式下获得无限数量文件的好处。但是,如果您希望自定义对话框,并使用新对话框而不是丑陋的兼容对话框,则需要执行以下操作:
- 在XP上使用
和对话框模板方法TOpenDialog
- 在Vista和更高版本上,使用
并使用TFileOpenDialog
实现自定义IFileDialogCustomize
TOpenDialog
在满足以下条件时执行TFileOpenDialog
:
UseLatestCommonDialogs
为true(默认值)OnIncludeItem
、OnClose
或OnShow
事件TOpenDialog
时,在大多数情况下,您可能会自动执行TFileOpenDialog
,这就解释了为什么它们看起来都一样
备注:
TFileOpenDialog
不支持旧版Windows系统(XP及以下版本)-它只会引发一个异常。相反,TOpenDialog
执行某种“前向下降”操作。TFileOpenDialog实现了Vista样式的打开对话框,但在以前版本的Windows中使用了较旧的样式。@GolezTrol,TFileOpenDialog在XP下运行时引发异常。@Uwe Raabe。无法测试,但我相信你是对的。我错了。等一下,你和我们互相矛盾。我删除+1,但将在问题解决后立即恢复它。。。我刚刚检查了一下,Uwe是对的。@Andreas好的,我想它现在已经修好了。如果我记得正确的话,那不是VCL部分不精确,而是不断变化的OPENFILENAME结构。VCL与早期的OS版本兼容,声明了较小的结构,从而显示了较旧的对话框。但我可能错了。在DelphiXe2中,还有另一个条件:StyleServices.Enabled必须为true。有人知道为什么吗???我使用Win 7和旧样式,为什么新对话框被禁用???@oxo这是VCL中的一个错误。有许多类似的bug。这就是为什么我在系统文件对话框中使用自己的包装器的原因之一。任务对话框包装器也出现了相同的错误。VCL编码器不够好。有几个非常小的抱怨:1)你错过了任何应该出现在要点中的对话框模板的参考。2) GetOpenFileName通常也会产生闪亮的新对话框,只要它是以特定的方式调用的。实际上,我不确定VCL的现代版本是否以适当的方式调用GetOpenFileName,但现在TFileOpenDialog在幕后使用,这有点毫无意义。@David Heffernan,我实际上查看了Template属性,但由于它是受保护的,并且从未在标准对话框组件中设置,所以我决定在这里省略它。否则我必须解释如何使用它。模板受保护吗?我没有意识到这一点,但我使用我自己的包装,而不是VCL的。问题是,对话框定制是导致您使用TFileOpenDialog的主要问题。因此,明智的做法是使用“旧”TopEndDialog,以获得与XP和7的兼容性。谢谢+1并接受。