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