Index: VerpakkingsDefinitie/UI/ProductDetailScherm.pas =================================================================== diff -u -r606 -r622 --- VerpakkingsDefinitie/UI/ProductDetailScherm.pas (.../ProductDetailScherm.pas) (revision 606) +++ VerpakkingsDefinitie/UI/ProductDetailScherm.pas (.../ProductDetailScherm.pas) (revision 622) @@ -64,11 +64,11 @@ inherited Create(AOwner, Navigator, ApplicationContext); self.FProductsContextSubject := ProductsContextSubject; - self.FProductsContextSubjectObserver := TSubjectObserver.Create(self); + self.FProductsContextSubjectObserver := TSubjectObserver.Create(); self.FProductsContextSubjectObserver.OnChange := UpdateGuiProduct; self.FVerpakkingenContextSubject := VerpakkingContextSubject; - self.FVerpakkingenContextSubjectObserver := TSubjectObserver.Create(self); + self.FVerpakkingenContextSubjectObserver := TSubjectObserver.Create(); self.FVerpakkingenContextSubjectObserver.OnChange := UpdateGuiVerpakkingen; self.FProductsAgent := ProductsAgent; Index: VerpakkingsDefinitie/UI/GevondenProductenScherm.pas =================================================================== diff -u -r596 -r622 --- VerpakkingsDefinitie/UI/GevondenProductenScherm.pas (.../GevondenProductenScherm.pas) (revision 596) +++ VerpakkingsDefinitie/UI/GevondenProductenScherm.pas (.../GevondenProductenScherm.pas) (revision 622) @@ -39,7 +39,7 @@ begin inherited Create(AOwner, Navigator, ApplicationContext); self.FProductSubject := ProductSubject; - self.FSubjectObserver := TSubjectObserver.Create(self); + self.FSubjectObserver := TSubjectObserver.Create(); self.FSubjectObserver.OnChange := UpdateGui; self.FProductsAgent := ProductsAgent; end; Index: VerpakkingsDefinitie/UI/GebruikerScherm.pas =================================================================== diff -u -r593 -r622 --- VerpakkingsDefinitie/UI/GebruikerScherm.pas (.../GebruikerScherm.pas) (revision 593) +++ VerpakkingsDefinitie/UI/GebruikerScherm.pas (.../GebruikerScherm.pas) (revision 622) @@ -36,7 +36,7 @@ begin inherited Create(AOwner, Navigator, ApplicationContext); self.FGebruikerSubject := GebruikerSubject; - self.FGebruikerSubjectObserver := TSubjectObserver.Create(self); + self.FGebruikerSubjectObserver := TSubjectObserver.Create(); self.FGebruikerSubjectObserver.OnChange := UpdateGui; self.FUserAgent := UserAgent; end; FishEye: Tag 622 refers to a dead (removed) revision in file `VerpakkingsDefinitie/UI/ObserverPattern.pas'. FishEye: No comparison available. Pass `N' to diff? Index: VerpakkingsDefinitie/VerpakkingsDefinitie.dpr =================================================================== diff -u -r610 -r622 --- VerpakkingsDefinitie/VerpakkingsDefinitie.dpr (.../VerpakkingsDefinitie.dpr) (revision 610) +++ VerpakkingsDefinitie/VerpakkingsDefinitie.dpr (.../VerpakkingsDefinitie.dpr) (revision 622) @@ -11,7 +11,7 @@ ZoekProductenScherm in 'UI\ZoekProductenScherm.pas' {FormZoekProducten}, Util in 'UI\Util.pas', GebruikerScherm in 'UI\GebruikerScherm.pas' {FormGebruiker}, - ObserverPattern in 'UI\ObserverPattern.pas', + ObserverPattern in 'Other\ObserverPattern.pas', SelectService in 'WS\SelectService.pas', ProductsAgent in 'WS\ProductsAgent.pas', GevondenProductenScherm in 'UI\GevondenProductenScherm.pas' {FormGevondenProducten}, Index: VerpakkingsDefinitie/VerpakkingsDefinitie.dproj =================================================================== diff -u -r620 -r622 --- VerpakkingsDefinitie/VerpakkingsDefinitie.dproj (.../VerpakkingsDefinitie.dproj) (revision 620) +++ VerpakkingsDefinitie/VerpakkingsDefinitie.dproj (.../VerpakkingsDefinitie.dproj) (revision 622) @@ -123,7 +123,7 @@
FormGebruiker
dfm - + Index: VerpakkingsDefinitie/UI/VerpakkingDetailScherm.pas =================================================================== diff -u -r618 -r622 --- VerpakkingsDefinitie/UI/VerpakkingDetailScherm.pas (.../VerpakkingDetailScherm.pas) (revision 618) +++ VerpakkingsDefinitie/UI/VerpakkingDetailScherm.pas (.../VerpakkingDetailScherm.pas) (revision 622) @@ -89,7 +89,7 @@ FProductsAgent := ProductsAgent; // Observer self.FProductVerpakkingSubject := ProductVerpakkingSubject; - self.FProductVerpakkingSubjectObserver := TSubjectObserver.Create(self); + self.FProductVerpakkingSubjectObserver := TSubjectObserver.Create(); self.FProductVerpakkingSubjectObserver.OnChange := UpdateGui; end; Index: VerpakkingsDefinitie/Other/ObserverPattern.pas =================================================================== diff -u --- VerpakkingsDefinitie/Other/ObserverPattern.pas (revision 0) +++ VerpakkingsDefinitie/Other/ObserverPattern.pas (revision 622) @@ -0,0 +1,82 @@ +// Based on: https://sourcemaking.com/design_patterns/observer/delphi +unit ObserverPattern; + +interface + +uses + System.Classes; + +type + TSubjectObserver = class + private + FEnabled: Boolean; + FOnChange: TNotifyEvent; + protected + procedure Change(Subject: TObject); + public + constructor Create(); + property Enabled: Boolean read FEnabled write FEnabled; + property OnChange: TNotifyEvent read FOnChange write FOnChange; + end; + + TSubject = class + private + FObservers: TList; + protected + procedure Change; // Call this method to dispatch change + public + constructor Create(); + procedure RegisterObserver(Observer: TSubjectObserver); + procedure UnregisterObserver(Observer: TSubjectObserver); + end; + +implementation + +constructor TSubjectObserver.Create(); +begin + inherited Create(); + self.FEnabled := True; +end; + +procedure TSubjectObserver.Change(Subject: TObject); +begin + if Assigned(FOnChange) then + FOnChange(Subject); +end; + +constructor TSubject.Create(); +begin + inherited Create(); + FObservers := TList.Create(); +end; + +procedure TSubject.Change; +var + Obs: TSubjectObserver; + I: Integer; +begin + for I := 0 to FObservers.Count - 1 do + begin + Obs := FObservers[I]; + if Obs.Enabled then + Obs.Change(self); + end; +end; + +procedure TSubject.RegisterObserver(Observer: TSubjectObserver); +begin + if FObservers.IndexOf(Observer) = -1 then + begin + FObservers.Add(Observer); + // Update nieuwe observer + if Observer.Enabled then + Observer.Change(self); + end; +end; + +procedure TSubject.UnregisterObserver(Observer: TSubjectObserver); +begin + FObservers.Remove(Observer); +end; + +end.