2

ヘルプ システムをプログラムに組み込んでおり、F1 が押されたときにアクティブなコントロールの適切なヘルプ ページを表示するコンテキスト センシティブ ヘルプに取り組んでいます。

各コントロールで、HelpType を htContext に、HelpContext を HelpID に設定するか、HelpType を htKeyword に、HelpContext を HelpID Alias に設定できます。

しかし、私のヘルプ システム (Dr. Explain) では、記号名 (つまり、ヘルプ システムでブックマークとして使用されるテキスト) を設定しました。これは HelpID とそのエイリアスとは異なり、次の呼び出しでヘルプ システムからアクセスできます: Application.HelpJump(SymbolicName)。

HelpID エイリアスの複製セットを作成するよりもはるかに単純で維持しやすい記号名に HelpContext フィールドを使用したいと考えています。また、ヘルプ マップ ファイルの作成について心配する必要も、それに対処する必要もありません。

HelpType が htKeyword の場合に F1 を処理するのは、Forms ユニットの HelpKeyword ルーチンです。

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 ではタイトルに「ヘルプ」という単語を入れることができないためです。

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 に答える