Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Erstellen eines Delphi IDE Plugins für Delphi 2005 Personal (https://www.delphipraxis.net/70311-erstellen-eines-delphi-ide-plugins-fuer-delphi-2005-personal.html)

Amnon82 28. Mai 2006 14:35


Erstellen eines Delphi IDE Plugins für Delphi 2005 Personal
 
Liste der Anhänge anzeigen (Anzahl: 2)
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

Amnon82 29. Mai 2006 18:29

Logo für den Splash von Delphi 2005
 
Ihr könnt auch ein Logo in den Splash von Delphi 2005 setzen.
Somit können die User Euer Plugin leichter erkennen.

Dazu braucht Ihr eine Bitmap.

Die sollte 32x32 Pixel groß sein und kann 16,7 Mil. Farben haben.

Erstellt eine .rc-Datei mit folgendem Inhalt:

Code:
LOGO bitmap "NamedesBildes.bmp"
Diese könnt Ihr dann mit der brcc32.exe durch den Befehl "brcc32.exe LOGO.rc" zu einer Resource umwandlen.

Öffnet Euer Projekt und fügt die Resource hinzu.

Delphi-Quellcode:
implementation

{$R *.DFM}
{$R Logo.res}
Fügt folgende Variablen zu den globalen Variablen hinzu:

Delphi-Quellcode:
sPluginName: string;
lBitmap: Graphics.TBitmap;
Den Punkt "procedure Register;" ändert Ihr wie folgt ab:

Delphi-Quellcode:
procedure Register;
begin
  sPluginName:='Name des Plugins';
  if SplashScreenServices <> nil then
  begin
    lBitmap := Graphics.TBitmap.Create;
    try
      lBitmap.LoadFromResourceName(hInstance, 'LOGO');
      SplashScreenServices.StatusMessage(sPluginName);
      SplashScreenServices.AddPluginBitmap(sPluginName, lBitmap.Handle);
    finally
      lBitmap.Free;
    end;
  end;
  RegisterPackageWizard(TWizard.Create);
end;
Falls Euch das Logo nicht lange genug angezeigt wird, könnt Ihr die Anzeigedauer mit folgendem Code verlängern (wodurch sich aber der Start von Delphi verzögern kann!):

Delphi-Quellcode:
procedure Delay(Milliseconds: Integer);
var
  Tick: DWord;
  Event: THandle;
begin
  Event := CreateEvent(nil, False, False, nil);
  try
    Tick := GetTickCount + DWord(Milliseconds);
    while (Milliseconds > 0) and
          (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
    begin
      Application.ProcessMessages;
      if Application.Terminated then Exit;
      Milliseconds := Tick - GetTickcount;
    end;
  finally
    CloseHandle(Event);
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 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