Delphi-PRAXiS
Seite 1 von 4  1 23     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)

chaosben 29. Sep 2009 18:03


[IDE-Experte (2006,07,09,10,XE,XE2)] CustomHelp
 
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

Daniel 29. Sep 2009 18:13

Re: [IDE-Experte] CustomHelp
 
Zitat:

Zitat von chaosben
Falls ihr noch Vorschläge habt (z.B. wie man eine URL auf der WelcomePage öffnet) ... immer her damit. :)

Das habe ich doch irgendwo schon mal gemacht ...:gruebel: ... ... ;-)

Zuerst prüfen, ob die WelcomePage nicht deaktiviert ist:

Delphi-Quellcode:
function TDPxHBConfig.WPIsEnabled : boolean;
begin
  result:= (GetModuleHandle( 'startpageide100.bpl' ) > 0)  // Delphi 2007
           OR
           (GetModuleHandle( 'startpageide120.bpl' ) > 0)  // Delphi 2009
           OR
           (GetModuleHandle( 'startpageide140.bpl' ) > 0); // Delphi 2010
end;
Dann braucht's zwei Interfaces, die per Standard offenbar nicht dabei sind/waren. Ich habe sie - glaube ich - in einem der Blogs eines Borland/CodeGear/Embarcadero-Mitarbeiter gefunden. Die Code-Kommentare habe ich mal drin gelassen, sie stamm,en nicht von mir.

Delphi-Quellcode:
  IURLModule = interface
  ['{9D215B02-6073-45DC-B007-1A2DBCE2D693}']
    procedure Close;
    function GetURL: string;                   // tested
    procedure SetURL(const AURL: string);      // tested
    procedure SourceActivated;
    function GetWindowClosingEvent: TWindowClosingEvent; // WARNING!!! DO NOT CALL!!!
    procedure Proc1;
    procedure Proc2;
    procedure Proc3;
    procedure Proc4;
    procedure Proc5;
    property URL: string read GetURL write SetURL;
  end;

  IDocModule = interface
['{60AE6F18-62AD-4E39-A999-29504CF2632A}']
    procedure AddToProject;
    function GetFileName: string;
    procedure GetIsModified;
    function GetModuleName: string;
    procedure Save;
    procedure Show; // doesn't seem to work properly...
    procedure ShowEditor(Visible: Boolean; const Filename: string);
    procedure GetProjectCount;
    procedure GetProject;
    procedure GetActiveProject;
    property Filename: string read GetFilename;
    property ModuleName: string read GetModuleName;
  end;
Und nun geht's auch schon los:

Delphi-Quellcode:
function TDPxHBIDEWizard.GoURL(const URL: string) : boolean;
var
  ModuleServices: IOTAModuleServices;
  Module: IOTAModule;
  I: Integer;
  mIdx : integer;
  URLModule: IURLModule;
  DocModule: IDocModule;
begin

  if NOT WPVisible then
    ShowWP;

  result:= FALSE;
 
  mIdx:= -1;
  ModuleServices := BorlandIDEServices as IOTAModuleServices;
  for I := 0 to ModuleServices.ModuleCount-1 do
  begin
    Module:= ModuleServices.Modules[I];
    if Supports(Module, IURLModule, URLModule) then
    begin
      if Supports(Module, IDocModule, DocModule) then
      begin
        URLModule.URL:= URL;
        result:= TRUE;
        mIdx:= i;
        BREAK;
      end;
    end;
  end;

  if (mIdx > -1) AND (mIdx < ModuleServices.ModuleCount) then
    ModuleServices.Modules[mIdx].Show;
end;
Falls die WelcomePage zwar geladen, aber gerade geschlossen ist, kann man sie mit folgendem Code anzeigen:

Delphi-Quellcode:
procedure TDPxHBIDEWizard.ShowWP;
var IDEService : INTAServices;
       actList : TCustomActionList;
           idx : integer;
           act : TContainedAction;
begin
  IDEService:= (BorlandIDEServices AS INTAServices);
  actList:= IDEService.ActionList;

  for idx:= 0 to actList.ActionCount-1 do
  begin
    act:= actList.Actions[idx];

    if act.Name = 'ViewWelcomePageCommand' then
      act.Execute;
  end;
end;

Ich hoffe, das hilft ein wenig. :-)

MarcoWarm 29. Sep 2009 18:17

Re: [IDE-Experte] CustomHelp
 
Hallo und vielen Dank,

eigentlich wussten wir ja, daß Du weißt wie es geht ... aber wir haben aus Ehrfurcht nicht gefragt ;-)

Mal sehen ob wir Morgen zum einbauen kommen.

gut's Nächtle.

Daniel 29. Sep 2009 18:19

Re: [IDE-Experte] CustomHelp
 
Zitat:

Zitat von MarcoWarm
... aber wir haben aus Ehrfurcht nicht gefragt ;-)

Ach Unsinn - sonst schubsen mich doch auch alle rum hier im Forum ... tut auch schon fast nicht mehr weh ... fragt mal meine Mods. :mrgreen:

