Delphi XE2:跳到 CHM 中的锚点?

Posted

技术标签:

【中文标题】Delphi XE2:跳到 CHM 中的锚点?【英文标题】:Delphi XE2: Jumping to an anchor in CHM? 【发布时间】:2012-08-30 04:17:57 【问题描述】:

在 Delphi XE2 程序中,如何跳转到 CHM 帮助文件主题中的锚点?锚点具有以下格式(从显示 CHM 文件的 html HelpViewer 中的主题页面源中提取):

<a name="my_anchor_id"></a>

我尝试了以下方法:

Application.HelpJump('MyTopicName.htm#my_anchor_id');

不幸的是,这不起作用:它确实跳转到了这个主题,但只是跳转到了主题的顶部,而不是跳转到页面下方的锚点。

【问题讨论】:

在 HTML HelpViewer 中,每个主题都由其 HTML 文件名表示:“[TopicName].htm”。这就是为什么“Application.HelpJump('MyTopicName.htm');”确实有效。难道不能像处理浏览器中的 HTML 对象一样处理这个内部 HTML 对象吗? 是的,如果可以的话,那就太好了。但你不能。你需要一个链接。以及主题 ID 或主题名称。 如何使用 ALinks 跳转到 CHM 主题内的锚点? 好吧,我在我的应用程序中使用上下文 ID 进行操作。所以我使用Application.HelpContext。如果你使用名称而不是 ID,那么我猜你会使用 HelpJump 可能有soem ?params plus javascript ? 【参考方案1】:

在 CHM 中跳转到锚点 使用 Delphi2010 - DelphiXE2 - Windows XP 测试

如何使用 Delphi 跳转到 chm 文件(已编译的 HTML 帮助)中的 锚点

是的,可以使用 HtmlHelp() 命令跳转到锚点。&lt;a name="my_anchor"&gt;&lt;/a&gt;

 HtmlHelp(0,hpPath+'::/Overview.htm#UsingtheMenus>main',HH_DISPLAY_TOPIC,DWORD(nil));

链接: Overview.htm

注意:此链接不需要通过delphi程序跳转到 锚点。(仅用于测试)。

Overview.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
[...]
<BODY bgColor=#f7f8e2>
<H1>Overview</H1>
<A HREF="Overview.htm#UsingtheMenus">Using the Menus</A>
[...]

锚点: Overview.htm

[...]
<A NAME="UsingtheMenus" </A>
<P><STRONG>Using the Menus and Toolbars</STRONG>
[...]

如果有人想试试。

这里有更多信息和一个测试程序:

运行 Project1.exe 并选择 without :

Unit1.pas / 命令

procedure TForm1.Button2Click(Sender: TObject);
begin
    HtmlHelp(0,hpPath+'::/Overview.htm#UsingtheMenus>main',HH_DISPLAY_TOPIC,DWORD(nil));
end;
点击按钮Overview.htm#UsingtheMenus

结果:

帮助文件打开并出现overview.htm。它被跳到了锚点。


下载源Project1.exe D2010和XE2。 下载源码sample.chm HtmlHelp项目。

Download


现在让我们测试其他 2 个按钮

procedure TForm1.HelpKeywordClick(Sender: TObject);
begin
  Application.HelpKeyword('UsingtheMenus');
end;

procedure TForm1.HelpContextClick(Sender: TObject);
begin
  Application.HelpContext(IDH_UsingtheMenus);
end;
点击按钮HelpKeyword('UsingtheMenus')

结果:

帮助文件打开并出现FirstTopic.htm。文本UsingtheMenus 被插入到搜索字段中。 不要跳到锚点!


点击按钮HelpContext(IDH_UsingtheMenus)')

除搜索框为空外,结果相同。


此处显示最后 2 次点击: 文件 HelpFile2\sample.chm 中没有秘密 ID 或关键字


现在我们更改帮助文件,使除了Overview.htm#UsingtheMenus 之外的其他两种方法都能成功。

