|
Antwort |
Registriert seit: 23. Jan 2005 Ort: Dresden 445 Beiträge Delphi 7 Personal |
#1
Hallo,
Nun will ich mich mal wieder hier melden und Euch zeigen, wie mitganz einfachen Mitteln die Turbo Delphi Hilfe oder wahlweise diejenige aus Delphi 7 innerhalb von Turbo Delphi reaktiviert werden kann, wenn sie aus den unterschiedlichsten Gründen ihren Geist aufgegeben hat. Warum schreibe ich das? Auch ich hatte das leidige Problem, das in Turbo Delphi die Hilfe nicht eines Tage mehr funktionierte. Ich habe dann hier nach Lösungen gesucht, die scheinbar mit dem DP Help Booster und noch dazu mit CustomHelp hier angeboten wurden. Leider funktionieren diese Lösungen nicht mit der portablen Version von Turbo Delphi. Eine neue Lösung musste her. Die funktioniert mit einem Eintrag in das Delphi Tools-Menu über die Menüfunktion "Tools konfigurieren. Der Tools-Optionen Dialog erscheint -> dort Button Hinzufügen... In den folgenden Dialog folgendes eintragen: Titel: Delphi-Hilfe Programm: winhlp32.exe Arbeitsverzeichnis: //findet Windows bei diesem Programm selber Parameter: $PARAMS -P -K $CURTOKEN G:\Programme\Borland\BDS\4.0\Help\Del7Help\d7vcl.hlp Fertig ist die neue Turbo Delphi Hilfe. ACHTUNG! Winhlp32.exe kann nur die alten Formate anzeigen. Hier muss die Hilfe aus Delphi7-x verfügbar gemacht werden. Mit der originalen Turbo Delphi Hilfe klappt das nur mit dem HelpExplorer, der hier: http://download.cnet.com/Help-Explor...2cb7762d&dlm=0 zu haben ist. Dann muss allerdings mit "Arbeitsverzeichnis" im oben genannten Dialog der Installationspfad angegeben werden. Die Parameterliste bleibt gleich. ------------------------------------------------------------------------------------------ An einer anderen Variante tüftle ich gerade. Mit dieser Unit:
Delphi-Quellcode:
Die hier auch vorausgesetzte Unit ConsoleOut stammt ebenfalls von hier aus der DP.
{
This unit can be compiled into a package and will then appear in the delphi Help menu. } unit UHelpExpert; interface uses Classes, SysUtils, ToolsApi, ConsoleOut, Menus, StrUtils; type TSDCSimpleExpert = class(TNotifierObject, IOTAMenuWizard, IOTAWizard) private FOutput: TStringList; FError: TStringList; public constructor Create; destructor Destroy; override; function GetIDString: string; function GetName: string; function GetState: TWizardState; procedure Execute; function GetMenuText: string; function GetTopBufferText : String; end; procedure Register; procedure SetMenuItemIntoIDE(ACaption: String; AShortCut: String = ''; AKey: Word = 0); implementation uses Dialogs; procedure Register; begin {register expert} RegisterPackageWizard(TSDCSimpleExpert.Create); end; //Aus Swiss-Delphi-Center //Rubrik ToolsAPI procedure SetMenuItemIntoIDE(ACaption: String; AShortCut: String = ''; AKey: Word = 0); var item: TMenuItem; begin {get reference to delphi's mainmenu. You can handle it like a common TMainMenu} with (BorlandIDEServices as INTAServices).GetMainMenu do begin item := TMenuItem.Create(nil); item.Caption := ACaption; item.ShortCut := AKey; Items.Add(item); end; end; //Diese Methode stammt aus der DP //Thread-Titel: "Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen" { Text von der aktuellen Position im Editor holen. ~result Text an der Cursorposition } function TSDCSimpleExpert.GetTopBufferText : String; Var sText : String; ch : Char; bOk : Boolean; i : Integer; EditorServices: IOTAEditorServices; begin // markierten Text aus dem Editor holen. sText := EditorServices.TopBuffer.EditBlock.Text; // Ist kein Text markiert? If sText = '' Then Begin with EditorServices.TopBuffer.EditPosition do begin Repeat // Ein Zeichen nach links gehen bOk := Move(Row, Column - 1); // Hat das funktioniert? If bOk then begin // Zeichen lesen ch := Read(1)[1]; // Ist es ein Buchstabe? Case ch Of 'A'..'Z','a'..'z','.' : ; // bOk := True; else // Nein, dann Schalter für Schleifenabbruch setzen. bOk := false; End; end; Until not bOk; // Mit dem Cursor ein Zeichen nach rechts, // wenns kein Buchstabe oder Punkt ist Case Read(1)[1] Of 'A'..'Z','a'..'z','.' :; else Move(Row, Column + 1); end; // und dann die nächsten 100 Zeichen sText := Trim(Read(100)); i := 1; bOK := False; // Das erste Zeichen suchen, das kein Buchstabe ist bzw. kein Punkt. Repeat Case sText[i] Of 'A'..'Z','a'..'z','.' :; else bOk := True; end; Inc(i); Until (i >= Length(sText)) Or bOk; // Das wird unser Suchbegriff sText := Copy(sText,1,i - 2); end; // Ein eventuell vorhandenes Semikolon wird entfernt. sText := AnsiReplaceText(sText,';',' '); sText := Trim(sText); i := Pos(' ',sText); If i > 0 Then sText := Copy(sText,1,i - 1); end; Result := sText; end; { TSDCSimpleExpert } constructor TSDCSimpleExpert.Create; begin inherited Create; FOutput := TStringList.Create; FError := TStringList.Create; end; destructor TSDCSimpleExpert.Destroy; begin FError.Free; FOutput.Free; inherited Destroy; end; procedure TSDCSimpleExpert.Execute; begin {code to execute when menu item is clicked} //ShowMessage('This code is executed.'); GetConsoleOutput('winhlp32.exe -K '+GetTopBufferText+'G:\Programme\Borland\BDS\4.0\Help\Del7Help\d7vcl.hlp', FOutput, FError); end; function TSDCSimpleExpert.GetIDString: string; begin {unique expert identifier} Result := 'GetIDString SwissDelphiCenter.SimpleExpert'; end; function TSDCSimpleExpert.GetMenuText: string; begin {caption of menu item in help menu} Result := 'Komponentenhilfe'; end; function TSDCSimpleExpert.GetName: string; begin {name of the expert} Result := 'GetExpertName SwissDelphiCenter Simple Expert'; end; function TSDCSimpleExpert.GetState: TWizardState; begin Result := [wsEnabled]; end; end. Es gibt aber einen kleinen Schönheitsfehler. Die F1 Taste funktioniert leider nicht. Es klappt nur durch Auswahl des Meinüpunktes im Menü selber. Hier wäre ein guter Tipp hilfreich. Ich habe GExperts für Turbo Delphi installiert und der Experte baut sich auch bei der portablen Version in das Delphi Menü ein. In GExperts gibt es eine Funktion IDE Menu Shortcus..., die es erlaubt, die zugeorneten Tastenkürzel zu ändern. Aber auch das hilft in diesem Fall nicht. Wenn jemand wissen sollte, wie die F1 Taste mit einfachen Mitteln wieder funktionsfähig gemacht werden kann, bitte ich diejenige Person, den Weg da hin hier zu posten. Bei mir funktioniert leider überhaupt nur die erstere Methode per Tools Menü. Die zweite Version löst eine Access-Violation aus. Obwohl der Aufruf in der Testphase geklappt hat. Dazu aber mach ich mal besser einen anderen Thread auf. Das hier könnte gut zu den tutorials passen. Die Varinte mit dem Tools Menü dürfte auf jeden Fall funktionieren. Die andere mit der unit UHelpExpert ist noch fehlerhaft. Ich vermute, den Fehler hier:
Delphi-Quellcode:
Ich denke mal, das dieses Interface "IOTAEditorServices" erst mal irgendwo zugewiesen werden muss, weiß aber grad nicht, wie.
//Diese Methode stammt aus der DP
//Thread-Titel: "Tools API Delphi 2007 kompletten Source des aktuellen Editors auslesen" { Text von der aktuellen Position im Editor holen. ~result Text an der Cursorposition } function TSDCSimpleExpert.GetTopBufferText : String; Var sText : String; ch : Char; bOk : Boolean; i : Integer; EditorServices: IOTAEditorServices; begin // markierten Text aus dem Editor holen. Vorher mit festem String hat der AUfruf fehlerfrei funktioniert, also muss der Fehler an dieser Stelle ligen. Wer wieß, wie die korrekte Zuweisung des Interfaces erfolgen muss. Bitte posten! Für mich funktioniert auch die andere Variante per Tools Menü. Dieser Auszug zeigt, das die Funktion GetTopBufferText den Feler verursacht.
Zitat:
+ $28[08E01A04]{IDEHelpExp.bpl} Uhelpexpert.TSDCSimpleExpert.GetTopBufferText + $28
+ $0[51F26B4B]{rtl100.bpl } System.System.@HandleAnyException (Line 9980, "system.pas" + 13) + $0 + $37[77F7336D]{ntdll.dll } RtlConvertUlongToLargeInteger + $37 + $9[77F410A1]{ntdll.dll } KiUserExceptionDispatcher + $9 + $22[08E01CC6]{IDEHelpExp.bpl} Uhelpexpert.TSDCSimpleExpert.Execute + $22 + $12[20B6CDD9]{coreide100.bpl} ExptMain.ExptMain.TExpertServices.WizardItemClick (Line 654, "ExptMain.pas" + 2) + $12 + $3[218BD460]{vclactnband100.bpl} ActnMenus.ActnMenus.TCustomActionMainMenuBar.Track Menu (Line 3143, "ActnMenus.pas" + 3) + $3 + $4[218B891D]{vclactnband100.bpl} ActnMenus.ActnMenus.TCustomActionMenuBar.CMItemCli cked (Line 883, "ActnMenus.pas" + 3) + $4 + $6[5205CA19]{vcl100.bpl } Controls.Controls.TWinControl.WndProc (Line 7246, "Controls.pas" + 105) + $6 + $4[218BA158]{vclactnband100.bpl} ActnMenus.ActnMenus.TCustomActionMenuBar.WndProc (Line 1572, "ActnMenus.pas" + 15) + $4 + $0[51F60BC0]{rtl100.bpl } Classes.Classes.StdWndProc (Line 11572, "classes.pas" + 8) + $0 + $2588[77D13A5C]{USER32.dll } CreateWindowExA + $2588 + $2655[77D13B29]{USER32.dll } CreateWindowExA + $2655 + $2891[77D13D65]{USER32.dll } CreateWindowExA + $2891 Wenn jemand die richtige Interfacezuweisung kennt bitte hier posten und dann bitte ich die Moderatioren diesen Anhang hier ab " ---------- Bitte nach Tutorials verschieben ------------- zu löschen. ---------------------------------------------------- .
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
Geändert von schöni (28. Jan 2014 um 14:36 Uhr) |
Zitat |
Registriert seit: 23. Jan 2005 Ort: Dresden 445 Beiträge Delphi 7 Personal |
#2
Kann meinen gestrigen Beitrag nicht mehr bearbeiten.
In der Methode GetTopBufferText muss die entscheidende Zeile so lauten:
Delphi-Quellcode:
Die erste Zeile der Methode sText := ... muss auch entsprechend geändert werden, dann funktioniert alles.
with (BorlandIDEServices as
IOTAEditorServices).TopBuffer.EditPosition do begin statt wie in der hier gezeigten Quelle: with EditorServices.TopBuffer.EditPosition do begin
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
|
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |