【发布时间】:2013-05-16 17:41:19
【问题描述】:
我正在使用带有 TNT 控件的 Delphi7。有没有办法在 Win7 上调用现代打开/保存对话框?也许是 VCL 的补丁,TNT 的补丁? TNT 补丁是首选,因为我需要 Unicode 感知对话框,但也可能需要(更少)VCL 补丁。
【问题讨论】:
-
当然。 (基本上)Windows API 的每个部分都可以从 Delphi(甚至是旧版本)中使用。一如既往地开始at MSDN。
我正在使用带有 TNT 控件的 Delphi7。有没有办法在 Win7 上调用现代打开/保存对话框?也许是 VCL 的补丁,TNT 的补丁? TNT 补丁是首选,因为我需要 Unicode 感知对话框,但也可能需要(更少)VCL 补丁。
【问题讨论】:
可能最简单的方法是直接调用 API 函数 GetOpenFileName 和 GetSaveFileName。除非您使用一些更深奥的功能,否则这些将在 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() 调用现代对话框,这是不能保证的,您应该直接访问IFileOpenDialog 和IFileSaveDialog COM 接口以确保您确实获得符合预期的现代对话。我在 BCB/Delphi 6 中使用了这些接口,它们工作正常,它们只需要手动声明,仅此而已。
CoCreateInstance()(或至少检查操作系统版本),如果成功则使用接口,否则回退到其他功能。这不像是过于复杂的对话框,也不涉及很多代码。