MarcoWarm 30. Sep 2009 07:50

Re: [IDE-Experte] CustomHelp
 
Und da sind wir wieder.

Neue Features:

- Unterstützung der alten Win32 Hilfe (z.B. Delphi 7 Hilfe (wer die so mochte) und verschiedene Hilfen von Komponentenanbietern)
- Anzeige des Suchresultats auf der Welcomepage (na endlich hat die mal nen Sinn ;-) )

Eine Beispiel-Konfiguration sieht so aus:
http://i467.photobucket.com/albums/r...s/dp/neu-3.jpg

Sherlock 30. Sep 2009 08:48

Re: [IDE-Experte] CustomHelp
 
Zwei Dinge:
1. Ladet das Projekt hier hoch.
und b) gibts das auch auf Deutsch?

Edith hat noch ein III: Ich finde es ziemlich schade, daß Ihr gleich mal Null Kommentare da drin habt. Da kann man eigentlich nicht wirklich von lernen.

Zum Projekt an sich aber :thumb:

Sherlock

chaosben 30. Sep 2009 09:22

Re: [IDE-Experte] CustomHelp
 
Danke für das Lob. :)

Was die anderen Punkte angeht:
Wir wollen es nicht an 2 Stellen pflegen (funktioniert aus Erfahrung nicht) ... deshalb gibts hier nur den Link auf das Original.
Deutsch? Och nö ... wir sind doch alle Entwickler und das bißchen Englisch verträgt man noch.

Und die Kommentare ... Das Tool ist gestern innerhalb eines halben Tages neben der Jahresinventur unseres Brötchengebers her entstanden. Das war so ein Hin-und-Herspringen zwischen dem Telefon, IBExpert und Delphi. Daher sieht der Code auch weniger schön aus. Aber ich werd mal sehen, ob da noch ein paar Kommentare reinkommen. :)

chaosben 30. Sep 2009 14:41

Re: [IDE-Experte] CustomHelp
 
So, es hat sich wieder einiges getan:
  • Im ersten Post gibts ein kleines Demo-Video
  • Die Einstellungen werden pro Delphi-Version gespeichert
  • Der Zugriff auf die Standard-Hilfen erfolgt native (und damit schneller)
  • Man kann jede andere HX-Hilfe (z.B. vom VisualStudio, andere Delphi-Version) nutzen
  • Ein paar Bugfixes

MarcoWarm 1. Okt 2009 09:08

Re: [IDE-Experte] CustomHelp
 
Das Resultat unserer morgentlichen Bemühungen
  • Bugfix. Unter RAD Studio 2009+ wurde keine Hilfe angezeigt, wenn die Standard Delphi-Hilfe keine Resultate brachte (z.B. Boolean)
  • Unterstützung des Windows HTMLHelp Formates (*.chm) Jetzt kann man auch die VirtualTreeview-Hilfe einbauen (ACHTUNG: die chm-Hilfe muss einen Index haben, sonst geht es nicht)

a-s-z-work 1. Okt 2009 10:22

Re: [IDE-Experte] CustomHelp
 
Hallo,

dieses Plugin ist ja super! :thumb: Wenn so etwas doch mal als Standard dabei wäre ;)

Ich bin gerade dabei alle Hilfen einzubinden und dabei sind mir ein paar Sachen/Probleme aufgefallen:
  • Ich habe die Reihenfolge der Einträge umgedreht. Namespace-Treffer sind jetzt zuerst aufgelistet. Könnte man ja vielleicht als Konfigurationsoption hinzufügen.
  • 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;
  • procedure TCustomHelp.LoadEnabledNamespacesFromRegistry
    Ich habe Probleme mit manchen Namespaces (devExpress-Komponenten). Der Aufruf der Funktion GetNavigationObject löst eine Exception aus (Das Navigationsobject [!DefaultKeywordIndex] konnte nicht abgerufen werden), was dazu führt das das Package nicht mehr geladen werden kann. Deshalb habe ich den Code wie folgt erweitert:
    Delphi-Quellcode:
    procedure TCustomHelp.LoadEnabledNamespacesFromRegistry;
    var
      sl : TStringList;
      idx : integer;    
      hxSession: IHxSession;
      hxIndex: IHxIndex;
      NavObject: IDispatch;
    begin
      FEnabledIndices.Clear;
      sl:=TStringList.Create;
      try
        ReadEnabledNamespacesFromRegistry(sl);

        for idx := 1 to Namespaces.Count do
        begin
          if sl.IndexOf(Namespaces.Item(idx).Name)>=0 then
          begin
            hxSession:=CoHxSession.Create;
            hxSession.Initialize('ms-help://'+Namespaces.Item(idx).Name,0);
            try
              NavObject := hxSession.GetNavigationObject('!DefaultKeywordIndex','');
              if Assigned(NavObject) and Supports(NavObject,
                          IID_IHxIndex,
                          hxIndex) then
              begin
                FEnabledIndices.Add(hxIndex);
              end;
            except on e: exception do
              begin
                ShowMessage('Error when checking namespace ' + Namespaces.Item(idx).Name + '! Disabling namespace.'#13#10+ e.Message);
                Self.WriteNamespacesToRegistry(Namespaces.Item(idx).Name, false);
              end;
            end;
          end;
        end;
      finally
        sl.Free;
      end;
    end;
    Kann mir da einer bei den DevExpress-Hilfedateien Tipps geben? In der "normalen" Hilfe funktioniert der Index natürlich :gruebel:

--
CU,
Andre

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.

MarcoWarm 5. Okt 2009 13:36

Re: [IDE-Experte] CustomHelp
 
Danke... ich schau es mal durch :-)

