新的TFileOpenDialog和旧的TOpenDialog有什么区别?

时间:2011-06-04 10:47:43

标签: delphi windows-7 windows-vista delphi-xe

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

2 个答案:

答案 0 :(得分:47)

满足以下条件时,

TOpenDialog执行TFileOpenDialog

  1. 程序在Vista或Windows 7下运行
  2. UseLatestCommonDialogs为真(这是默认值)
  3. 未设置OnIncludeItemOnCloseOnShow个事件
  4. 因此,在您的系统上仍然使用TOpenDialog时,您可能最终会在大多数情况下自动执行TFileOpenDialog,这就解释了为什么他们看起来一样。

    备注:TFileOpenDialog不会退回到较旧的Windows系统上 - 它只会引发异常。相反,TOpenDialog会做某种“向前倾斜”。

答案 1 :(得分:31)

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

Vista常用对话 Vista common dialog

兼容性常用对话框 Compatibility common dialog

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

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

新的对话框提供了一个更容易的自定义界面,失去了一些普遍性。如果您在Vista或更高版本上使用基于GetOpenFileName的旧对话框模板进行自定义,则对话框会降级为缺乏功能的丑陋兼容性版本。

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

如果可能,

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

  • 在Windows Vista或更高版本上运行。
  • Dialogs.UseLatestCommonDialogs全局布尔变量为true(默认为true)。如果您选择这样做,这允许您禁用新COM对话框的使用。
  • 未指定对话框模板。
  • OnIncludeItemOnCloseOnShow个事件均未分配。据推测,TFileOpenDialog无法解雇这些问题。

<强>摘要

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

  • 在XP上使用TOpenDialog和对话框模板方法。
  • 在Vista上,稍后使用TFileOpenDialog并使用IFileDialogCustomize实现自定义。