1

问题

我正在使用Embarcadero C++ Builder XE。当用户按下键盘上的 F1 按钮时,我试图触发打开帮助文件 (*.chm)。我以为我已经正确完成了所有操作,但是按下 F1 时我没有得到任何响应/操作。

我做了什么:

我创建了一个 .chm 帮助文件(使用 Microsoft HTML Help Workshop)。我已将编译后的 .chm 文件复制到应用程序目录。我已经设定:

Application->HelpFile = "My_Help.chm";

在主窗体中,我已将 HelpFile 属性设置为相同的 .chm 文件。

在主表单中,我包含了以下两行代码:

#include "HtmlHelpViewer.hpp"
#pragma link "HTMLHelpViewer"

令人困惑的是:几周前我有这个工作,随后“丢失”了代码:(

从那以后,当我去重新创建解决方案时,我没有成功。

如果我定义了一个帮助按钮,如此处详述(embarcadero),仍然没有任何反应。

但是,如果我将以下代码附加到按钮上,则帮助文件会打开:

Application->HelpContext(0);

问题

有没有人知道为什么这以前会起作用,但现在却不行?也许我过去做过一个简单的步骤但已经忘记了,但我已经搜索了我能找到的所有帮助(包括在helpscribble的帮助),并涵盖了我看到的所有步骤。任何帮助将非常感激。

(我尝试在 Embarcadero 论坛上发帖,但目前这完全是浪费时间)

4

2 回答 2

0

我有帮助创作的经验,但我不是 C++ 程序员。尽管如此,我的 Windows10 PC 上还是安装了 C++ Builder 社区版。

我的 SDIForm 有以下代码片段:

#include "Vcl.HTMLHelpViewer.hpp"
#pragma package(smart_init)
#pragma link "Vcl.HTMLHelpViewer"

我将 CHM 文件 (CHM-example.chm) 复制到构建目录中以进行简化(Base、Debug 和 Release)。它对我有用。

我生成的 HTMLHelp 查看器窗口:

在此处输入图像描述

void __fastcall TSDIAppForm::Button1Click(TObject *Sender)
{
  Application->HelpContext(10000);
}
//---------------------------------------------------------------------------

void __fastcall TSDIAppForm::FormCreate(TObject *Sender)
{
  ShowMessage("The form has been created");
  Application->HelpFile = "CHM-example.chm";
}

删除上述三个目录中的 CHM 文件(CHM-example.chm)后,我尝试按照文档中的步骤进行操作 - 这也有效。但请注意,我必须删除以下代码(见截图):

Application->HelpFile = "CHM-example.chm";

为应用程序指定主帮助文件的常用方法是使用全局 Application 对象的 HelpFile 属性。

打开 Project Options 对话框(Project > Options)并选择 Appearance 页面(在 Application 下)。在帮助文件选项中,指定帮助文件。单击浏览。默认情况下,应用程序帮助文件对话框仅显示扩展名为 .hlp 的文件。要指定其他类型的帮助文件,请在文件类型控件中选择任何文件 ( . ) 类型。然后,您将能够选择 .CHM、.HTML 等类型的帮助文件。

此选项设置 Application.HelpFile 属性。此属性定义应用程序的主要帮助文件。当应用程序收到任何帮助处理命令时,默认情况下,它使用此帮助文件来执行帮助命令。

要为特定表单指定单独的帮助文件,您可以使用此表单的 HelpFile 属性。

于 2018-08-19T19:36:35.530 回答
0

发现和解决方法

我已经有了一些发现,并且暂时想出了一个解决方法,直到我了解更多关于这个主题的信息

发现一号

如果 HelpContext 值非零且有效(即 ID 在 CHM 文件中定义),则它似乎可以工作。

  • 如果我输入一个非零且有效的值,那么当我按 F1 时,帮助文件将打开(在正确的页面上)我(几乎)确定以前使用过零值 - 它会打开帮助文件第一个/默认页面

发现二

我的主要应用程序(我之前应该考虑过并提到过它)由一个包含大量帧的表单组成。主窗体包含一个导航菜单和一个框架支架空间,框架就像用户可以导航到的“页面”。

因此,一旦我到达 Discovery one(非零 ContextHelp 值),我注意到帮助文件在同一页面上打开,而不管显示的是哪个框架 - 即使我为每个框架定义了不同的 HelpContext 值。

所以每一帧的 HelpContext 值似乎没有什么区别。我想知道这是否是由于在同一位置重叠了多个帧,并且用户导航有效地涉及使一帧可见而前一帧不可见。然而,发现三让我不这么认为。

发现三

在其中一个框架(“页面”)上,我定义了以下组件:TGroupBox、TPanel、TStaticText、TCheckbox、TMemo 和 TButton

  • TGroupBox、TPanel 和 TStaticText 组件的 ContextHelp 值无效。
  • TCheckbox、TMemo 和 TButton 组件的 ContextHelp 值确实有效

所以看起来 ContextHelp 只适用于交互式组件——对点击做出明显响应的组件

这就是为什么我认为 ContextHelp 值永远不会适用于 TFrame 组件的原因。

发现四

我有许多在整个应用程序使用过程中动态创建和删除的弹出表单。为这些表单定义的 ContextHelp 值确实有效。

解决方法

我只为每个表单定义了非零和有效的 ContextHelp 值,包括主表单

我定义了一个工具栏菜单项(我使它不可见),并为其分配了 F1 快捷方式。现在,当按下 F1 时,首先运行此菜单的 OnClick 事件,然后调用常规的 OnHelp 处理。

在菜单的 OnClick 事件中,我确定哪个框架当前处于“活动”(可见)状态,并将所需的 ContextHelp 值分配给主窗体。然后调用常规的 OnHelp 处理,并使用这个新分配的 ContextHelp 值打开所需页面上的帮助文件。

最后

我对解决方法相当满意,因为它要求我在一个函数中列出所有 ContextHelp 值——无论如何我都会为框架做这件事——为了清晰和易于维护。

于 2018-08-24T16:07:55.680 回答