a-s-z-work 6. Okt 2009 17:18

Re: [IDE-Experte] CustomHelp
 
Hi,

weisst du zufällig, wie ich aus einer ms-help url die Topic-Infos heraus bekomme?

Das Standard-Hilfe-System liefert noch weitere Treffer, die man auch noch anzeigen könnte.

Es gibt ja das Interface IHxTopic das alles nötige liefert, aber wie komme ich an eine Instanz mittels ms-help://embarcadero.rs2009/...?

MarcoWarm 7. Okt 2009 07:49

Re: [IDE-Experte] CustomHelp
 
Hi,

es gibt die Möglichkeit eine Volltextsuche im IHxSession durchführen
Delphi-Quellcode:
IHxSession.Query
entweder im kompletten Artikeltext mittels des NavDataMonikers
Delphi-Quellcode:
'!DefaultFullTextSearch'
oder nur in den Keywords mittels
Delphi-Quellcode:
'!DefaultKeywordIndex'
. Ersteres ist bereits eingebaut... letzteres bringt manchmal weniger Resultate als das suchen über den Slot.

MarcoWarm 7. Okt 2009 10:38

Re: [IDE-Experte] CustomHelp
 
Neues Feature:

Da ab RADStudio 2007 die führenden Namespaces im Suchbegriff enthalten sind (z.B. Unitnamen und Klassennamen) gibt es jetzt die Möglichkeit diese vor der Suche abschneiden zu lassen. Entweder nur den ersten oder alle

a-s-z-work 7. Okt 2009 16:18

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

Zitat von MarcoWarm
es gibt die Möglichkeit eine Volltextsuche im IHxSession durchführen
Delphi-Quellcode:
IHxSession.Query
entweder im kompletten Artikeltext mittels des NavDataMonikers
Delphi-Quellcode:
'!DefaultFullTextSearch'
oder nur in den Keywords mittels
Delphi-Quellcode:
'!DefaultKeywordIndex'
. Ersteres ist bereits eingebaut... letzteres bringt manchmal weniger Resultate als das suchen über den Slot.

ich habe in der Zwischenzeit noch viel ausprobiert. Die Dokumentation zu den Schnittstellen des Hilfesystems ist ja leider sehr spärlich :(
Nach langem Rumprobieren und Studieren des Quellcodes der HelpIntf.pas habe ich viel hinbekommen:
  • Das Standard-Hilfesystem funktioniert nicht richtig, wenn ein anderer HelpSelector aktiv ist. Aufrufe an ms-help-URLs gehen ins leere, weil die Implementierung nicht die spezialisierte Methode IExtendedHelpViewer.DisplayTopic aufgerufen wird. Das wird durch CustomHelp behoben.
  • Das Durchreichen von Ergebnissen aus anderen Hilfe-Providern ist jetzt möglich. madExcept hat z.B. auch einen ICustomHelpViewer der die Hilfeseiten im IE aufruft.
  • Insbesondere können dadurch Fundstellen der MSHelp2 von anderen Providern durchgereicht werden. Das RAD Studio findet ja irgendwie doch mehr Ergebnisse, als die reine Schlüsselwortsuche :gruebel:
    Das größte Problem war dabei die Ermittlung des Titels und der Beschreibung eines Topics anhand der URL, damit das Ganze in der Suchübersicht auch vernünftig aussieht. Da gibt es leider keine direkte Funktion in den MSHelp2-Interfaces :cry: Durch intensives Debugging habe ich aber einen Weg gefunden 8) Man muss sich das Interface IHxHierarchy analog zu dem Index besorgen. Da kann man dann die Funktion GetSyncInfo verwenden, um an das Topic (IHxTopic) mit allen benötigten Informationen heranzukommen.
    Ohne vernünftige Dokumentation ist das ziemlich mühsam, das alles herauszufinden :twisted:


Anbei gibt es den Patch für die aktuelle Revision (R343). Ich würde mich freuen, wenn man das in CustomHelp übernehmen würde.

