Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.431 Beiträge
 
Delphi 12 Athens
 
#8

AW: Exception beim Schließen der IDE, wenn meine Erweiterung vorher aktiv war

  Alt 16. Mär 2024, 00:35
Hier ein ziemlich rudimentäres Beispiel. Man muss lediglich beim Start/Beenden das CreateInstance/DestroyInstance aufrufen. Wenn es ein Expert (.dll) wird, kann das DestroyInstance entfallen.
Eine Form-Instanz erhält man mit CreateDockableForm. Damit kann auch eine existierende Instanz wieder sichtbar gemacht werden.

Die Rückgabe bei GetFrameClass sollte natürlich die passende Klasse sein.

Delphi-Quellcode:
unit DockableFormUnit;

interface

uses
  System.IniFiles, System.Classes,
  Vcl.ActnList, Vcl.ComCtrls, Vcl.Forms, Vcl.ImgList, Vcl.Menus,
  ToolsAPI, DesignIntf, DockForm;

type
  TMyDockableForm = class(TInterfacedPersistent, INTACustomDockableForm)
  private
  class var
    FInstance: TMyDockableForm;
  protected
    procedure CustomizePopupMenu(PopupMenu: TPopupMenu);
    procedure CustomizeToolBar(ToolBar: TToolBar);
    function EditAction(Action: TEditAction): Boolean;
    procedure FrameCreated(AFrame: TCustomFrame);
    function GetCaption: string;
    function GetEditState: TEditState;
    function GetFrameClass: TCustomFrameClass;
    function GetIdentifier: string;
    function GetMenuActionList: TCustomActionList;
    function GetMenuImageList: TCustomImageList;
    function GetToolBarActionList: TCustomActionList;
    function GetToolBarImageList: TCustomImageList;
    procedure LoadWindowState(Desktop: TCustomIniFile; const Section: string);
    procedure SaveWindowState(Desktop: TCustomIniFile; const Section: string; IsProject: Boolean);
  public
    class procedure CreateInstance;
    class procedure DestroyInstance;
    class function CreateDockableForm: TDockableForm;
  end;

implementation

class procedure TMyDockableForm.CreateInstance;
begin
  FInstance := TMyDockableForm.Create;
  (BorlandIDEServices as INTAServices).RegisterDockableForm(FInstance);
end;

class procedure TMyDockableForm.DestroyInstance;
begin
  (BorlandIDEServices as INTAServices).UnregisterDockableForm(FInstance);
  FInstance.Free;
end;

class function TMyDockableForm.CreateDockableForm: TDockableForm;
begin
  Result := (BorlandIDEServices as INTAServices).CreateDockableForm(FInstance) as TDockableForm;
end;

procedure TMyDockableForm.CustomizePopupMenu(PopupMenu: TPopupMenu);
begin
end;

procedure TMyDockableForm.CustomizeToolBar(ToolBar: TToolBar);
begin
end;

function TMyDockableForm.EditAction(Action: TEditAction): Boolean;
begin
  Result := False;
end;

procedure TMyDockableForm.FrameCreated(AFrame: TCustomFrame);
begin
end;

function TMyDockableForm.GetCaption: string;
begin
  Result := 'My Dockable Form';
end;

function TMyDockableForm.GetEditState: TEditState;
begin
  Result := [];
end;

function TMyDockableForm.GetFrameClass: TCustomFrameClass;
begin
  Result := TFrame;
end;

function TMyDockableForm.GetIdentifier: string;
begin
  Result := 'MyDockableForm';
end;

function TMyDockableForm.GetMenuActionList: TCustomActionList;
begin
  Result := nil;
end;

function TMyDockableForm.GetMenuImageList: TCustomImageList;
begin
  Result := nil;
end;

function TMyDockableForm.GetToolBarActionList: TCustomActionList;
begin
  Result := nil;
end;

function TMyDockableForm.GetToolBarImageList: TCustomImageList;
begin
  Result := nil;
end;

procedure TMyDockableForm.LoadWindowState(Desktop: TCustomIniFile; const Section: string);
begin
end;

procedure TMyDockableForm.SaveWindowState(Desktop: TCustomIniFile; const Section: string; IsProject: Boolean);
begin
end;

end.
Edit: Die Parent-Klasse muss natürlich TInterfacedPersistent sein, wenn man davon eine Instanzvariable füllt.

Solange die Klasse keine weitere Funktion erfüllt, könnte man die Instanzvariable als INTACustomDockableForm deklarieren oder sogar ganz darauf verzichten.
Allerdings sollte bei einem Designtime-Package die Möglichkeit in Betracht gezogen werden, dass es im laufenden Betrieb entladen wird und das Unregister dann besser durchgeführt werden sollte.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (16. Mär 2024 um 14:51 Uhr) Grund: ParentClass muss TInterfacedPersistent sein
  Mit Zitat antworten Zitat