AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Observer - Exception nach schliessen wenn abgeleitetes Form
Thema durchsuchen
Ansicht
Themen-Optionen

Observer - Exception nach schliessen wenn abgeleitetes Form

Ein Thema von RedOne · begonnen am 20. Jul 2010 · letzter Beitrag vom 20. Jul 2010
Antwort Antwort
RedOne

Registriert seit: 2. Jun 2008
71 Beiträge
 
Delphi XE2 Professional
 
#1

Observer - Exception nach schliessen wenn abgeleitetes Form

  Alt 20. Jul 2010, 16:00
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:
  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};
Herzlichen Dank
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Observer - Exception nach schliessen wenn abgeleitetes Form

  Alt 20. Jul 2010, 16:10
Wann wird GetSource freigegeben und wann greifen die FormBase-Nachfahren darauf zu?

Könnte es an der Reihenfolge der finalization Abschnitte liegen?
Uwe Raabe
  Mit Zitat antworten Zitat
RedOne

Registriert seit: 2. Jun 2008
71 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Observer - Exception nach schliessen wenn abgeleitetes Form

  Alt 20. Jul 2010, 16:50
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...
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Observer - Exception nach schliessen wenn abgeleitetes Form

  Alt 20. Jul 2010, 16:53
Dort wird auch eine TInterfaceList erzeugt, welche dann nie freigegeben wird
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Observer - Exception nach schliessen wenn abgeleitetes Form

  Alt 20. Jul 2010, 17:00
Ändere mal dies
FObservers: TInterfaceList;
in das
FObservers: IInterfaceList;
Dann erübrigt sich auch das Problem mit der fehlenden Freigabe...
Uwe Raabe
  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 22:24 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