Nachfolgend die Änderungen/Erweiterungen im Einzelnen:
  • Vollständiges Durchreichen der anderen Hilfe-Provider (ICustomHelpViewer, z.B. madExcept, BDS Standardsuche)
  • Anzeige der Standard-Suchergebnisse des BDS.
  • Möglichkeit zum Ermitteln von Titel und Beschreibung von MSHelp2-URLs.
  • Möglichkeit zum Umleiten von beliebigen Protokollen (z.B. file://, http://) auf die Willkommens-Seite.
  • Verallgemeinerung der Pfade in der Projektdatei ($BDS), $(BDSCOMMONDIR)
  • Debuggen der IDE in der IDE durch Verwendung der Option -r, damit sich die IDE-Instanzen nicht in die Quere kommen.
  • Verlagerung einiger Funktion aus TMyViewer in TCustomHelp, teilw. Umwandlung in Klassenmethoden
  • Verbesserung des Verhaltens, wenn das Package wieder entladen wird (HelpSelector wird dann ungültig).
  • Neuer Standard-Suchprovider: MSDN Online
  • Verbessertes Fehlerverhalten bei "kaputten" Namespaces (Alle Fehler werden in der Übersicht angezeigt).
  • Layoutverbesserung in der Ergebnisanzeige: Nur 1/3 der Breite für die Beschreibung.
  • Usability: Der erste Eintrag in den Suchergebnissen wird automatisch selektiert.

MarcoWarm 8. Okt 2009 06:55

Re: [IDE-Experte] CustomHelp
 
Wow ... da hast du dir ja ne Menge Arbeit gemacht.

Leider hab ich im Moment keine Zeit mich um die Änderungen zu kümmern, da Custom Help eher ein Teilzeitprojekt ist.
Ich hab den letzten Patch ausprobiert und hab noch einige "issues" gefunden.
  • Unter BDS2006 kommt eine Schutzverletzung nach dem ersten Hilfeaufruf...da hilf nur noch IDE Neustart. Der Aufrufstack der IDE hilft nicht wirklich weiter. Es passiert bei ValidateHelpSystem (unter BDS2006) im RAD Studio 2009 ist alles ok.
  • Die Einstellung, ob man die CustomHelp Provider am Anfang oder am Ende sehen möchte sollte wahrscheinlich optional sein. Da hat jeder andere Vorstellungen.
  • In GetHelpStrings->PerformSearch durchsuchst du jeden Hilfenamespace erst mit dem vollen Text und falls in einem(!) etwas gefunden wurde brichst du ab und suchst nicht mit dem verkürzten weiter um evtl. in anderen Namespaces was zu finden. Die vorherige Implementation erschien mir logischer: Jeden Hilfenamespace für sich durchsuchen und prüfen, ob der volle HelpString gefunden wurde und danach gegebenenfalls verkürzen. Danach für den nächsten Hilfenamespace das gleiche machen. usw.
  • Die Redirect Schemes hab ich noch nicht ausprobiert
  • Die Unit uUtils.pas ist nicht BDS2006 konform. Dort einfach PWideChar und Widestring in PChar und Widestring umwandeln. Außerdem gab es noch kein TBytes :-(.
  • Layout und Usability Anpassungen finde ich sehr gelungen :-)

Danke, daß du so viel Mühe und Zeit in das Projekt reinsteckst. Da wir aber hier meistens mit BDS2006 arbeiten werde ich die Änderungen vorerst nicht einpflegen. Debuggen hat nich so viel gebracht, da der Fehler noch vor dem eigentlichen Aufruf unserer Klasse passiert:
Code:
 + $7[51F2A11F]{rtl100.bpl } System.System.@IntfAddRef (Line 17953, "system.pas" + 0) + $7
 + $0[51F26B4B]{rtl100.bpl } System.System.@HandleAnyException (Line 9980, "system.pas" + 13) + $0
 + $273[770A45C2]{ntdll.dll  } RtlpEnsureBufferSize + $273
 + $A[7707E49A]{ntdll.dll  } KiUserExceptionDispatcher + $A
 + $14[20B73F74]{coreide100.bpl} CompHelp.CompHelp.ValidateHelpSystem (Line 101, "CompHelp.pas" + 8) + $14
 + $E[20B940D6]{coreide100.bpl} EditorControl.EditorControl.TCustomEditControl.HelpKeyword (Line 4451, "EditorControl.pas" + 41) + $E
 + $0[20B99E84]{coreide100.bpl} EditorControl.EditorControl.TEditControl.CMControlCommand (Line 7255, "EditorControl.pas" + 2) + $0
 + $6[5205CA19]{vcl100.bpl } Controls.Controls.TWinControl.WndProc (Line 7246, "Controls.pas" + 105) + $6
 + $6[5205C1A4]{vcl100.bpl } Controls.Controls.TWinControl.MainWndProc (Line 7021, "Controls.pas" + 3) + $6
 + $0[51F60BC0]{rtl100.bpl } Classes.Classes.StdWndProc (Line 11572, "classes.pas" + 8) + $0
 + $24D[75288814]{USER32.dll } GetWindowLongW + $24D
 + $3C2[75288989]{USER32.dll } GetWindowLongW + $3C2
 + $7F[75289D0F]{USER32.dll } PostMessageW + $7F
 + $F2[75289D82]{USER32.dll } PostMessageW + $F2
 + $2B[7707E473]{ntdll.dll  } KiUserCallbackDispatcher + $2B
 + $47[7528F1B8]{USER32.dll } SendMessageA + $47
 + $10[20B84A6E]{coreide100.bpl} VClient.VClient.SendWindowMsg (Line 2673, "VClient.pas" + 2) + $10
 + $5[20B4A2BE]{coreide100.bpl} IDEKbd.IDEKbd.@interpret_bmi_macro$qqrp5BMI_tpcp11CmdMapTableppc (Line 39, "bmi.cpp" + 14) + $5
 + $16E[20B48ED2]{coreide100.bpl} IDEKbd.IDEKbd... (Line 586, "IDEKbd.pas" + 0) + $16E
 + $17[20B821A4]{coreide100.bpl} VClient.VClient.CmdStringProc (Line 504, "VClient.pas" + 5) + $17
 + $11[20C15B3C]{coreide100.bpl} KbClient.KbClient.TIDEKBDFrameAPI.MapAndEvalInternal (Line 832, "KbClient.pas" + 10) + $11
 + $12[20C155C1]{coreide100.bpl} KbClient.KbClient.HandleKey (Line 562, "KbClient.pas" + 6) + $12
 + $1[20C158D1]{coreide100.bpl} KbClient.KbClient.TIDEKBDFrameAPI.ProcessKeyStroke (Line 713, "KbClient.pas" + 141) + $1
 + $16[20C16604]{coreide100.bpl} KbClient.KbClient.TIDEKBDChildAPI.ProcessKeyStroke (Line 1357, "KbClient.pas" + 14) + $16
 + $18[20B98BC0]{coreide100.bpl} EditorControl.EditorControl.TCustomEditControl.DoKeyDown (Line 6843, "EditorControl.pas" + 6) + $18
 + $6[5205CA19]{vcl100.bpl } Controls.Controls.TWinControl.WndProc (Line 7246, "Controls.pas" + 105) + $6
 + $6[5205C1A4]{vcl100.bpl } Controls.Controls.TWinControl.MainWndProc (Line 7021, "Controls.pas" + 3) + $6
 + $0[51F60BC0]{rtl100.bpl } Classes.Classes.StdWndProc (Line 11572, "classes.pas" + 8) + $0
 + $24D[75288814]{USER32.dll } GetWindowLongW + $24D
 + $3C2[75288989]{USER32.dll } GetWindowLongW + $3C2
 + $7F[75289D0F]{USER32.dll } PostMessageW + $7F
 + $F2[75289D82]{USER32.dll } PostMessageW + $F2
 + $2B[7707E473]{ntdll.dll  } KiUserCallbackDispatcher + $2B
 + $47[7528C362]{USER32.dll } SendMessageW + $47
Ich denke das liegt an dem Punkt
Zitat:

Zitat von a-s-z-work
  • Verbesserung des Verhaltens, wenn das Package wieder entladen wird (HelpSelector wird dann ungültig).

Aber ich konnte nicht rausfinden, was du dahingehend gemacht hast. Wenn du das nochmal rückgängig machen könntest und dann nochmal ein Patch machst, dann kann ich mich auch um die anderen angesprochenen Punkte kümmern ;-)

