AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte [IDE-Experte (2006,07,09,10,XE,XE2)] CustomHelp

[IDE-Experte (2006,07,09,10,XE,XE2)] CustomHelp

Ein Thema von chaosben · begonnen am 29. Sep 2009 · letzter Beitrag vom 8. Jan 2014
Antwort Antwort
Seite 2 von 13     12 3412     Letzte » 
Benutzerbild von chaosben
chaosben
Registriert seit: 27. Apr 2005
CustomHelp (2.irgendwas )

... ist ein IDE Experte, der die Delphi Hilfe um ein paar nützliche Funktionen erweitert.

Was soll das?
Du "stehst" in deinem Quellcode und brauchst Hilfe zu einer bestimmten Funktion. Du drückst F1 und bekommst deine vertraute Delphi Hilfe. Jetzt hättest du natürlich auch gern ein Beispiel zu deren Anwendung oder du fragst dich, ob jemand in der DP schonmal das gleiche Problem damit hatte mit dem du dich gerade herumschlägst. Oder du sehnst dich nach der "alten" Delphi 7 Hilfe. Also musst du die vertraute schützende Umgebung deiner IDE (ja das ist doppelt gemoppelt) verlassen und dich durch die verschiedenen Suchmaschinen und Hilfedateien hangeln.
Hier hilft CustomHelp. Der Assistent fasst deine Suchanfrage in einem niedlichen kleinen Fenster zusammen, von dem aus du in deinen Lieblingssuchmaschinen und Hilfedateien blättern kannst.

Die Features im Überblick ... oder warum sollte ich weiterlesen? (Für alle die lieber Video gucken anstatt zu lesen ... siehe unten. )
  • Suche über F1 (keine ungewöhnlichen Tastenkombinationen)
  • Suche über alle im System registrierten Hx Namespaces (Microsoft Entwicklerhilfe Umgebung) (z.B. Jedi Hilfe)
  • Suche über die Html-Hilfe (*.chm) Dateien
  • Suche über die gute alte Hilfe (*.hlp-Dateien)
  • Suche per Shell-Kommando
  • Suche dynamisch via RSS-Feeds.
  • Einstellungen werden pro Delphi-Version gespeichert
  • Ab Version 1.3 Mit Windows Search die indizierten Dateien durchsuchen
  • Ab Version 2.0 Native Suche in der Google Codesearch
  • Ab Version 2.0 Erweiterbar durch eigene Provider und eigene GUI's (Fenster in dem die Hilfe angezeigt)
  • Ab Version 2.0 Erweiterte Formatierung (Schriftstile + Farbe)
  • Ab Version 2.1 Thread-Unterstützung zur Beschleunigung

Wie (de-)installiere ich CustomHelp?
Am einfachsten ist es über das SVN-Repository von TUO (Wer es ganz heiß mag und die neuesten Neuerungen und Bugs haben will, kann auch den Trunk nehmen). Vermittels eines SVN-Clients ist das überaus einfach. Andernfalls kann man sie die Dateien auch per Browser und Handarbeit runterladen - jeder eben wie er will.
Dann einfach das Package (auf passende Delphi-Version achten) laden und installieren. Fertig. Zum deinstallieren einfach das entsprechende Package aus der Liste der Entwurfs-Packages entfernen. Nach einer eventuellen Deinstallation ist ein Neustart der IDE erforderlich.
Vorher sollte man auf gleiche Weise TUOCommon installieren. (Hier auschecken und installieren)

Alles weitere über die Benutzung erfahrt ihr im Video (siehe unten)

Vorschläge für Hilfe-Provider (bitte die URLs aus den Links kopieren)
Known Issues
  • Unter D2006 darf man das Package nur einmal installieren. Beim zweiten Mal gibts jede Menge Fehler. Als Workaround startet man Delphi nach der Installation einfach neu.
  • CustomHelp bewahrt nicht davor, die Original-Hilfe zu installieren. Leider prüft Delphi bevor es irgendetwas tut, ob diese installiert.

FAQ
  • Gibts das auf deutsch?.... Nein. Das bissl englisch verträgt jeder Entwickler
  • Gibts das als fertige bpl?.... Nein. Der Aufwand fertige Packages aktuell zu halten ist uns zu groß.
  • Kann ich helfen?.... Ja. Wenn du noch Ideen und Anregungen hast?... Immer her damit.
  • Warum habt ihr so wenige Kommentare im Code?.... Diese Projekte sind primär für unseren eigenen Bedarf geschrieben. Wir stellen sie OpenSource zur Verfügung, weil wir selbst gern von OpenSource profitieren. Es ist kein Lehrprojekt . Wenn ihr jedoch Fragen zu dieser oder jener Funktion habt, könnt ihr Marco oder mich gern fragen.
  • Wie kann ich einen eigenen Provider schreiben? .... CustomHelp2 requiren, Ich2Provider implementieren und bei ch2Main registrieren.
  • Wie kann ich eine eigene GUI schreiben? .... CustomHelp2 requiren, Ich2GUI implementieren und bei ch2Main registrieren.

Danke an ...
  • RWarnecke fürs XE2-Projekt
  • HeikoAdams fürs Debuggen und Testen
  • allen anderen für das Feedback

Viel Spaß damit.
wünschen Marco und Benny

Videos
Version 2.0
Version 1.2
Version 1.0
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)

Projekte: TheUnknownOnes

Geändert von chaosben (26. Jul 2012 um 05:52 Uhr) Grund: Release 2.1
 
Benutzerbild von MarcoWarm
MarcoWarm

 
Delphi XE2 Professional
 
#11
  Alt 1. Okt 2009, 10:39
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
Marco Warm
  Mit Zitat antworten Zitat
a-s-z-work

 
RAD-Studio 2009 Ent
 
#12
  Alt 1. Okt 2009, 12: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
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

 
Delphi XE2 Professional
 
#13
  Alt 1. Okt 2009, 12:53
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 .

Ich werde das mit dem Punkt im Helptext mal berücksichtigen.
Marco Warm
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

 
Delphi XE2 Professional
 
#14
  Alt 1. Okt 2009, 13:34
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.)
Marco Warm
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

 
Delphi XE2 Professional
 
#15
  Alt 2. Okt 2009, 08:21
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.
Marco Warm
  Mit Zitat antworten Zitat
3. Okt 2009, 08:29
Dieses Thema wurde von "mkinzler" von "Tools rund um Delphi" nach "Open-Source" verschoben.
Liegt im Source vor
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#17
  Alt 3. Okt 2009, 22:26
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
Fabian
  Mit Zitat antworten Zitat
a-s-z-work

 
RAD-Studio 2009 Ent
 
#18
  Alt 5. Okt 2009, 08:27
Hi Marco,

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 typethen
  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;
Andre
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

 
Delphi XE2 Professional
 
#19
  Alt 5. Okt 2009, 08:32
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
Marco Warm
  Mit Zitat antworten Zitat
a-s-z-work

 
RAD-Studio 2009 Ent
 
#20
  Alt 5. Okt 2009, 12:51
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.
Angehängte Dateien
Dateityp: txt customhelp-rev337.patch_939.txt (31,8 KB, 13x aufgerufen)
Andre
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf