![]() |
Observer - Exception nach schliessen wenn abgeleitetes Form
Hallo zusammen
Ich habe ein bisher einwandfrei laufendes Observerpattern das mir nun nicht mehr wie gewollt will. Sobald ich die Anwendung schliesse wird nach allen Methoden, also auch nach der Methode Application.Run die Exception Zugriffsverletzung bei Adresse xy geworfen. Den Fehler habe ich wie folgt evaluiert: Das MainForm, ebenfalls ein Objekt, trägt sich beim Observer ein. Funktioniert gut, solange dieses Formular von TForm abgeleitet wird. Sobald eine Ableitung von einem eigenen Formular existiert, stirbt Delphi beim Beenden (sofern er natürlich beim Observer registriert wurde). Im Anhang einige Codefragmente.
Delphi-Quellcode:
Herzlichen Dank
IServerState = interface( IInterface )
['{C5D0851E-E9CD-422B-8E34-BA2C8E53E729}'] procedure ServerStatusChanged( _state: Boolean ); end; //TFormMain = class( TForm, IServerState ) -> Funktioniert TFormMain = class( TFormBase, IServerState ) procedure FormCreate( _sender: TObject ); procedure FormClose( _sender: TObject; var _action: TCloseAction ); procedure ServerStatusChanged( _state: Boolean ); end; {------------------------------------------------ TFormMain } procedure TFormMain.FormCreate( _sender: TObject ); begin Inherited; GetSource.RegisterObserver( Self ); //Registriere sich selbst. GetSource ist Singleton end {FormCreate}; procedure TFormMain.FormClose( _sender: TObject; var _action: TCloseAction ); begin GetSource.RemoveObserver( Self ); inherited; end; procedure TFormMain.ServerStatusChanged( _state: Boolean ); begin //Wird benachrichtigt und tut was end; {------------------------------------------------ TFormBase } TFormBase = class( TForm ) BevelTop: TBevel; ImageBackground: TImage; ImageHead: TImage; LabelTitel: TLabel; ImageListEdit: TImageList; procedure FormCreate( _sender: TObject ); procedure FormClose( _sender: TObject; var _action: TCloseAction ); end; (* In FormCreate und FormClose werden Registryeinträge getätigt. Inherited wird bei beiden aufgerufen *) {------------------------------------------------ TSource } TSource = class( TInterfacedObject ) private FObservers: TInterfaceList; public procedure RegisterObserver( _obs: IServerState ); procedure RemoveObserver( _obs: IServerState ); end; procedure TSource.RegisterObserver( _obs: IServerState ); begin if not Assigned( FObservers ) then begin FObservers:= TInterfaceList.Create; end; FObservers.Add( _obs ); end {RegisterObserver}; procedure TSource.RemoveObserver( _obs: IServerState ); begin if Assigned( FObservers ) then begin FObservers.Remove( _obs ); if FObservers.Count = 0 then begin FObservers:= nil; end; end; end {RemoveObserver}; |
AW: Observer - Exception nach schliessen wenn abgeleitetes Form
Wann wird GetSource freigegeben und wann greifen die FormBase-Nachfahren darauf zu?
Könnte es an der Reihenfolge der finalization Abschnitte liegen? |
AW: Observer - Exception nach schliessen wenn abgeleitetes Form
Ich denke nicht dass es an der Reihenfolge,liegt ansonsten würde es auch nicht bei der TForm-abgeleiteten Variante funktionieren.
Das TFormBase habe ich soweit geleert, das keine Funktionalität auf dem Formular vorhanden ist. TFormBase ist nur ein leeres Formular mit ein paar Labels und Bildern und trotzdem verkraftet er dies immer noch nicht. Es funktioniert übrigens nicht mehr sobald die funktion registriereObserver aufgerufen wurde, auch wenn in dieser gar nichts gemacht wird... |
AW: Observer - Exception nach schliessen wenn abgeleitetes Form
Dort wird auch eine TInterfaceList erzeugt, welche dann nie freigegeben wird
|
AW: Observer - Exception nach schliessen wenn abgeleitetes Form
Ändere mal dies
Delphi-Quellcode:
FObservers: TInterfaceList;
in das
Delphi-Quellcode:
FObservers: IInterfaceList;
Dann erübrigt sich auch das Problem mit der fehlenden Freigabe... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 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 by Thomas Breitkreuz