delphi - 使用 F1 键无法打开帮助文件以获取正确的上下文

标签 delphi delphi-xe2 helpfile

使用 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/

相关文章:

delphi - 如果我自己导入 SHParseDisplayName,为什么会出现访问冲突?

Delphi 5 将类型转换为评估类型导致无效类型转换错误

delphi - 如何制作与 Outlook 2013 相同的列表框?

delphi - 有没有办法从 Delphi XE2 链接到 VSTS 2010?

sandcaSTLe - 在SHFB生成的.chm中包含PDF文件(HTML帮助文件1)

vb.net - 单击按钮以在 VB.NET 中显示 .CHM 帮助文件

delphi - Delphi 7 中 Unicode 的 chr 等效项

delphi - "array of double"和 TDoubleDynArray 之间的区别

json - 如何在Delphi XE2中解析嵌套的JSON对象?

css - CHM 元素的奇怪行为