Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 帮助文件无法使用F1键打开到正确的上下文_Delphi_Delphi Xe2_Helpfile - Fatal编程技术网

Delphi 帮助文件无法使用F1键打开到正确的上下文

Delphi 帮助文件无法使用F1键打开到正确的上下文,delphi,delphi-xe2,helpfile,Delphi,Delphi Xe2,Helpfile,使用Delphi XE2和Delphi 6 我发现,按F1将帮助文件打开到帮助上下文并不能将帮助文件打开到正确的上下文,但使用F1作为快捷方式的菜单项将帮助文件打开到正确的上下文。我还有一个按钮,可以调用菜单项代码 我检查了F1和菜单项以及按钮是否调用了完全相同的代码行,它们是: procedure TForm1.Help1Click(Sender: TObject); begin Application.HelpContext(Self.HelpContext); end; Self.H

使用Delphi XE2和Delphi 6

我发现,按F1将帮助文件打开到帮助上下文并不能将帮助文件打开到正确的上下文,但使用F1作为快捷方式的菜单项将帮助文件打开到正确的上下文。我还有一个按钮,可以调用菜单项代码

我检查了F1和菜单项以及按钮是否调用了完全相同的代码行,它们是:

procedure TForm1.Help1Click(Sender: TObject);
begin
  Application.HelpContext(Self.HelpContext);
end;
Self.HelpContext
值根据用户在表单中的位置而改变,我验证了执行该行时
Self.HelpContext
是正确的值,并且通过F1或菜单项或按钮调用时是相同的值

我验证了这个问题也存在于我们用Delphi6编写的应用程序的每个以前版本中

一定有一些简单的东西我错过了。有什么想法吗?

发生的事情是F1得到了系统的特殊处理。是的,确实会激发具有快捷方式F1的菜单项处理程序。但在该处理程序启动后,应用程序会收到一条
WM\u HELP
消息

WM\u HELP
消息最初由
TCustomForm.WMHelp
处理。这将查找与活动控件关联的帮助上下文ID。然后使用该帮助上下文调用
Application.HelpContext
。可能活动控件的帮助上下文ID与窗体的帮助上下文ID不同

因此,尽管您的菜单项在首选主题处打开帮助文件,但随后的
WM_help
会覆盖该菜单项

您似乎希望所有F1始终路由到表单的帮助上下文ID。在这种情况下,我的建议如下:

  • 为表单设置
    HelpContext
  • 删除窗体上所有其他控件的所有
    HelpContext
    属性。换句话说,将它们恢复为默认值
    0
然后,当处理
WM_HELP
消息时,它从活动控件开始,并找到
0
的帮助上下文。然后它将通过父代上升到非零的形式


我想我也会从菜单项/操作中删除F1快捷方式。并让
WM_HELP
消息作为调用帮助的机制。

@Sertac谢谢。我可能会把它转过来,停止处理菜单中的F1/行动。继续使用WM_帮助。@DavidHeffernan-我非常感谢您对本期和上一期帮助文件的帮助。事实证明,带有测试帮助文件的测试应用程序似乎可以正常工作。使用我的giant应用程序和测试帮助文件进行测试也可以!我的巨型应用程序和巨型帮助文件之间似乎有些不愉快。从快捷方式中删除F1似乎没有任何影响。即使它不能解决我的具体问题,我也会接受你的回答,因为你帮了我。好笑。我重现了你描述的行为。