Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Delphi XE2上添加对HTML帮助文件(.chm)的支持?_Delphi_Delphi Xe2_Html Help - Fatal编程技术网

如何在Delphi XE2上添加对HTML帮助文件(.chm)的支持?

如何在Delphi XE2上添加对HTML帮助文件(.chm)的支持?,delphi,delphi-xe2,html-help,Delphi,Delphi Xe2,Html Help,如何在Delphi XE2上添加对HTML帮助文件(.chm)的支持?我们需要在每个控件的HelpContext属性上使用A-links(A-keywords)来查找帮助页面。Delphi XE2按单元HTMLHelpViewer对HTML帮助文件提供本机支持。但是如何使用它呢?我怀疑要使用A-links,您需要执行以下操作: 分配应用程序.OnHelp处理程序,如下所述 在程序启动期间分配Application.HelpFile 如果希望使用A链接调用帮助系统,请调用Application.H

如何在Delphi XE2上添加对HTML帮助文件(.chm)的支持?我们需要在每个控件的
HelpContext
属性上使用A-links(A-keywords)来查找帮助页面。Delphi XE2按单元
HTMLHelpViewer
对HTML帮助文件提供本机支持。但是如何使用它呢?

我怀疑要使用A-links,您需要执行以下操作:

  • 分配
    应用程序.OnHelp
    处理程序,如下所述
  • 在程序启动期间分配
    Application.HelpFile
  • 如果希望使用A链接调用帮助系统,请调用
    Application.HelpKeyword
  • 为您希望响应上下文相关F1按键的任何GUI控件设置
    HelpKeyword
    属性
  • OnHelp
    处理程序如下所示:

    function TMainForm.ApplicationHelp(Command: Word; 
      Data: THelpEventData; var CallHelp: Boolean): Boolean;
    var
      Link: THH_AKLink;
      ALink: string;
    begin
      CallHelp := False;
      Result := True;
      //argh, WinHelp commands
      case Command of
      HELP_COMMAND:
        begin
          ZeroMemory(@Link, SizeOf(Link));
          Link.cbStruct := SizeOf(Link);
          ALink := PChar(Data); // we are going to re-purpose the keyword as an A-link
          Link.pszKeywords := PChar(AnsiString(ALink)); // seems we have to pass a PAnsiChar ..
          Link.fIndexOnFail := True;
          HtmlHelp(GetDesktopWindow, Application.HelpFile, HH_ALINK_LOOKUP, 
            DWORD_PTR(@Link));
        end;
      end;
    end;
    
    HtmlHelpViewer
    单元包含名为
    LookupALink
    的方法,它们执行相同的操作。但我不知道他们怎么会被称为


    上述方法有点粗糙,因为它将关键字解释为a链接。如果您需要上下文相关的帮助,我看不出您还可以做些什么。

    不确定Xe2查看器是如何工作的(我在2007年),但我只使用了Microsoft HTML帮助API的Eric Granges端口,它被称为HTMLhelpAPI.pas,这并不奇怪

    您可以使用函数调用Alink


    ChmShowTopic(常量文件名,异位:字符串):HWND

    使用
    F1
    跳转到上下文并不难

    选择Edit1并按F1。将打开帮助并显示Overview.htm

    先决条件

    Edit1帮助设置:

    sample.chm源设置。

    阿里先生

    IDH_Overview=Overview.htm
    IDH_welcom=FirstTopic.htm
    IDH_UsingtheMenus=Overview.htm
    
    IDH_Overview=Overview.htm
    IDH_welcom=FirstTopic.htm
    IDH_UsingtheMenus=Overview.htm#UsingtheMenus
    
    样本h

    #define IDH_Creating_Projects_and_Topics 1005
    #define IDH_Overview 1003
    #define IDH_UsingtheMenus 1009
    
    单元1.pas

    unit Unit1;
    
    interface
    
    uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, HTMLHelpViewer, Vcl.ExtCtrls;
    
    type
      TForm1 = class(TForm)
        HHALINKLOOKUP: TButton;
        JumpAnchor: TButton;
        Edit1: TEdit;
        Label1: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure HHALINKLOOKUPClick(Sender: TObject);
        procedure JumpAnchorClick(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    var
    hpPath : string;
    link : HH_AKLINK;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      hpPath := ExtractFilePath(Application.ExeName) +
        'HelpFile\sample.chm';
      Application.HelpFile := hpPath;
    end;
    
    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(0, hpPath+'>main', HH_DISPLAY_TOPIC, DWORD_PTR(nil));
       HtmlHelpW(0, hpPath, HH_ALINK_LOOKUP, DWORD_PTR(@link));
    end;
    
    procedure TForm1.JumpAnchorClick(Sender: TObject);
    begin
      HtmlHelpW(0, hpPath+'::/Overview.htm#'+Edit1.Text+'>main', HH_DISPLAY_TOPIC, DWORD(nil));
    end;
    end.
    
    下面是一个现成的sample.chm和源代码

    有一个技巧,如何轻松地跳转,不仅跳转到.htm文件,而且直接跳转到锚点

    改变样品

    IDH_Overview=Overview.htm
    IDH_welcom=FirstTopic.htm
    IDH_UsingtheMenus=Overview.htm
    
    IDH_Overview=Overview.htm
    IDH_welcom=FirstTopic.htm
    IDH_UsingtheMenus=Overview.htm#UsingtheMenus
    
    在要跳转到的位置插入锚定,插入到Overview.htm

    [...]
    <A NAME="UsingtheMenus" </A>
    <P><STRONG>Using the Menus and Toolbars</STRONG>
    <P>The menus and toolbars provide a complete set of tools 
    [...]
    
    […]
    
    但是,
    Application.HelpKeyword
    通过关键字(帮助页面的标题)而不是a-link(帮助页面的特殊代码)显示帮助。是的。我没注意到这种细微差别。我修正了答案。我认为HtmlHelpViewer无法完成任务。您需要编写自己的
    OnHelp
    处理程序。我想。不管怎样,我总是这样做,因为
    HtmlHelpViewer
    太多了。谢谢!我现在就试试。但是,
    Application.HelpJump
    是否也使用A-link调用帮助?否。这将解析为
    HH\u DISPLAY\u主题
    。在你的问题中,你说你需要上下文相关的帮助,每个控件有不同的目的地。您只需使用
    HelpContext
    HelpKeyword
    属性即可。前者不好。这是一个整数。因此,您必须使用
    HelpKeyword
    。如何通过A-link字符串创建
    THelpEventData
    ?否,它使用的是非A-links的
    HH\u DISPLAY\u主题
    。更重要的是,HTML帮助API的端口在现代Delphi中是不必要的,因为Delphi提供的标题翻译已经具备了所有需要的功能。该代码可追溯到1998年!!谢谢,但是如果您使用
    HTMLHelpViewer
    单元,帮助将停止在Delphi IDE上工作指向现有的.chm文件??BPLs不知道.chm文件在哪里。要获取sample.chm,我的答案中有一个下载链接!!