AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Exception beim Schließen der IDE, wenn meine Erweiterung vorher aktiv war
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von mattia72 · begonnen am 25. Feb 2024 · letzter Beitrag vom 20. Mär 2024
 
Benutzerbild von Uwe Raabe
Uwe Raabe

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

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

  Alt 15. Mär 2024, 23: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 13:51 Uhr) Grund: ParentClass muss TInterfacedPersistent sein
  Mit Zitat antworten Zitat
 

 

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 22:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz