使用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中编写的每个早期版本的应用程序中都验证了这个问题。
我必须在这里找到一些简单的东西。有什么想法吗?
答案 0 :(得分:2)
正在发生的事情是 F1 受到系统的特殊处理。是的,您的菜单项的处理程序具有 F1 的快捷方式。但是在该处理程序触发后,该应用程序收到WM_HELP
消息。
此WM_HELP
消息最初由TCustomForm.WMHelp
处理。这将查找与活动控件关联的帮助上下文ID。然后使用该帮助上下文调用Application.HelpContext
。并且可能是主动控件的帮助上下文ID与表单的不同。
因此,虽然您的菜单项会在首选主题中打开帮助文件,但后续的WM_HELP
会覆盖菜单项。
您希望所有 F1 始终路由到表单的帮助上下文ID。在这种情况下,我的建议如下:
HelpContext
。HelpContext
属性。换句话说,将它们还原为默认值0
。然后,当处理WM_HELP
消息时,它将从活动控件开始,并找到0
的帮助上下文。然后它会通过父母上升到非零的形式。
我认为我还会从菜单项/操作中删除 F1 快捷方式。让WM_HELP
消息成为调用帮助的机制。