AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Erstellen eines Delphi IDE Plugins für Delphi 2005 Personal
Tutorial durchsuchen
Ansicht
Themen-Optionen

Erstellen eines Delphi IDE Plugins für Delphi 2005 Personal

Ein Tutorial von Amnon82 · begonnen am 28. Mai 2006 · letzter Beitrag vom 29. Mai 2006
Antwort Antwort
Benutzerbild von Amnon82
Amnon82
Registriert seit: 5. Jan 2005
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)
 
Benutzerbild von Amnon82
Amnon82

 
FreePascal / Lazarus
 
#2
  Alt 29. Mai 2006, 18:29
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;
  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 05:30 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