home *** CD-ROM | disk | FTP | other *** search
- {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- (c) TechInsite Pty. Ltd.
- PO Box 429, Abbotsford, Melbourne. 3067 Australia
- Phone: +61 3 9419 6456
- Fax: +61 3 9419 1682
- Web: www.techinsite.com.au
- EMail: peter_hinrichsen@techinsite.com.au
-
- Created: October 1999
-
- Notes: The SubjectAbstract and ObserverAbstract classes
-
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
- unit FObserver_Abstract;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls,
- Forms, Dialogs, StdCtrls
- ;
-
- type
-
- // Forward dec of ObserverAbstract
- //--------------------------------------------------------
- TFormObserverAbstract = class ;
-
- // SubjectAbstract - Knows about interested observers
- //--------------------------------------------------------
- TSubjectAbstract = class( TObject )
- private
- // A TList of pointers into the interested observers
- FObservers : TList ;
- protected
- public
- Constructor Create ;
- Destructor Destroy ; override ;
- // Attach an observer to the subject
- procedure AttachObserver(Sender :TFormObserverAbstract);
- // Detach an observer from the subject
- Procedure DetachObserver(Sender :TFormObserverAbstract);
- // Update all attache observers
- Procedure UpdateObservers ;
- end ;
-
- // ObserverAbstract - Knows about a subject
- //--------------------------------------------------------
- TFormObserverAbstract = class(TForm)
- // Free the observer when closed
- procedure FormClose(Sender: TObject;
- var Action: TCloseAction);
- // Detach from the subject when destroyed
- procedure FormDestroy(Sender: TObject);
- // Read the subject when the form shows
- procedure FormShow(Sender: TObject);
- private
- // A pointer into the shared subject
- FSubject : TSubjectAbstract ;
- // Set FSubject, and attach the observer
- procedure SetSubject(const Value: TSubjectAbstract);
- protected
- public
- // Virtual Abstract read data - must be implemented in
- // descendants
- procedure DataToObserver ; virtual ; abstract ;
- // A pointer into the shared subject
- property Subject : TSubjectAbstract read FSubject
- write SetSubject ;
- end;
-
- implementation
-
- {$R *.DFM}
-
- // * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- // *
- // * TSubjectAbstract
- // *
- // * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- constructor TSubjectAbstract.Create;
- begin
- inherited ;
- // Create a TList to hold pointers to the
- // interested observers
- FObservers := TList.Create ;
- end;
-
- //----------------------------------------------------------
- destructor TSubjectAbstract.Destroy;
- begin
- // Free the list of observers
- FObservers.Free ;
- inherited ;
- end;
-
- // Attach an observer to this subject
- //----------------------------------------------------------
- procedure TSubjectAbstract.AttachObserver(Sender:
- TFormObserverAbstract);
- var
- i : integer ;
- begin
- // Scan the list of observers to confirm this one is not
- // already attached.
- i := FObservers.IndexOf( Sender ) ;
- Assert( i = -1, 'Observer already attached' ) ;
-
- // Add the observer to the list
- FObservers.Add( Sender ) ;
-
- end;
-
- // Detach an observer
- //----------------------------------------------------------
- procedure TSubjectAbstract.DetachObserver(Sender:
- TFormObserverAbstract);
- var
- i : integer ;
- begin
- // Locate the observer in the list
- i := FObservers.IndexOf( Sender ) ;
- Assert( i <> -1, 'Observer not attached' ) ;
- // Delete it from the list
- FObservers.Delete( i ) ;
- end;
-
- // Update all the observers that are attached to
- // this subject
- //----------------------------------------------------------
- procedure TSubjectAbstract.UpdateObservers;
- var
- i : integer ;
- begin
- // Scan the list of observers and call the UpdateObserver
- // method on each one
- for i := 0 to FObservers.Count - 1 do
- if Assigned( FObservers[i] ) then
- TFormObserverAbstract( FObservers[i] ).DataToObserver ;
- end;
-
- // * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- // *
- // * TFormObserverAbstract
- // *
- // * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- procedure TFormObserverAbstract.FormShow(Sender: TObject);
- begin
- // Read from subject to observer when the form is shown
- DataToObserver ;
- end;
-
- //----------------------------------------------------------
- procedure TFormObserverAbstract.FormClose(Sender: TObject;
- var Action: TCloseAction);
- begin
- // Free the form on close
- Action := caFree ;
- end;
-
- //----------------------------------------------------------
- procedure TFormObserverAbstract.FormDestroy(Sender: TObject);
- begin
- // Detach the observer from the subject
- // (if the subject has not been destroyed first)
- if subject <> nil then
- Subject.DetachObserver( self ) ;
- end;
-
- //----------------------------------------------------------
- procedure TFormObserverAbstract.SetSubject(const Value:
- TSubjectAbstract);
- begin
- // Save a pointer to the subject for later use
- FSubject := Value;
- // Attach this observer to the subject
- Subject.AttachObserver( self ) ;
- end;
-
- end.
-
-