【问题标题】:Modern Win7 Open/Save dialog for Delphi 7 appDelphi 7 应用程序的现代 Win7 打开/保存对话框
【发布时间】:2013-05-16 17:41:19
【问题描述】:

我正在使用带有 TNT 控件的 Delphi7。有没有办法在 Win7 上调用现代打开/保存对话框?也许是 VCL 的补丁,TNT 的补丁? TNT 补丁是首选,因为我需要 Unicode 感知对话框,但也可能需要(更少)VCL 补丁。

【问题讨论】:

  • 当然。 (基本上)Windows API 的每个部分都可以从 Delphi(甚至是旧版本)中使用。一如既往地开始at MSDN

标签: delphi delphi-7


【解决方案1】:

可能最简单的方法是直接调用 API 函数 GetOpenFileNameGetSaveFileName。除非您使用一些更深奥的功能,否则这些将在 Vista 及更高版本上显示现代对话框。

显然,您需要调用 W 变体,并传递结构的 W 版本。

这是我能构建的最简单的例子:

var
  ofn: TOpenFilenameW;
  FileName: array [0..MAX_PATH-1] of WideChar;
begin
  FillChar(ofn, SizeOf(ofn), 0);
  ofn.lStructSize := SizeOf(ofn);
  ofn.hWndOwner := Handle;
  ofn.lpstrFilter := 'All files'#0'*.*'#0;
  FileName[0] := #0;
  ofn.lpstrFile := @FileName;
  ofn.nMaxFile := Length(FileName);
  ofn.lpstrTitle := 'Select File';
  if GetOpenFileNameW(ofn) then
    MessageBoxW(Handle, FileName, nil, MB_OK);
end;

当然,您可以扩展它以获得更多功能。

【讨论】:

  • 而不是依赖GetOpenFileNameW()GetSaveFileNameW() 调用现代对话框,这是不能保证的,您应该直接访问IFileOpenDialogIFileSaveDialog COM 接口以确保您确实获得符合预期的现代对话。我在 BCB/Delphi 6 中使用了这些接口,它们工作正常,它们只需要手动声明,仅此而已。
  • 你可以这样做,但你最终会编写两个版本的代码,一个用于 XP,一个用于更高版本。
  • 不过,这很容易处理。首先尝试CoCreateInstance()(或至少检查操作系统版本),如果成功则使用接口,否则回退到其他功能。这不像是过于复杂的对话框,也不涉及很多代码。
  • @Remy 是的,这很容易处理。但它仍然必须完成。我的代码完全符合您的描述。
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多