【发布时间】:2016-03-24 10:44:13
【问题描述】:
我正在尝试在 Delphi XE6 中使用 TSaveDialog:
if not SaveDialog1.Execute(0) then
Exit;
调用立即返回false,不显示任何对话框。我将其追溯到创建 shell Save Dialog COM 对象的行为:
function TCustomFileSaveDialog.CreateFileDialog: IFileDialog;
var
LGuid: TGUID;
begin
LGuid := CLSID_FileSaveDialog;
CoCreateInstance(LGuid, nil, CLSCTX_INPROC_SERVER,
StringToGUID(SID_IFileSaveDialog), Result);
end;
对CoCreateInstance 的调用失败。我创建了最少的代码来重现该问题:
procedure TForm1.Button1Click(Sender: TObject);
const
CLSID_FileSaveDialog: TGUID = '{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}';
begin
CreateComObject(CLSID_FileSaveDialog);
end;
它抛出 EOleSysError 异常:
0x80040111:ClassFactory 无法提供请求的类,ClassID:{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}
我的应用程序正在使用公共控件库的第 6 版 (6.0.7601.18837),但我意识到只有当用户为我的应用程序禁用视觉样式时才会发生这种情况:
我们仍在使用第 6 版的通用控件库,只是 IsAppThemed 返回 false。
注意:我知道很多人错误地认为:
- Visual Styles API 仅在我们加载了版本 6 的 Comctrl32.dll 时才有效
- 如果加载了 Comctrl32.dll 版本 6,则 Visual Styles API 将起作用
- 如果我们不使用 ComCtrl v6,那么这意味着视觉样式被禁用
- 如果我们使用旧的通用控件库,视觉样式将被禁用
蛮力解决方案是将全局 UseLatestCommonDialogs 设置为 false。
但这很糟糕,因为它只适用于在他们的应用程序中禁用视觉样式的人:
- 对话框继续在没有视觉样式的操作系统上工作(例如 Windows Server 2008 R2)
- 对话框在视觉样式关闭的情况下继续工作(例如,Windows 7 视觉样式关闭)
这意味着我不能简单地使用IsAppThemed,因为如果IsThemeActive 为假,它也会返回假。
| IsThemeActive | IsAppThemed | Disable visual styles | Result |
|---------------|-------------|-----------------------|-----------|
| True | True | Unchecked | Works |
| True | False | Checked | Fails |
| False | False | Unchecked | Works |
| False | False | Checked | Fails |
我想我要问的是如何检查 Disble Visual Styles 兼容标志的状态。
我真正要问的是如何使TSaveDialog 在 Delphi 中正常工作(并不暗示读取 compat 标志是解决方案的一部分)。
【问题讨论】:
-
我希望这不是一个太迟钝的查询,但为什么是“SaveDialog1.Execute(0)”而不是更常见的“SaveDialog1.Execute”?
-
@MartynA 嗯,有三个原因 i)
.Execute没有出现在代码洞察力中 ii) 调用.Execute导致窗口归ApplicationMainHandle拥有 iii) 实际上我希望对话框拥有我正在查看的表单(例如SaveDialog1.Execute(Self.Handle))。但我不希望人们关注传递给Execute的参数,所以我将其简化为.Execute(0)。实际上,Delphi 的窗口所有权被打破了,它忽略了所有者——而是将它想要的任何东西都带到了前面。 -
考虑到这个公认的答案:superuser.com/questions/694734/… 也检查
IsCompositionActive是否合理?只是猜测 -
@fantaghirocco 禁用桌面合成不会禁用视觉样式,反之亦然。
标签: delphi themes delphi-xe6 visual-styles