Es gibt noch eine neue Revision (wegen eines kleinen Bugs bei der Neuanlage von Custom Help Providern). Wenn ich noch irgendwas für dich tun kann sags einfach. Sorry, daß ich deine vorherige Frage völlig unsinnig beantwortet habe. Im moment ist arbeitstechnisch ne Menge los und da bleibt die Konzentration ein wenig auf der Strecke.

chaosben 8. Okt 2009 10:23

Re: [IDE-Experte] CustomHelp
 
Noch schnell was "Neues": Im ersten Post gibts einen Link zu einem neuen Video, das die Installation und ein paar Möglichkeiten vorführt.

a-s-z-work 8. Okt 2009 10:50

Re: [IDE-Experte] CustomHelp
 
Hallo Marco,

Zitat:

Zitat von MarcoWarm
Wow ... da hast du dir ja ne Menge Arbeit gemacht.
Leider hab ich im Moment keine Zeit mich um die Änderungen zu kümmern, da Custom Help eher ein Teilzeitprojekt ist.
Ich hab den letzten Patch ausprobiert und hab noch einige "issues" gefunden.
  • Unter BDS2006 kommt eine Schutzverletzung nach dem ersten Hilfeaufruf...da hilf nur noch IDE Neustart. Der Aufrufstack der IDE hilft nicht wirklich weiter. Es passiert bei ValidateHelpSystem (unter BDS2006) im RAD Studio 2009 ist alles ok.

  • Das Problem kenne ich auch aus Delphi 2009. Der Zeitpunkt zu dem der Selector registriert wird scheint einigermassen kritisch zu sein. Ich hab es mal im Create-Event versucht, aber da hat es bei D2009 nix gebracht ;(

    Zitat:

    Zitat von MarcoWarm
  • Die Einstellung, ob man die CustomHelp Provider am Anfang oder am Ende sehen möchte sollte wahrscheinlich optional sein. Da hat jeder andere Vorstellungen.

  • Kein Problem, das ist nur eine Kleinigkeit.

    Zitat:

    Zitat von MarcoWarm
  • In GetHelpStrings->PerformSearch durchsuchst du jeden Hilfenamespace erst mit dem vollen Text und falls in einem(!) etwas gefunden wurde brichst du ab und suchst nicht mit dem verkürzten weiter um evtl. in anderen Namespaces was zu finden. Die vorherige Implementation erschien mir logischer: Jeden Hilfenamespace für sich durchsuchen und prüfen, ob der volle HelpString gefunden wurde und danach gegebenenfalls verkürzen. Danach für den nächsten Hilfenamespace das gleiche machen. usw.

  • Hmm, das entbehrt nicht einer gewissen Logik :roteyes: Ich werde da meine Implementierung entsprechend ändern. Wichtig ist für mich die Fehlerbehandlung bei kaputten Namespaces, da sonst ein kaputter Namespace dazu führt, das gar keine Ergebnisse mehr angezeigt werden.

    Zitat:

    Zitat von MarcoWarm
  • Die Unit uUtils.pas ist nicht BDS2006 konform. Dort einfach PWideChar und Widestring in PChar und Widestring umwandeln. Außerdem gab es noch kein TBytes :-(.

  • Da wird man denke ich am einfachsten was über Conditionals machen, und die fehlenden Sachen für ältere Delphi-Versionen deklarieren.

    Zitat:

    Zitat von MarcoWarm
  • Layout und Usability Anpassungen finde ich sehr gelungen :-)

Zitat:

Zitat von MarcoWarm
Danke, daß du so viel Mühe und Zeit in das Projekt reinsteckst. Da wir aber hier meistens mit BDS2006 arbeiten werde ich die Änderungen vorerst nicht einpflegen. Debuggen hat nich so viel gebracht, da der Fehler noch vor dem eigentlichen Aufruf unserer Klasse passiert:
Code:
 + $7[51F2A11F]{rtl100.bpl } System.System.@IntfAddRef (Line 17953, "system.pas" + 0) + $7
 + $0[51F26B4B]{rtl100.bpl } System.System.@HandleAnyException (Line 9980, "system.pas" + 13) + $0
 + $273[770A45C2]{ntdll.dll  } RtlpEnsureBufferSize + $273
 + $A[7707E49A]{ntdll.dll  } KiUserExceptionDispatcher + $A
 + $14[20B73F74]{coreide100.bpl} CompHelp.CompHelp.ValidateHelpSystem (Line 101, "CompHelp.pas" + 8) + $14
 + $E[20B940D6]{coreide100.bpl} EditorControl.EditorControl.TCustomEditControl.HelpKeyword (Line 4451, "EditorControl.pas" + 41) + $E
 + $0[20B99E84]{coreide100.bpl} EditorControl.EditorControl.TEditControl.CMControlCommand (Line 7255, "EditorControl.pas" + 2) + $0
 + $6[5205CA19]{vcl100.bpl } Controls.Controls.TWinControl.WndProc (Line 7246, "Controls.pas" + 105) + $6
 + $6[5205C1A4]{vcl100.bpl } Controls.Controls.TWinControl.MainWndProc (Line 7021, "Controls.pas" + 3) + $6
 + $0[51F60BC0]{rtl100.bpl } Classes.Classes.StdWndProc (Line 11572, "classes.pas" + 8) + $0
 + $24D[75288814]{USER32.dll } GetWindowLongW + $24D
 + $3C2[75288989]{USER32.dll } GetWindowLongW + $3C2
 + $7F[75289D0F]{USER32.dll } PostMessageW + $7F
 + $F2[75289D82]{USER32.dll } PostMessageW + $F2
 + $2B[7707E473]{ntdll.dll  } KiUserCallbackDispatcher + $2B
 + $47[7528F1B8]{USER32.dll } SendMessageA + $47
 + $10[20B84A6E]{coreide100.bpl} VClient.VClient.SendWindowMsg (Line 2673, "VClient.pas" + 2) + $10
 + $5[20B4A2BE]{coreide100.bpl} IDEKbd.IDEKbd.@interpret_bmi_macro$qqrp5BMI_tpcp11CmdMapTableppc (Line 39, "bmi.cpp" + 14) + $5
 + $16E[20B48ED2]{coreide100.bpl} IDEKbd.IDEKbd... (Line 586, "IDEKbd.pas" + 0) + $16E
 + $17[20B821A4]{coreide100.bpl} VClient.VClient.CmdStringProc (Line 504, "VClient.pas" + 5) + $17
 + $11[20C15B3C]{coreide100.bpl} KbClient.KbClient.TIDEKBDFrameAPI.MapAndEvalInternal (Line 832, "KbClient.pas" + 10) + $11
 + $12[20C155C1]{coreide100.bpl} KbClient.KbClient.HandleKey (Line 562, "KbClient.pas" + 6) + $12
 + $1[20C158D1]{coreide100.bpl} KbClient.KbClient.TIDEKBDFrameAPI.ProcessKeyStroke (Line 713, "KbClient.pas" + 141) + $1
 + $16[20C16604]{coreide100.bpl} KbClient.KbClient.TIDEKBDChildAPI.ProcessKeyStroke (Line 1357, "KbClient.pas" + 14) + $16
 + $18[20B98BC0]{coreide100.bpl} EditorControl.EditorControl.TCustomEditControl.DoKeyDown (Line 6843, "EditorControl.pas" + 6) + $18
 + $6[5205CA19]{vcl100.bpl } Controls.Controls.TWinControl.WndProc (Line 7246, "Controls.pas" + 105) + $6
 + $6[5205C1A4]{vcl100.bpl } Controls.Controls.TWinControl.MainWndProc (Line 7021, "Controls.pas" + 3) + $6
 + $0[51F60BC0]{rtl100.bpl } Classes.Classes.StdWndProc (Line 11572, "classes.pas" + 8) + $0
 + $24D[75288814]{USER32.dll } GetWindowLongW + $24D
 + $3C2[75288989]{USER32.dll } GetWindowLongW + $3C2
 + $7F[75289D0F]{USER32.dll } PostMessageW + $7F
 + $F2[75289D82]{USER32.dll } PostMessageW + $F2
 + $2B[7707E473]{ntdll.dll  } KiUserCallbackDispatcher + $2B
 + $47[7528C362]{USER32.dll } SendMessageW + $47
Ich denke das liegt an dem Punkt
Zitat:

Zitat von a-s-z-work
  • Verbesserung des Verhaltens, wenn das Package wieder entladen wird (HelpSelector wird dann ungültig).

Aber ich konnte nicht rausfinden, was du dahingehend gemacht hast. Wenn du das nochmal rückgängig machen könntest und dann nochmal ein Patch machst, dann kann ich mich auch um die anderen angesprochenen Punkte kümmern ;-)

Wie schon gesagt, der Fehler tritt teilweise auch unter D2009 auf, allerdings funktioniert nur der erste Aufruf nicht. Anschließende Aufrufe verursachen keine Probleme mehr. Außerdem gibt es das Problem nur, wenn ich das Package neu lade. Wird das Package schon beim Programmstart geladen, gibt es keine Probleme.
Zum Debuggen solltest du auf jeden Fall Breakpoints in deinem Code aktivieren, um zu schauen, ob der Code aufgerufen wird. Meistens sind diese Exceptions nämlich Folgefehler, weil wir die Dinge nicht so machen, wie das Hilfesystem es erwartet. Na das liegt dann wohl an der äußerst ausführlichen Doku! :glaskugel:

Zu meinen Änderungen:
Der HelpSelektor wird jetzt nur noch einmal erzeugt, den könnte man aber auch denke ich problemlos wieder jedes Mal erzeugen. Aber registriert wird er immer noch bei jedem Aufruf. In UnderstandsKeyword wird jetzt die echte Anzahl an Ergebnissen übergeben, da könnte man aber auch wieder fest die 1 zurück liefern. Vielleicht kommt da die Suche dem Hilfesystem in die Quere.

MarcoWarm 8. Okt 2009 11:05

Re: [IDE-Experte] CustomHelp
 
