问题
我正在使用 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论坛上发帖,但此刻完全是在浪费时间)
答案 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窗口:
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文件中定义),则它似乎可以正常工作。
发现两个
我的主要应用程序(我应该已经考虑过并在前面提到过)由一种包含大量框架的形式组成。主要形式包含一个导航菜单和一个框架保持器空间,框架就像用户可以导航到的“页面”。
因此,一旦我发现一个(非零的ContextHelp值),我注意到无论显示哪个框架,帮助文件都会在同一页面上打开-即使我为每个框架定义了不同的HelpContext值
因此,每帧的HelpContext值似乎没有什么不同。 我想知道这是否是由于在同一位置重叠了几帧,并且用户导航实际上涉及使一帧可见而前一帧不可见。但是,发现三让我不这么认为。
发现三个
在其中一个框架(“页面”)上,我定义了以下组件:TGroupBox,TPanel,TStaticText,TCheckbox,TMemo和TButton
因此ContextHelp似乎仅适用于交互式组件-可以对点击做出明显响应的组件
这就是为什么我认为ContextHelp值永远不适用于TFrame组件的原因。
发现四个
在应用程序的整个使用过程中,我有许多弹出式窗体可以动态创建和删除。为这些表单定义的ContextHelp值确实起作用。
周围的工作
我为每种表单(包括主表单)仅定义了非零且有效的ContextHelp值
我定义了一个工具栏菜单项(使它不可见),并为其指定了F1快捷方式。现在,按下F1时,将首先运行此菜单的OnClick事件,然后调用常规的OnHelp处理。
在菜单的OnClick事件中,我确定当前处于“活动”状态(可见)的框架,然后将所需的ContextHelp值分配给主窗体。然后,将调用常规的OnHelp处理,并使用此新分配的ContextHelp值在所需页面上打开帮助文件。
最后
我对该解决方案感到非常满意,因为它要求我在一个函数中列出所有ContextHelp值(无论如何我都会对这些函数进行列出),以确保清晰度和易于维护性。