Home » Tipps & Tricks » Sonstiges » IDE » Open Tools API

Open Tools API

Das OpenToolsAPI (API = Application Programming Interface) ist Delphis Programmierschnittstelle zur IDE, über die sie die Möglichkeit haben, die Entwicklungsumgebung um eigene Funktionen zu erweitern.
Gleich ein Hinweis: Da das OTA immer wieder weiter entwickelt wurde, ergeben sich kleine Unterschiede zwischen den verschiedenen Delphi-Versionen. Ab D4 gab es aber einen großen Sprung. Dieses Beispiel baut auf D6 auf, dürfte zumindest aber auch auf den Versionen 4 und 5 funktionieren.In die IDE eingebunden Programme bezeichnet man als Experten oder Wizards. Delphi verwendet diese Experten auch selbst, als Beispiel sei der Dialog-Experte genannt.Eine gute Expertensammlung ist das GExperts-Projekt(www.gexperts.com), in dessen Quellen sie sich unbedingt einmal anschauen sollten.
Grundsätzlich gibt es zwei Arten von Wizards, DLL-Experten und Package-Experten.
In der Praxis wird allerdings die DLL-Form nur noch vereinzelt genutzt, die gängigere und komfortablere Methode ist der Weg über ein Package, den auch wir beschreiten werden.
Zur Erstellung von Wizards stehen insgesamt 5 verschiedene Interfaces zur Verfügung. Das Grundlegende Interface ist IOTAWizard. Die anderen bauen auf diesem auf und sind mehr spezialisiert. Wir werden später mehr darüber erfahren.
Die eigentlichen Schnittstellen zur IDE werden „Services“ genannt. Sie ermöglichen den Zugriff auf einzelne Teile und Funktionen von Delphi.Beginnen wir also mit einem traditionellen Anwendungsbeispiel, einem HelloWorld-Experten, der eben nur diesen Gruß in einer Message anzeigt.
Zuerst benötigen wir ein Interface, von dem wir unsere Klasse ableiten. Wir werden dazu IOTAMenuWizard verwenden, dass nicht wie zu vermuten, ein neues Menü erstellt, sondern einen neuen Eintrag im Hilfe-Menü.
Jeder Experten muss außerdem noch das bereits erwähnte Interface IOTAWizard implementieren, dass die Grundlegenden Funktionalitäten zur Verfügung stellt.
Unsere Experten-Klasse muss dadurch min. 3 Funktionen besitzen:

  • GetIDString liefert eine eindeutige ID zurück
  • GetName den Namen des Experten
  • GetState den Status, was später noch genauer erklärt wird.

Da wir ja einen Menü-Eintrag erzeugen wollen und deshalb wie bereits beschrieben auch IOTAMenuWizard verwenden, ist eine weitere Funktion notwendig:

  • GetMenuText liefert die Caption des Menü-Items zurück

-> Legen Sie eine neue Unit an(HelloWordExpert.pas) und packen sie sie in ein Package. Dann deklarieren Sie eine neue Klasse, die wie folge aussieht:

type
 THelloWorldExpert = class(TNotifierObject, IOTAWizard, IOTAMenuWizard)
  function GetIdString: string;
  function GetName: string;
  function GetState: TWizardState;
  function GetMenuText: string;

  procedure Execute;
 end;

Hinweis: Sie benötigen die Unit toolsapi um die Schnittstellen verwenden zu können. Binden sie diese über die uses-Klausel ein.Wie sie sicher bemerkt haben, ist hier außerdem eine Prozedure Execute vorhanden. Sie wird aufgerufen, wenn der Menü-Eintrag ausgewählt wird.Die eigentliche Implementierung der Funktionen ist relativ einfach:

function THelloWorldExpert.GetIDString: string;
Begin
 result:='BlackBird.HelloWorld';
end;

GetIDString sollte einen eindeutigen Namen zurückgeben. Am besten sie trennen wie oben den Namen des Autors durch den Namen des Experten.

