Delphi 新的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公用对话框 兼容性通用对话框 如果调用正确,在大多数情况下,

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

  • TOpenDialog
    包装了传统的
    GetOpenFileName
    。它适用于所有版本的Windows
  • TFileOpenDialog
    包装了Vista中引入的新的基于COM的对话框。因此,它只适用于Vista或更高版本。它比旧的对话框有更多的功能,尤其是与搜索的紧密集成
Vista公用对话框

兼容性通用对话框

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

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

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

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

TOpenDialog
将尽可能将工作委托给
TFileOpenDialog
。它使用的测试要求满足以下所有条件:

  • 在Windows Vista或更高版本上运行
  • 对话框。UseLatestCommonDialogs
    全局布尔变量为true(默认值为true)。这允许您在选择使用新COM对话框时禁用该对话框
  • 未指定对话框模板
  • OnIncludeItem
    OnClose
    OnShow
    事件均未分配。大概这些不能由
    TFileOpenDialog
    触发
摘要

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

  • 在XP上使用
    TOpenDialog
    和对话框模板方法
  • 在Vista和更高版本上,使用
    TFileOpenDialog
    并使用
    IFileDialogCustomize
    实现自定义

TOpenDialog
在满足以下条件时执行
TFileOpenDialog

  • 该程序正在Vista(及更高版本)下运行
  • 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并接受。