使用 Delphi XE2 和 Delphi 6
我发现按 F1 将帮助文件打开到帮助上下文不会将帮助文件打开到正确的上下文,但使用 F1 所在的菜单项该快捷方式将帮助文件打开到正确的上下文。我还有一个调用菜单项代码的按钮。
我检查以确保 F1 以及菜单项和按钮都调用完全相同的代码行,它们是:
procedure TForm1.Help1Click(Sender: TObject);
begin
Application.HelpContext(Self.HelpContext);
end;
Self.HelpContext
值根据用户在表单中的位置而更改,我验证了执行该行时 Self.HelpContext
是正确的值并且是通过 F1 或菜单项或按钮调用时具有相同的值。
我验证了这个问题也存在于我们用 Delphi 6 编写的应用程序的每个先前版本中。
这里肯定缺少一些简单的东西。有什么想法吗?
最佳答案
发生的情况是F1受到系统的特殊对待。是的,确实会触发具有 F1 快捷方式的菜单项处理程序。但在该处理程序触发后,应用程序会收到一条 WM_HELP
消息。
此 WM_HELP
消息最初由 TCustomForm.WMHelp
处理。这会查找与事件控件关联的帮助上下文 ID。然后使用该帮助上下文调用 Application.HelpContext
。并且事件控件的帮助上下文 ID 可能与表单的帮助上下文 ID 不同。
因此,尽管您的菜单项会打开您首选主题的帮助文件,但后续的 WM_HELP
会覆盖该菜单项。
看来您希望所有 F1 始终路由到表单的帮助上下文 ID。在这种情况下,我的建议如下:
- 设置表单的
HelpContext
。 - 删除表单上所有其他控件的所有
HelpContext
属性。换句话说,将它们恢复为默认值0
。
然后,当处理 WM_HELP
消息时,它会从事件控件开始并查找 0
的帮助上下文。然后它会通过父级上升到非零的形式。
我认为我还会从菜单项/操作中删除 F1 快捷方式。并让 WM_HELP
消息作为调用帮助的机制。
关于delphi - 使用 F1 键无法打开帮助文件以获取正确的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15120544/