function THelloWorldExpert.GetName: string;
Begin
 result:='Hello-World Experte';
end;

GetName liefert einen benutzerfreundlichen Namen zurück.

function THelloWorldExpert.GetState: TWizardState;
Begin
 result:=[wsEnabled];
end;

Diese Funktion wird nur von einem Menü-Experten aufgerufen, muss aber dennoch in jedem Fall implementiert werden.TWizardState ist eine Menge, die beiden Elemente wsEnabled(aktiviert) und wsChecked(mit Häkchen) enthalten kann.

function THelloWorldExpert.GetMenuText: string;
Begin
 result:='Mein erster Experte: HelloWorld';
end;

GetName schließlich ist für die Beschriftung des Menü-Eintrags zuständig.Nun fehlt noch die Execute-Methode:

procedure THelloWorldExpert.Execute;
Begin
 ShowMessage('Hello World');
end;

In unserem Fall wird nur eine Nachrichtenbox angezeigt.Im letzten Schritt ist noch eine Register-Procedure notwendig, die wie bei der Komponenten-Entwicklung den Experten bei der IDE anmeldet.Diese Prozedur dürfen sie nicht in der Klasse deklarieren, sonder sie muss außerhalb stehen!

procedure Register;
Begin
 RegisterPackageWizard(THelloWorldExpert.Create as IOTAWizard);
end;

Nun können Sie das Package installieren und finden ihren Experten nun im Hilfe-Menü von Delphi.

Auf die IDE Einfluss nehmen

Bis jetzt haben wir nur einen Experten in die IDE eingebunden, der allerdings noch keine vernünftige Aufgabe erfüllt.Ein echter Experte muss natürlich irgendwie auf Delphi zugreifen können, z.B. eine Datei öffnen.Dies geschieht im OpenToolsAPI über die eingangs erwähnten Services.Deren Verwendung ist im Prinzip sehr einfach. Zuerst muss die entsprechende Unit eingebunden werden. In der folgenden Tabelle erhalten sie ein Übersicht über die Services:

unit            Beschreibung:
************         **************
MessageServices         Zugriff auf Compilermeldungen
ActionServices         Bietet Möglichkeit zum Öffnen und Speichern von Dateien
PackageServices         Zugriff auf install. Packages
TodoServices         Beeinflussung der Todo-Liste
WizardServices         Experten hinzufügen und entfernen
EditorServices         Zugriff auf den Editor inc. der Optionen
DebuggerServices      Alles um laufende Prozesse und Haltepunkte. Enthält einige Bugs.

Im folgenden erhalten sie ein paar Beispiele über die Verwendung von Services.
Zum Zugriff verwenden sie einfach die in der ToolsAPI.pas deklarierte Variable „BorlandIDEServices“.
+ Löschen aller Meldungen: (BorlandIDEServices as IOTAMessageServices).ClearAllMessages;
+ Löschen aller Compilermeldungen: (BorlandIDEServices as IOTAMessageServices).ClearCompilerMessages;
+ Eigene Meldung ausgeben (BorlandIDEServices as IOTAMessageServices).AddToolMessage (filename, Message, Prefix: string; Line, Col: integer);
filename ist der Name des Editors, Message die Nachricht, Prefix der Name des ausgebenden Tools, Line und Col die Zeile und die Spalte auf die die Meldung bezogen ist.
Text des Editors auslesen:

var Buffer: TIOTAEditBuffer;
  Buffer:=(BorlandIDEServices as IOTAEditorServices).TopBuffer;

Eine Datei öffnen:

  (BorlandIDEServices as IOTAActionServices).OpenFile
    (filename: string);

Filename ist der Dateiname
.Weitere Literatur:
Quellen der GExperts sowie die Webseite des Herstellers mit FAQ (www.gexperts.com)
Bugliste: www.gexperts.com/opentools
Ray Lischner’s Homepage: www.tempest-sw.com/opentools