Delphi-PRAXiS
Seite 2 von 13     12 3412     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   [IDE-Experte (2006,07,09,10,XE,XE2)] CustomHelp (https://www.delphipraxis.net/140957-%5Bide-experte-2006-07-09-10-xe-xe2-%5D-customhelp.html)

MarcoWarm 1. Okt 2009 10:39

Re: [IDE-Experte] CustomHelp
 
Hi Andre...

danke daß Sie sich für dieses Produkt entschieden haben ;-)

vielen Dank für die Anregungen.

Zu
Punkt1 ... Über die Reihenfolge hab ich auch lange nachgedacht... wie man's macht ist es irgendwie falsch
Punkt2 ... Da hast du vollkommen recht kommt noch rein.
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

Vorschlag zu der Sortierung... man könnte die Resultate auch in einer CategoryButton-Komponente anzeigen (wie die Komponentenpalette) mit ein wenig owner draw

Gruß
Marco

a-s-z-work 1. Okt 2009 12:36

Re: [IDE-Experte] CustomHelp
 
Hi,

Zitat:

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 :tongue: 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:

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.

MarcoWarm 1. Okt 2009 12:53

Re: [IDE-Experte] CustomHelp
 
Hmmmmmm.... mit langem (m)

Das mit dem "erroneous type" ist typisch RAD Studio 2009+. In der BDS2006 klappt das Prima. Da bekomm ich auch keinen Namespace des Objektes.
Wenn du das mit dem selektierten Text hinbekommst wäre ich natürlich dankbar :-D.

Ich werde das mit dem Punkt im Helptext mal berücksichtigen.

MarcoWarm 1. Okt 2009 13:34

Re: [IDE-Experte] CustomHelp
 
Neue Version... neues Glück


edit: Kleiner Tipp, die Auswahlbox merkt sich die geschlossenen Rubriken, sodaß weniger häufig benutzte "Handbücher" zugeschlagen bleiben :-)
edit2: der Fehler mit dem "erroneous type" wird wirklich von Delphi verursacht. Sobald das Keyword innherhalb einer Methode oder Funktion abgefragt wird kommt auf jedes unbekannte Schlüsselwort dieses Keyword zurück. außerhalb von begin...end klappt es jedoch (obwohl es da genauso unbekannt sein dürfte.)

MarcoWarm 2. Okt 2009 08:21

Re: [IDE-Experte] CustomHelp
 
Und noch eine Release vorm Wochenende
  • optionale Volltextsuche, die ist wahrscheinlich nicht besonders hilfreich, weil da seeeeehr viele Ergebnisse zurückkommen. Aber probierts ruhig aus.
  • Anzeige des gesuchten Begriffes im Hilfefenster.

DP-Maintenance 3. Okt 2009 08:29

DP-Maintenance
 
Dieses Thema wurde von "mkinzler" von "Tools rund um Delphi" nach "Open-Source" verschoben.
Liegt im Source vor

xZise 3. Okt 2009 22:26

Re: [IDE-Experte] CustomHelp
 
Zitat:

Zitat von a-s-z-work
  • function THelpSelector.SelectKeyword:
    in der ersten Zeile sollte nicht idx, sondern Result initialisiert werden. Sonst gibt es einen Fehler wenn man die Auswahl abbricht.
    Delphi-Quellcode:
    function THelpSelector.SelectKeyword(Keywords: TStrings): Integer;
    var
      idx : integer;
      u : String;
    begin
      Result:=-1;
      if TFormHelpSelector.Execute(Keywords, idx, u) then
        Result:=idx;
    end;

Also ich würde da auf idx komplett verzichten und statt idx Result übergeben.
Wobei ich nicht weiß, ob idx bzw. Result -1 ist, wenn Execute false zurückgibt. Ansonsten (failsave):
Delphi-Quellcode:
function THelpSelector.SelectKeyword(Keywords: TStrings): Integer;
var
  u : String;
begin
  if not TFormHelpSelector.Execute(Keywords, Result, u) then
    Result := -1;
end;
Ansonsten sieht das gut aus, und eventuell teste ich das noch heute/morgen.

MfG
xZise

a-s-z-work 5. Okt 2009 08:27

Re: [IDE-Experte] CustomHelp
 
Hi Marco,

Zitat:

Zitat von MarcoWarm
edit2: der Fehler mit dem "erroneous type" wird wirklich von Delphi verursacht. Sobald das Keyword innherhalb einer Methode oder Funktion abgefragt wird kommt auf jedes unbekannte Schlüsselwort dieses Keyword zurück. außerhalb von begin...end klappt es jedoch (obwohl es da genauso unbekannt sein dürfte.)

Ich habe eine Lösung für das Problem gefunden. Man muss genau diesen Begriff ignorieren, dann fragt die Hilfe anschließend den selektierten Text ab ...

Delphi-Quellcode:
function TMyViewer.UnderstandsKeyword(const HelpString: String): Integer;
var
  hs : IHelpSystem;
begin
  //Das Hilfesystem fragt uns: Verstehst du dieses Keyword (der Begriff unter dem Cursor)?

  if HelpString = 'erroneous type' then
  begin
    Result := 0;
    Exit;
  end;

  Result := 1; //ja!

  if GetHelpSystem(hs) then
  begin
    //Noch schnell dem Hilfesystem sagen, das wir einen eigenen Auswahldialog für die
    //verschiedenen Hilfethemen haben
    hs.AssignHelpSelector(THelpSelector.Create(HelpString));
  end;
end;

MarcoWarm 5. Okt 2009 08:32

Re: [IDE-Experte] CustomHelp
 
Hi Andre,

vieeeelen Dank. Jetzt klappt's super. Die Änderung ist auch schon im Repository.

So macht 'ne Community echt Spaß

schönen Tag noch

Gruß Marco

a-s-z-work 5. Okt 2009 12:51

Re: [IDE-Experte] CustomHelp
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Marco,

anbei habe ich mal meine Änderungen als Patch (Stand R337) zusammengefasst.
  • Projekteigenschaften für Debugging / StackTrace in der IDE angepasst
  • Neue Option: Nur den ersten "Namespace" abschneiden. ansonsten werden nach und nach alle Teile abgeschnitten und gesucht (solange keine Treffer gefunden wurden).
  • Fehlerbehandlung in der Suche: Aufgetretene Fehler werden im Auswahldialog angezeigt (Momentan gibt es einen Memory Leak, wenn eine Exception in GetHelpStrings auftritt).
  • Standardeinträge (Search engines) werden unten in der Ergebnisliste angezeigt.
  • Der erste gefundene Eintrag wird automatisch selektiert.
  • Anzeige des evtl. verkürzten Suchbegriffes

Vielleicht ist ja das ein oder andere für dich dabei.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 Uhr.
Seite 2 von 13     12 3412     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz