Einzelnen Beitrag anzeigen

Benutzerbild von Amnon82
Amnon82

Registriert seit: 5. Jan 2005
186 Beiträge
 
FreePascal / Lazarus
 
#1

Erstellen eines Delphi IDE Plugins für Delphi 2005 Personal

  Alt 28. Mai 2006, 14:35
Da Sakuras Tutorial für Delphi 2005 Personal leider nicht funktioniert hab ich mich hingesetzt und nach einer Lösung gesucht. Die Antwort war OpenToolsAPI. OpenToolsAPI kann man nicht zu einer Form hinzufügen. Man muss es mit einem WizardDataModule erledigen. Alles was Ihr für dieses Tut braucht findet Ihr im Anhang.

Fangen wir mal an.

Ein Wizard wird wie folgt definiert:

Delphi-Quellcode:
TWizard = class(TInterfacedObject, IOTAWizard, IOTANotifier)
  public
    procedure AfterSave;
    procedure BeforeSave;
    procedure Destroyed;
    procedure Execute;
    procedure Modified;
    function GetState: TWizardState;
    function GetIDString: string;
    function GetName: string;
    constructor Create;
    destructor Destroy; override;
  end;
Gehn wir mal auf die einzelnen Punkte ein:

AfterSave, BeforeSave, Destroyed, Execute und Modified könnt Ihr so abhacken ...

Delphi-Quellcode:
procedure TWizard.AfterSave;
begin
end;

procedure TWizard.BeforeSave;
begin
end;

procedure TWizard.Destroyed;
begin
end;

procedure TWizard.Execute;
begin
end;

procedure TWizard.Modified;
begin
end;
... da Delphi diese eh nicht aufruft.

WizardState löst Ihr so:

Delphi-Quellcode:
function TWizard.GetState: TWizardState;
begin
  Result := [];
end;
Kommen wir nun zu den wichtigen Punkten. Zuerst muss der Wizard erschaffen werden. Dies wird wie folgt erledigt:

Delphi-Quellcode:
constructor TWizard.Create;
begin
  WizardDataModule := TWizardDataModule.Create(nil);
end;
Der Destructor für Destroy sieht so aus:

Delphi-Quellcode:
destructor TWizard.Destroy;
begin
  WizardDataModule.Free;
end;
Damit die IDE Euren Wizard eindeutig identifizieren kann müsst Ihr folgende zwei Punkte angeben:

Delphi-Quellcode:
function TWizard.GetIDString: string;
begin
  Result := 'WizardID';
end;

function TWizard.GetName: string;
begin
  Result := 'WizardName';
end;
Die Results ergeben die eindeutigen Namen Eurers Wizard. Falls Ihr mehere Wizards in Eurer IDE verwenden wollt müssen diese anders heißen.

Ein Wizard wird so registiert:

Delphi-Quellcode:
procedure Register;
begin
  RegisterPackageWizard(TWizard.Create);
end;
Nun haben wir den Grundstein eines Wizards gelegt und gehen ans Eingemachte. Ein Wizard hat wie eine Form auch eine Create Produce. Hiermit können wir die neuen Menüpunkte anlegen.

Delphi-Quellcode:
procedure TWizardDataModule.WizardDataModuleCreate(Sender: TObject);
var
  InsertPosition: Integer;
  Item: TMenuItem;
  I,Iindex: Integer;
  caption:string;
begin
  EditMenu := (BorlandIDEServices as INTAServices).MainMenu.Items[0];
  InsertPosition := EditMenu.Count;
  for I := 0 to EditMenu.Count-1 do
    if CompareText(EditMenu[I].Name, 'MenuItem.Name') = 0 then
    begin
      InsertPosition := I;
      Break;
    end;
    caption:='Amnon82''s Test-MenuItem;
Iindex:=0;
for I := MENU.Items.Count-1 downto 0 do
begin
Item := MENU.Items[I];
Item.ImageIndex:=Iindex;
Item.caption:=caption;
MENU.Items.Delete(I);
EditMenu.Insert(InsertPosition, Item);
end;
end;
Mit "EditMenu" legen wir fest in welchem Hauptmenü wir einen Menüpunkt anlegen werden. "(BorlandIDEServices as INTAServices).MainMenu.Items[0]" entspricht zum Beispiel dem "Files"-Menü.

Mit "CompareText" suchen wir uns die Einfügeposition für den neuen Menüpunkt aus. Haben wir den Punkt gefunden definieren wir noch die Caption von unserem neuen Menüpunkt und das Icon. Die Delphi IDE hat mehr als 300 Icons. Falls Ihr das gewünschte Icon nicht findet könnt Ihr auch 999 angeben, um keins anzeigen zu lassen.

Man kann natürlich auch einen existierenden Menüpunkt ersetzen. Hierfür müsst Ihr natürlich wissen, wie dieser heißt. Hierzu hab ich einen SearchIDEWizard programmiert, welcher die Menüpunkte und Hauptmenüpunkte in einer TXT-Datei auf C abspeichert.

In der Zeile "if CompareText(EditMenu[I].Name, 'MenuItem.Name') = 0" gebt Ihr dann statt "MenuItem.Name" den entsprechenden Namen des zu ersetzenden Menüpunktes ein. Mit folgenden Zeilen bekommt Ihr die Caption, das Icon und läßt den Menüpunkt verschwinden, da Ihr ihn dann doppelt hättet:

Delphi-Quellcode:
EditMenu.items[I].visible:=false;
caption:=EditMenu.items[I].caption;
Iindex:=EditMenu.items[I].imageindex;
Ein Beispiel dafür findet Ihr in der Source von Amnon82's CloseFix
Angehängte Dateien
Dateityp: zip blankwizard_280506_503.zip (4,9 KB, 47x aufgerufen)
Dateityp: zip amnon82s.wizards_147.zip (24,9 KB, 46x aufgerufen)
  Mit Zitat antworten Zitat