Einzelnen Beitrag anzeigen

a-s-z-work

Registriert seit: 23. Feb 2009
8 Beiträge
 
RAD-Studio 2009 Ent
 
#12

Re: [IDE-Experte] CustomHelp

  Alt 1. Okt 2009, 13:36
Hi,

Zitat von MarcoWarm:
Punkt3 ... komisch !DefaultKeywordIndex sollte eigentlich in jeder Hilfe dabei sein. Noch hab ich nicht herausgefunden, wie ich die NavDataMoniker auslesen kann geschweige denn, wie ich herausfinde welcher der Default ist ... *kopfschüttel* . Vielleicht hast du eine Idee. Es muss irgendwie gehen. Du kannst dir die verfügbaren Moniker mit diesem Tool anschauen
Ich hab mal nachgesehen, und der zeigt im Dropdown bei Index vier Einträge an, allerdings ist die Listbox immer leer
Dei DevExpress-Hilfe ist zusätzlich als Plugin in der Embarcadero-Hilfe integriert. In diesem Index tauchen auch viele Keywords auf, die allerdings anscheinend nicht zu dem passen, was als HelpString übergeben wird (z.B. cxEdit.TcxCustomEdit.EditValue)
Wird nur EditValue übergeben, findet er einige Einträge.

Ach übrigens: Zu TObject (wird aufgelöst zu System.TObject) findet er auch nix Aber das ist denke ich nicht der Fehler von CustomHelp ... zu TObject direkt wird was gefunden.
Na dann erweitere ich mal die Suche, so das zusätzlich der letzte Teil nach dem Punkt gesucht wird, wenn sonst keine Namespace-Treffer vorhanden sind, oder so ... (Quelltext siehe unten)

Zitat von MarcoWarm:
Vorschlag zu der Sortierung... man könnte die Resultate auch in einer CategoryButton-Komponente anzeigen (wie die Komponentenpalette) mit ein wenig owner draw
Mir reicht die einfache Liste, es ging mir nur darum als Standard den Eintrag aus der lokalen Hilfe ausgewählt zu haben (wenn denn was gefunden wurde)
Hier mal der Code, mit dem ich die Auswahl momentan aufbaue:
Delphi-Quellcode:
function TMyViewer.GetHelpStrings(const HelpString: String): TStringList;
var
  idx: Integer;
  c, d, u : String;
  o, order : Integer;
  Index : IHxIndex;
  Topics : IHxTopicList;
  slot : integer;
  HelpStringPart: string;

  function EncodedHelpString: String;
  var
    i: integer;
  begin
    Result:='';
    for i := 1 to Length(HelpString)do
      Result:=Result + '%'+Format('%.2x', [Ord(HelpString[i])]);
  end;

  procedure CheckHelpString(const HelpString: string);
  var
    idy: Integer;
  begin
    slot := Index.GetSlotFromString(HelpString);
    if AnsiContainsText(Index.GetStringFromSlot(slot), HelpString) then
    begin
      Topics := Index.GetTopicsFromSlot(slot);
      for idy := 1 to Topics.Count do
      begin
        inc(order);
        Result.Add(TCustomHelp.EncodeURL(Topics.Item(idy).Title[HxTopicGetRLTitle, 0],
                                         Topics.Item(idy).Location,
                                         Topics.Item(idy).URL, order));
      end;
    end;
  end;
begin
  //Weil wir bei UnderstandsKeyword gesagt haben, das wir das Keyword verstehen (Result = 1)
  //werden wir jetzt gefragt, welche Hilfethemen wir zu diesem Keyword liefern können
  //Die StringList wird vom Hilfesystem wieder freigegeben

  Result := TStringList.Create;
  HelpStringPart := HelpString;
  repeat
    idx := Pos('.', HelpStringPart);
    Delete(HelpStringPart, 1, idx);
  until idx < 1;

  order := 0;

  //Und jetzt noch die eigentlichen Hilfe-Namespaces durchsuchen
  for idx := 0 to GlobalCustomHelp.EnabledIndices.Count-1 do
  begin
    if supports(GlobalCustomHelp.EnabledIndices[idx], IHxIndex, Index) then
    begin
      CheckHelpString(HelpString);
    end;
  end;

  if order = 0 then
    for idx := 0 to GlobalCustomHelp.EnabledIndices.Count-1 do
    begin
      if supports(GlobalCustomHelp.EnabledIndices[idx], IHxIndex, Index) then
      begin
        CheckHelpString(HelpStringPart);
      end;
    end;

  for idx := 0 to GlobalCustomHelp.ProviderList.Count - 1 do
  begin
    TCustomHelp.DecodeURL(GlobalCustomHelp.ProviderList.Strings[idx], c, d, u, o);

    if Pos('://', u)>0 then
    begin
      inc(order);
      Result.Add(TCustomHelp.EncodeURL(c,d,u+EncodedHelpString, order))
    end
    else
    if AnsiSameText(ExtractFileExt(u),'.hlp') then
    begin
      inc(order);
      Result.Add(TCustomHelp.EncodeURL(c,d,'winhlp://-k '+HelpString+' '+u, order));
    end
    else
    if AnsiSameText(ExtractFileExt(u),'.chm') then
    begin
      inc(order);
      Result.Add(TCustomHelp.EncodeURL(c,d,'htmlhlp://'+HelpString+URL_SPLITTER+u, order));
    end;
  end;

end;
Am Ende von TMyViewer.ShowHelp habe ich noch folgendes angepasst, damit man keine Endlosschleife bekommt wenn man die Auswahl abbricht:
Delphi-Quellcode:
  else if HelpString <> 'then
    ShowHelp(ForceSelector(HelpString));
Außerdem habe ich mir den Selector angepasst, das der HelpString in der Caption angezeigt wird. Da wundert man sich doch, was man so als Suchbegriff übergeben bekommt.
Probleme hab ich im Moment z.B. noch, wenn ich eine fehlerhafte Anweisung abfrage. Da bekomme ich als HelpString "erroneous type" übergeben!? Besser wäre natürlich der selektierte Text

Teilweise bekomme ich noch Fehler in PasHelp.TestKeyword. Das scheint mit dem Kibitz-Feature zusammenzuhängen, und tritt nur auf, wenn die CustomHelp.bpl neu geladen wird. Ist also nicht so wichtig.

PS: In der Projektdatei fehlt noch die Unit uMSHelpServices.pas.
Andre
CU,
Andre
  Mit Zitat antworten Zitat