Hallo Marco,
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 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 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 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 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 von
MarcoWarm:
- Layout und Usability Anpassungen finde ich sehr gelungen
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 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!
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.