Die kontextsensitive Hilfe verwenden


Für unsere kontextsensitive Hilfe benötigen wir zunächst eine neue Prozedur:

// Copyright www.delphi-jedi.org
procedure ShowHelp(Pt: TPoint; ContextId: Integer);
const
  rect : TRect = (Left:-1;Top:-1;Right:-1;Bottom:-1);
var
  Popup : THHPopup;
  URL   : string;
begin
  URL := szHelpFile + '::/popup.txt';
if (ContextId > 0) then begin FillChar(Popup, SizeOf(Popup), 0); Popup.cbStruct := SizeOf(Popup); Popup.hinst := 0; Popup.idString := ContextId; Popup.pszText := nil; Popup.pt := Pt; Popup.clrForeGround := TColorRef(-1); Popup.clrBackground := TColorRef(-1); Popup.rcMargins := rect; Popup.pszFont := '';
HtmlHelp(0,@URL[1],HH_DISPLAY_TEXT_POPUP,dword(@Popup)); end; end;

Hier sehen Sie auch, wie die Datei mit den Popup-Texten benutzt werden muss. Durch die Übergabe der Kontext-ID in

      Popup.idString := ContextId;
      Popup.pszText := nil;

wird das entsprechende Topic aus der Textdatei geladen und entsprechend angezeigt. Wenn sich die Texte für die kontextsensitive Hilfe innerhalb Ihres Programms befinden, müssen Sie ein wenig anders vorgehen. Nehmen wir als Beispiel an, dies wären die notwendigen Informationen:

const
  ContextInfo : array[1000..1002]of string =
    ('Dies ist mal nur ein Popup-Text.',
     '', // Dummy
     'Ein Editfeld, man höre und staune ...');

Dann benutzen Sie stattdessen diesen Code:

      Popup.idString := 0;
      Popup.pszText := pchar(ContextInfo[ContextId]);

In dem Fall ist die Angabe der Textdatei auch nicht erforderlich, und Sie brauchen lediglich den Namen der CHM-Hilfedatei angeben. Das Beispielprogramm verdeutlicht das Prinzip mit Hilfe eines Compilerschalters. Wenn Sie das Programm normal starten und nutzen, kommen die Popup-Texte aus der Hilfedatei, wenn Sie stattdessen den Schalter CONTEXTINSIDE benutzen, kommen die Texte aus dem o.g. String-Array innerhalb des Programms.


Damit unser Hilfe-Button in der Titelleiste und die F1-Taste ihre Daseinsberechtigung behalten, ändern wir den Code unseres HLP-Beispielprogramms beim Abfangen der Nachricht "WM_HELP" und übergeben Position des Mauszeigers und Kontext-ID an die neue Funktion:

WM_HELP:
  if(PHelpInfo(lp)^.iContextType = HELPINFO_WINDOW) then
  begin
    if(PHelpInfo(lp)^.dwContextId > 0) then
      ShowHelp(PHelpInfo(lp)^.MousePos,PHelpInfo(lp)^.dwContextId)
  end else
    Result := DefWindowProc(wnd,uMsg,wp,lp);

Lediglich unser Popupmenü muss noch ein wenig ergänzt werden. Da wir uns diesmal selbst um die Anzeige der Kontext-Informationen kümmern, müssen wir auch dafür sorgen, dass sie an der richtigen Stelle erscheinen. Dazu erweitern wir lediglich die Klickfunktion unseres Menüeintrages und holen uns die Position des Mauszeigers:

WM_COMMAND:
  case HIWORD(wp) of
    BN_CLICKED:
      case LOWORD(wp) of
        IDC_DIRECTHELP:
          if(cId > 0) then
            begin
              GetCursorPos(p); ShowHelp(p,cId);
            end;
      end;
  end;

Den Rest des Programms können wir unverändert lassen.