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:
{
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.
Die hier auch vorausgesetzte
Unit ConsoleOut stammt ebenfalls von hier aus der
DP.
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:
//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.
Ich denke mal, das dieses Interface "IOTAEditorServices" erst mal irgendwo zugewiesen werden muss, weiß aber grad nicht, wie.
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
---------- Bitte nach Tutorals verschieben ---------
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.