Hallo Andre,

Zitat:

Zitat von a-s-z-work
Wie schon gesagt, der Fehler tritt teilweise auch unter D2009 auf, allerdings funktioniert nur der erste Aufruf nicht. Anschließende Aufrufe verursachen keine Probleme mehr. Außerdem gibt es das Problem nur, wenn ich das Package neu lade. Wird das Package schon beim Programmstart geladen, gibt es keine Probleme.
Zum Debuggen solltest du auf jeden Fall Breakpoints in deinem Code aktivieren, um zu schauen, ob der Code aufgerufen wird. Meistens sind diese Exceptions nämlich Folgefehler, weil wir die Dinge nicht so machen, wie das Hilfesystem es erwartet. Na das liegt dann wohl an der äußerst ausführlichen Doku! :glaskugel:

Zu meinen Änderungen:
Der HelpSelektor wird jetzt nur noch einmal erzeugt, den könnte man aber auch denke ich problemlos wieder jedes Mal erzeugen. Aber registriert wird er immer noch bei jedem Aufruf. In UnderstandsKeyword wird jetzt die echte Anzahl an Ergebnissen übergeben, da könnte man aber auch wieder fest die 1 zurück liefern. Vielleicht kommt da die Suche dem Hilfesystem in die Quere.

Dieser Fehler unter D2009 ist mir auch bekannt. Den HelpSelector hatte ich bewusst jedes mal neu erzeugt, da ich sonst die Schutzverletzung bekam.
Übringens: Breakpoints und deren Anwendung sind mir vertraut ;-) (nichts für ungut)
Die Exception tritt eben schon auf bevor ich irgendwas in meinen Klassen mache.

Ob understandskeyword die reale Resultatmenge zurückgibt ist dem Hilfesystem völlig egal... dort wird nur geprüft:
Delphi-Quellcode:
vFound := vViewer.UnderstandsKeyword(HelpKeyword) > 0;

a-s-z-work 8. Okt 2009 11:39

Re: [IDE-Experte] CustomHelp
 
Hallo Marco,

Zitat:

Zitat von MarcoWarm
Dieser Fehler unter D2009 ist mir auch bekannt. Den HelpSelector hatte ich bewusst jedes mal neu erzeugt, da ich sonst die Schutzverletzung bekam.

Na da haben wir ja vielleicht schon das Problem mit dem BDS2006 gefunden?

Zitat:

Zitat von MarcoWarm
Übringens: Breakpoints und deren Anwendung sind mir vertraut ;-) (nichts für ungut)
Die Exception tritt eben schon auf bevor ich irgendwas in meinen Klassen mache.

:lol: Das mit den Breakpoints usw. habe ich auch nicht anders erwartet. Bei mir war z.B. das Problem, das der Fehler später aufgetreten ist, wenn ich im Konstruktor AssignHelpSelector verwendet habe. Da wurden vor der Exception außerdem Methoden aufgerufen, die ich nicht vermutet hatte. Vielleicht werden da Seiteneffekte erzeugt. Und die konkrete Implementierung des BDS-Hilfesystems kann ja nicht einsehen ...

Zitat:

Zitat von MarcoWarm
Ob understandskeyword die reale Resultatmenge zurückgibt ist dem Hilfesystem völlig egal... dort wird nur geprüft:
Delphi-Quellcode:
vFound := vViewer.UnderstandsKeyword(HelpKeyword) > 0;

Ja, zumindest der aktuellen Implementierung :wink:

MarcoWarm 8. Okt 2009 13:41

Re: [IDE-Experte] CustomHelp
 
Hallo Andre,

soweit ich das bis jetzt rausbekommen habe, ist der Fehler einizig und allein auf den THelpSelector beschränkt. Ich denke es könnte irgendein Problem bei der Referenzzählung des IHelpSystem sein. Aber wie man dem entgegenwirkt? :gruebel:

MarcoWarm 9. Okt 2009 11:01

Re: [IDE-Experte] CustomHelp
 
neue Release... Alle Änderungen von a-s-z-work sind jetzt eingepflegt.
+ Möglichkeit der Prüfung, ob ein Keyword überhaupt in einer WindowsHilfe (*.hlp) Datei vorkommt. z.B. d7.hlp

Kalfany 9. Okt 2009 13:51

Re: [IDE-Experte] CustomHelp
 
Das Projekt lässt sich unter D2007 nicht mehr laden:
Zitat:

Das Projekt kann nicht geladen werden, weil die erforderliche Personality Delphi.Personality.12 nicht zur Verfügung steht.
(kommt bei beiden Projekt Dateien, D100 & D120)

chaosben 9. Okt 2009 17:25

Re: [IDE-Experte] CustomHelp
 
Ich hab dir mal ein D2007-Projekt ins Repository gepackt. Probiers mal damit.

mleyen 9. Okt 2009 22:07

Re: [IDE-Experte] CustomHelp
 
Die Direktive VER180 und VER185 sind beide aktiv, d.h. REG_ROOT_KEY wird doppelt definiert.
VER180 entfernt und es läuft super unter D11. Danke :thumb:

chaosben 10. Okt 2009 07:44

Re: [IDE-Experte] CustomHelp
 
Hey, danke! So ist das wenn man kein D2007 zur Hand hat. Habs im Repository korrigiert.

MarcoWarm 12. Okt 2009 10:03

Re: [IDE-Experte] CustomHelp
 
Neue Woche neue Version.

Es ist jetzt möglich neben Urls und HtmlHelp, WinHelp Dateien auch beliebige Pfade als Hilequelle anzugeben.
Der Suchbegriff wird entsprechend dem Platzhalter $(HelpString) eingefügt.
z.B.:
Code:
"C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32.exe" /A "zoom=50&navpanes=1=OpenActions&search=$(HelpString)" "C:\Users\MaWarm\Documents\Help\BDS4 Reference.pdf"
öffnet und sucht in einer PDF-Datei.

Es werden nun auch alle anderen Umgebungsvariablen ersetzt (z.B. $(BDS) )

viel Spaß damit

Gruß
Marco

Kalfany 12. Okt 2009 11:20

Re: [IDE-Experte] CustomHelp
 
Zitat:

Zitat von chaosben
Hey, danke! So ist das wenn man kein D2007 zur Hand hat. Habs im Repository korrigiert.

Funktioniert, Danke!

chaosben 16. Okt 2009 05:49

Re: [IDE-Experte] CustomHelp
 
Da wir nun endlich die Idee hinter SVN so halbwegs verstanden haben, hat sich die URL im ersten Beitrag geändert.

Es gibt jetzt im SVN unter tags/Release/CustomHelp eine saubere Release-Kultur, damit ihr nicht jeden Blödsinn mitmachen müsst, den wir verbrechen. :)

mkinzler 16. Okt 2009 06:58

Re: [IDE-Experte] CustomHelp
 
Deshalb hat er bei mir gestern, alles neu heruntergeladen


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:30 Uhr.
Seite 1 von 4  1 23     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