Как получить контекстно-зависимый He-lp в Delphi для использования символических имен вместо псевдонимов HelpID? - PullRequest
2 голосов
/ 02 октября 2011

Я встраиваю свою справочную систему в свою программу и работаю над контекстно-зависимой справкой, которая должна вызывать соответствующую страницу справки для активного элемента управления при нажатии клавиши F1.

На каждом элементе управления я могу установить HelpType в htContext и HelpContext в HelpID, или я могу установить HelpType в htKeyword и HelpContext в псевдоним HelpID.

Но в моей справочной системе (Dr. Explain) я установил символические имена (то есть некоторый текст, который используется в качестве закладки в моей справочной системе). Он отличается от HelpID и его псевдонима и доступен из справочной системы с помощью вызова: Application.HelpJump (SymbolicName).

Я хотел бы использовать поле HelpContext для моих символических имен, которое намного проще и проще в обслуживании, чем создание дублированного набора псевдонимов HelpID. И мне не нужно будет беспокоиться о создании файла справки или о том, как с ним работать.

Это подпрограмма HelpKeyword в модуле Forms, которая обрабатывает F1, когда HelpType имеет значение htKeyword:

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).

p.s. Слово в заголовке - «He-lp», потому что stackoverflow не позволяет мне поместить слово «Help» в заголовок.

1 Ответ

4 голосов
/ 03 октября 2011

Попробуйте это в вашем 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;
...