关闭应用程序“Project.exe” 再次运行“Project.exe”。 确保选择了with

现在我们使用文件夹 HelpFile\ 中的“sample.chm” 使用以下设置。

样本.h

#define IDH_Creating_Projects_and_Topics 1005#define IDH_Overview 1003#define IDH_UsingtheMenus 1009

sample.ali

IDH_Overview=Overview.htmIDH_welcom=FirstTopic.htmIDH_UsingtheMenus=Overview.htm#UsingtheMenus

样本.hcc

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
[...]
        <LI> <OBJECT type="text/sitemap">
            <param name="Name" value="Using the Menus">
            <param name="Local" value="Overview.htm#UsingtheMenus">
        </OBJECT>   
[...]
</HTML>

sample.hhk

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
[...]
    <LI> <OBJECT type="text/sitemap">
        <param name="Name" value="Using the Menus">
        <param name="Name" value="Using the Menus">
        <param name="Local" value="Overview.htm#UsingtheMenus">
        </OBJECT>   
[...]
</HTML>

如果我们编译“sample.chm”,我们会收到一条错误消息。

HHC3015: Warning: An alias has been created to "Overview.htm#UsingtheMenus" but the file does not exist.

这是正常的,因为文件“Overview.htm#UsingtheMenus”并不真正存在!

我们试试吧

不要忘记,“帮助窗口”在尝试以下各项后,会再次关闭。否则你无法追踪不同的状态。

点击按钮HelpKeyword('UsingtheMenus')

结果: 帮助文件打开并出现FirstTopic.htm。文本UsingtheMenus 被插入到搜索字段中。文本UsingtheMenus在列表框中被选中 如果你点击Show 它被跳到了锚点。


点击按钮HelpContext(IDH_UsingtheMenus)')

结果:

帮助文件打开并出现overview.htm。它被跳到了锚点。


点击按钮Overview.htm#UsingtheMenus

结果:

结果与上述相同。 帮助文件打开并出现overview.htm。它被跳到了锚点。


现在我们可以使用三种方法之一来跳转到所需的标记。


如果有人对其他按钮的功能感兴趣,请继续阅读并获取更多信息。

明天继续。

【讨论】:

虽然所有图片和粗体文字和formatted code都非常漂亮,但我不知道你的答案到底是什么。也许您可以编辑并在顶部添加一个答案,您可以清楚地看到您在说什么。未来用户在搜索找到此问题和您的答案时会在此处找到“跳转到 CHM 中的锚点”的确切答案是什么? 看那部分:Conclusion Yes, it is possible with a HtmlHelp() command to jump to an anchor. 所有 cmets 都说(在 OP 的问题中),您不能使用 Delphi 命令跳转到锚点。 &lt;a name="my_anchor_id"&gt;&lt;/a&gt;@David 说:Yes it would be nice if you could. But you can't. You need A links. And topic IDs or topic names. 我的意思是,您必须先浏览其他所有内容,尝试找到结论的部分。如果有人在未来的搜索中发现它,他们可能不会在放弃并转向不同的结果之前花费足够的时间。 结论应该在顶部,然后您可以添加您如何达到它的详细信息(这几乎是一本书)。如果您必须花 10 分钟阅读答案才能找出答案,那可能不值得一看 - 把结论放在首位,这样答案就很清楚了。 我刚刚检查过,从你的答案的顶部开始,我必须点击 三次才能看到 结论,这表示答案不明确。要从那里到达答案的结尾,还需要 另外六次 击键。 @moskito-x 非常感谢!!!您的示例演示的下载链接解决了我的问题!这是一个完美的演示和完美的解决方案!!!再次感谢!

以上是关于Delphi XE2:跳到 CHM 中的锚点?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 中的锚点

替换文本中的锚点/链接

HTML中的锚点以及锚点的设置与应用

如何判断页面是不是已跳转到 javascript 中的锚点 (#)?

我想要做一个锚点定位,从A页面跳到B页面的某个位置。

去掉浏览器中的锚点#号