AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Turbo Delphi Hilfe

Ein Thema von schöni · begonnen am 28. Jan 2014 · letzter Beitrag vom 29. Jan 2014
Antwort Antwort
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#1

Turbo Delphi Hilfe

  Alt 28. Jan 2014, 14:28
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.

Geändert von schöni (28. Jan 2014 um 14:36 Uhr)
  Mit Zitat antworten Zitat
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#2

AW: Turbo Delphi Hilfe

  Alt 29. Jan 2014, 14:41
Kann meinen gestrigen Beitrag nicht mehr bearbeiten.

In der Methode GetTopBufferText muss die entscheidende Zeile so lauten:

Delphi-Quellcode:
 with (BorlandIDEServices as
  IOTAEditorServices).TopBuffer.EditPosition do begin

statt wie in der hier gezeigten Quelle:

 with EditorServices.TopBuffer.EditPosition do begin
Die erste Zeile der Methode sText := ... muss auch entsprechend geändert werden, dann funktioniert alles.
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 Uhr.
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