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.