2

使用 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 编写的每个以前版本的应用程序中。

我在这里一定缺少一些简单的东西。有任何想法吗?

4

1 回答 1

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消息成为调用帮助的机制。

于 2013-02-27T21:22:39.163 回答