无法在Embarcadero应用程序中打开帮助文件(* .chm)文件

时间:2018-08-17 19:57:49

标签: c++builder chm c++builder-xe helpfile

问题

我正在使用 Embarcadero C ++ Builder XE 。 当用户按下键盘上的F1按钮时,我试图触发打开帮助文件(* .chm)。 我以为我做的一切都正确,但是按F1时我没有任何反应。

我做什么:

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

Application->HelpFile = "My_Help.chm";

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

在主要形式中,我包括以下两行代码:

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

令人困惑的是:几周前我已经完成了这项工作,随后“丢失”了代码:(

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

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

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

Application->HelpContext(0);

问题

有人知道为什么以前可以这样做,但是现在不行了吗? 也许过去我曾经做过一个简单的步骤,但是已经忘记了,但是我已经搜索了所有可以找到的帮助(包括在helpscribble处),并涵盖了我所看到的所有步骤。 任何帮助将不胜感激。

(我曾尝试在Embarcadero论坛上发帖,但此刻完全是在浪费时间)

2 个答案:

答案 0 :(得分:0)

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

我的SDIForm具有以下代码段:

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

我将CHM文件(CHM-example.chm)复制到了构建目录中以进行简化(基础,调试和发行)。它对我有用。

出现的HTMLHelp Viewer窗口:

enter image description here

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属性。

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

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

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

答案 1 :(得分:0)

发现和解决方法

我已经发现了一些发现,并且暂时提出了解决方法,直到我对该主题有了更多的了解

发现一个人

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

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

发现两个

我的主要应用程序(我应该已经考虑过并在前面提到过)由一种包含大量框架的形式组成。主要形式包含一个导航菜单和一个框架保持器空间,框架就像用户可以导航到的“页面”。

因此,一旦我发现一个(非零的ContextHelp值),我注意到无论显示哪个框架,帮助文件都会在同一页面上打开-即使我为每个框架定义了不同的HelpContext值

因此,每帧的HelpContext值似乎没有什么不同。 我想知道这是否是由于在同一位置重叠了几帧,并且用户导航实际上涉及使一帧可见而前一帧不可见。但是,发现三让我不这么认为。

发现三个

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

  • TPGroupBox,TPanel和TStaticText的ContextHelp值 组件无效。
  • TCheckbox的ContextHelp值, TMemo和TButton组件可以正常工作

因此ContextHelp似乎仅适用于交互式组件-可以对点击做出明显响应的组件

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

发现四个

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

周围的工作

我为每种表单(包括主表单)仅定义了非零且有效的ContextHelp值

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

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

最后

我对该解决方案感到非常满意,因为它要求我在一个函数中列出所有ContextHelp值(无论如何我都会对这些函数进行列出),以确保清晰度和易于维护性。

相关问题