gpt4 book ai didi

delphi - 将帮助文件链接到 Delphi XE2 应用程序 - 除主窗体外一切正常

转载 作者:行者123 更新时间:2023-12-03 15:00:34 27 4
gpt4 key购买 nike

我正在努力使用我们的软件设置帮助文件。我已经为许多特定的表单/框架/控件添加了 HelpContext 编号,它们都工作正常。问题是主窗体根本没有提供任何帮助。对于所有这些,我仅使用 F1 来尝试触发帮助。

我根本不是 Delphi 或帮助文件方面的专家,但我会发布我所做的事情以及我看过的内容。

编辑:感谢一些帮助,我现在发现问题是由于主窗体是 MDI 父级造成的。这仍然不能解决问题..对我来说这几乎像是一个错误,但我想这可能是出于某种原因故意的。 结束编辑

我将这个单元包括在内:供查看器使用的 HtmlHelpViewer。在主窗体 Create 构造函数中,我添加了 Application.Helpfile := 'asdf.chm'。对于所有其他形式,我刚刚添加了上下文编号,并且立即生效。我在主窗体上尝试过,但没有任何反应。因此,我尝试添加一个 Application.OnHelp 事件,但这不会在主窗体上调用(并且它会在所有其他正在运行帮助的窗体上调用)。

我能想到的最后一个办法是深入追踪代码,看看发生了什么。我到达 Vcl.Forms 中的 TCustomForm.WMHelp 作为发生拆分的地方。所述函数有这样的循环:

if iContextType = HELPINFO_WINDOW then
begin
Control := FindControl(hItemHandle);
while (Control <> nil) and ( not ControlHasHelp(Control)) do
Control := Control.Parent;
if Control = nil then Exit;
GetHelpInfo(Control, HType, ContextID, Keyword);
Pt := Control.ClientToScreen(Point(0, 0));
end

当主窗体调用时,帮助控件将为 nil,然后退出。其他一切都会顺利进行。

我显然不知道为什么会发生这种情况。答案可能是一些非常基本的东西。任何想法将不胜感激!

最佳答案

根据您的评论,WM_HELP 消息的目标是您的 MDI 客户端窗口。由于它不是 VCL 控件,因此它不会响应 WM_HELP 消息。您可以通过拦截消息并要求主窗体处理来处理问题:

type
TMainForm = class(TForm)
protected
procedure WMHelp(var Message: TWMHelp); message WM_HELP;
end;
....
procedure TMainForm.WMHelp(var Message: TWMHelp);
begin
if (Message.HelpInfo.iContextType=HELPINFO_WINDOW)
and (Message.HelpInfo.hItemHandle=ClientHandle) then
Message.HelpInfo.hItemHandle := Handle;
inherited;
end;

如果你想更具防御性,你可以这样写:

  if (Message.HelpInfo.iContextType=HELPINFO_WINDOW) 
and (FindControl(Message.HelpInfo.hItemHandle)=nil) then
Message.HelpInfo.hItemHandle := Handle;

我刚刚查看了我自己的 MDI 应用程序,我可以看到我有类似的代码来处理这个确切的问题。如果它不是十多年前写的,我可能会更早记住!

关于delphi - 将帮助文件链接到 Delphi XE2 应用程序 - 除主窗体外一切正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9984968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com