2

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

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

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

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

当 HelpType 为 htKeyword 时,HelpKeyword 例程在 Forms 单元中处理 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;

我似乎无法做的是弄清楚如何编写正确的代码以干净的方式自定义此例程的功能,而不必破解 Forms 单元本身。我怎样才能做到这一点?

或者,是否有另一种方法可以根据符号名称轻松获取上下文相关帮助以访问我的帮助页面?

作为参考,我使用的是 Delphi 2009(但将在下个月左右升级到 XE2)。

ps 标题中的单词是“He-lp”,因为stackoverflow 不允许我在标题中添加“Help”这个词。

4

1 回答 1

4

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

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;
于 2011-10-03T02:19:20.250 回答