如何让Delphi中上下文敏感的He lp使用符号名而不是HelpID别名?

如何让Delphi中上下文敏感的He lp使用符号名而不是HelpID别名?,delphi,context-sensitive-help,helpcontext,Delphi,Context Sensitive Help,Helpcontext,我正在将我的帮助系统构建到我的程序中,并且我正在处理上下文相关的帮助,当按下F1时,它应该为活动控件显示相应的帮助页面 在每个控件上,我可以将HelpType设置为htContext,将HelpContext设置为HelpID,或者将HelpType设置为htKeyword,将HelpContext设置为HelpID别名 但在我的帮助系统(Dr.Explain)中,我设置了符号名称(即,在我的帮助系统中用作书签的一些文本)。这与HelpID及其别名不同,可以通过调用Application.Hel

我正在将我的帮助系统构建到我的程序中,并且我正在处理上下文相关的帮助,当按下F1时,它应该为活动控件显示相应的帮助页面

在每个控件上,我可以将HelpType设置为htContext,将HelpContext设置为HelpID,或者将HelpType设置为htKeyword,将HelpContext设置为HelpID别名

但在我的帮助系统(Dr.Explain)中,我设置了符号名称(即,在我的帮助系统中用作书签的一些文本)。这与HelpID及其别名不同,可以通过调用Application.HelpJump(SymbolicName)从帮助系统访问

我想使用HelpContext字段作为我的符号名,这比创建一组重复的HelpID别名要简单得多,也更容易维护。我不必担心创建帮助映射文件或处理它

当HelpType为htKeyword时,表格单元中的HelpKeyword例程处理F1:

function TApplication.HelpKeyword(const Keyword: string): Boolean;
var
  CallHelp: Boolean;
begin
{$IF DEFINED(CLR)}
  Result := DoOnHelp(HELP_COMMAND, TObject(Keyword), CallHelp);
{$ELSE}
  Result := DoOnHelp(HELP_COMMAND, Integer(PChar(Keyword)), CallHelp);
{$IFEND}
  if CallHelp then
  begin
    if ValidateHelpSystem then
    begin
      { We have to asume ShowHelp worked }
      Result := True;
      HelpSystem.ShowHelp(Keyword, GetCurrentHelpFile);
    end
    else
      Result := False;
  end;
end;
要使其能够处理我的符号名称,我真正需要做的就是将例程替换为:

function TApplication.HelpKeyword(const Keyword: string): Boolean;
begin
  Application.HelpJump(Keyword);
  Result := true;
end;
我似乎不能做的是找出如何编写正确的代码,以干净的方式自定义此例程的功能,而不必攻击表单单元本身。我该怎么做

或者,是否有其他方法可以轻松获取上下文相关帮助,以基于符号名访问“我的帮助”页面

作为参考,我正在使用Delphi2009(但将在下个月左右升级到XE2)


p、 标题中的单词是“He lp”,因为stackoverflow不允许我在标题中添加“Help”一词。

在您的
OnHelp
事件处理程序中尝试此操作(您的表单或全局应用程序,具体取决于您使用的内容):


嗯,使用帮助系统是个好主意。Data实际上是string对象的地址,所以我不得不将PChar(Data)更改为string(PObject(Data))。不幸的是,ShowTopicHelp不适合我。在HelpIntfs单元中,它说“ShowContextHelp()和ShowTopicHelp()仅受扩展帮助查看器支持。”在我的例子中,它只会显示我的帮助文件的索引页。请稍候。我的错误。我让它工作了。不知何故,我设置了一些旧代码CallHelp:=true;但当我把它改为false时,现在它显示了正确的页面。你的pchar也能适应这种变化。现在这个效果很好。谢谢你的帮助!
function TForm1.FormHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean;
begin
  if Command = HELP_COMMAND then
  begin
    // avoid default processing
    CallHelp := False;
    // do your own processing - in this case, do what Application.HelpJump would do
    Application.HelpSystem.ShowTopicHelp(PChar(Data), Application.CurrentHelpFile);
    // assume it worked
    Result := True;
  end;
end;