Der Ablauf ist doch folgender
- Erstelle Frame
- Habe interface-basierte Referenz auf das Frame-Objekt in einem Objekt "X"
- Zerstöre Frame
- Habe weiterhin interface-basierte Referenz auf das Frame-Objekt
- Zerstöre Objekt "X"
- Interface-basierte Referenz wird genullt, versucht Referenzzähler auf den mittlerweile zerstörten Frame zu verringern (also die Methode _Release() aufrufen)
Aus meiner Sicht liegt hier des Pudels Kern. Ich habe dein Forms.Main wie folgt geändert:
Delphi-Quellcode:
unit Forms.Main;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
uInterface,
Frames.MyFrame,
Vcl.ExtCtrls;
type
TMainForm =
class(TForm)
pnl1: TPanel;
private
FMyFrame: IMyInterface;
public
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
{ Public-Deklarationen }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
constructor TMainForm.Create(AOwner: TComponent);
begin
inherited;
FMyFrame := TMyFrame.Create(Self);
TMyFrame(FMyFrame).Parent := pnl1;
TMyFrame(FMyFrame).Align := alClient;
end;
destructor TMainForm.Destroy;
begin
FMyFrame :=
nil;
inherited;
end;
end.
Dadurch sollte alles korrekt abgebaut werden.
Bei deiner Variante bleibt die Referenz im Interface stehen, er versucht das dazugehörige Objekt abzubauen, das es nicht mehr gibt, und die
Exception kommt.