1

我们正在使用以下代码通过 Delphi XE2 应用程序上的 A-links 调用 html 帮助:

var
  aLink: THH_AKLink;
begin
  ZeroMemory(@aLink, SizeOf(aLink));
  aLink.cbStruct := SizeOf(aLink);
{$WARNINGS OFF}
  aLink.pszKeywords := PChar(AnsiString(AKeyword));
{$WARNINGS ON}
  aLink.fIndexOnFail := False;
  HtmlHelpW(Handle, Application.HelpFile, HH_ALINK_LOOKUP, DWORD_PTR(@aLink))
end;

但是,如果AKeyword在 .chm 文件中描述了两次,则应用程序会冻结(挂起)。Delphi 或系统库似乎有问题。但是如何在应用程序上解决这个问题?

非常感谢您的帮助!

4

2 回答 2

1

将两次添加到已编译的 chm 文件中,第三方应用程序2 等于 ALink

那么当chm文件没有按预期工作时,你把责任归咎于Delphi XE2吗?

1.) 您不能将 AKeyword 与

HtmlHelpW(Handle, Application.HelpFile, HH_ALINK_LOOKUP, DWORD_PTR(@aLink))

您可以使用 KLink 关键字进行尝试:

HtmlHelpW(Handle, Application.HelpFile+'>main', HH_DISPLAY_TOPIC, DWORD_PTR(nil));
HtmlHelpW(Handle, Application.HelpFile, HH_KEYWORD_LOOKUP, DWORD_PTR(@link));

ALink是他出现在这里的一次跳跃,也是KLink相关话题中的一次展示或跳跃。

但是,找到的主题列表不是基于索引中的关键字,而是基于ALink names.htm 文件中涉及的关键字。

这只能与 ALink 一起使用。下面是一个ALink。

xy.htm 的一部分

<Object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
    <param name="ALink Name" value="UsingtheMenus">
</OBJECT>

2.)在您的代码中,我看不到以下内容:

HtmlHelpW(Handle, Application.HelpFile, HH_DISPLAY_TOPIC, DWORD_PTR(nil));
  • 在调用之前必须先调用 HH_DISPLAY_TOPIC 命令HH_ALINK_LOOKUP,以确保创建帮助窗口。

HH_ALINK_LOOKUP 命令

  • 帮助作者使用 HTML 帮助编译器信息功能将 ALink 名称插入目标主题文件。
  • ALink : name="ALink 名称" value="lookupAlink"
  • KLink:名称=“关键字”值=“查找关键字”

查找区分大小写。多个查找由分号分隔。

除了自动生成的关键字,在编译 .htm 源文件时。

在此处输入图像描述

您可以使用显式的 KLink。

这是一个显式的“KLink”,该位置可能位于 .htm 文件中的任何位置,用于关键字

<Object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
    <param name="Keyword" value="lookupKeyword">
</OBJECT>

如果您创建了错误消息,则会显示错误并且应用程序正常继续,这是有益的。来自答案的来源如何添加对 HTML 帮助文件 (.chm) 的支持....

procedure TForm1.HHALINKLOOKUPClick(Sender: TObject);
var
link : HH_AKLINK;
szUrl,szKey,szMsgText,szMsgTitle,szWindow : AnsiString;
begin
   szKey      := Edit1.Text; // 'UsingtheMenus';
   szUrl      :='Overview.htm';
   szMsgText  :='Error: Can''t find "'+Edit1.Text+'"!';
   szMsgTitle :='Error: HH_ALINK_LOOKUP';
   szWindow   :='main';

   with link do begin
   cbStruct    := sizeof(HH_AKLINK) ;
   fReserved   := False;
   pszKeywords := PChar(szKey);
   pszUrl      := nil;
   pszMsgText  := PChar(szMsgText);
   pszMsgTitle := PChar(szMsgTitle);
   pszWindow   := PChar(szWindow);
   fIndexOnFail:= False;
   end;
   HtmlHelpW(Handle, Application.HelpFile+'>main', HH_DISPLAY_TOPIC, DWORD_PTR(nil));
   HtmlHelpW(Handle, Application.HelpFile, HH_ALINK_LOOKUP, DWORD_PTR(@link));
end;

当你在没有最后一个字母“s”的情况下 ALink “UsingtheMenus” 调用时,你会得到什么。

在此处输入图像描述

测试您的:使用 3rd 方应用程序更改的 chm 文件

您可以使用 HTML Help Workshop 测试任何 .chm 文件

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

于 2013-04-26T23:32:27.233 回答
0

目前最好的答案是删除 CHM 文件上所有重复的 A 链接,并确保其上没有重复项。

于 2013-08-07T17:27:40.870 回答