掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
通知先が2カ所以上あるような複数イベントの処理 (ID:13652)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
以前にhttp://www.borland.co.jp/cppbuilder/papers/vctocb/chap45.html をdelphiに移植したTObserver/TObservableコンポーネントを作ったんですが使えませんか ちょっと長いですが以下Observer.pas -------------- unit Observer; interface uses SysUtils, Classes, Contnrs; type TUpdateEvent = procedure(Sender, Arg: TObject) of object; TObserver = class; TObservable = class(TComponent) private FObservers: TComponentList; FChanged: Boolean; function GetObservers(Index: Integer): TObserver; protected procedure AddObserver(Value: TObserver); procedure RemoveObserver(Value: TObserver); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Notify(Arg : TObject); procedure Changed(State: Boolean = True); function HasChanged: Boolean; property Observers[Index: Integer]: TObserver read GetObservers; end; TObserver = class(TComponent) private { Private 宣言 } FObservable: TObservable; FOnUpdate: TUpdateEvent; procedure SetObservable(const Value: TObservable); protected { Protected 宣言 } procedure DoUpdate(Arg : TObject); public { Public 宣言 } published { Published 宣言 } property Observable: TObservable read FObservable write SetObservable; property OnUpdate:TUpdateEvent read FOnUpdate write FOnUpdate; end; procedure Register; implementation (** コンポーネント登録手続き **) procedure Register; begin RegisterComponents('Samples', [TObserver, TObservable]); end; { TObservable } procedure TObservable.AddObserver(Value: TObserver); begin if FObservers.IndexOf(Value) < 0 then FObservers.Add(Value); end; procedure TObservable.Changed(State: Boolean = True); begin FChanged := State; end; constructor TObservable.Create(AOwner: TComponent); begin inherited; FObservers := TComponentList.Create(False); FChanged := False; end; destructor TObservable.Destroy; begin FObservers.Free; inherited; end; function TObservable.GetObservers(Index: Integer): TObserver; begin Result := FObservers[Index] as TObserver; end; function TObservable.HasChanged: Boolean; begin Result := FChanged; end; procedure TObservable.Notify(Arg : TObject); var i: Integer; begin if FChanged then begin for i := 0 to FObservers.Count -1 do (FObservers[i] as TObserver).DoUpdate(Arg); FChanged := False; end; end; procedure TObservable.RemoveObserver(Value: TObserver); begin FObservers.Extract(Value); end; { TObserver } procedure TObserver.DoUpdate(Arg : TObject); begin if Assigned(FOnUpdate) then FOnUpdate(Self, Arg); end; procedure TObserver.SetObservable(const Value: TObservable); begin if Assigned(FObservable) then FObservable.RemoveObserver(Self); FObservable := Value; if Assigned(FObservable) then begin FObservable.AddObserver(Self); FObservable.FreeNotification(Self); end; end; end. ----ここまで ClassAのメンバにTObservableをもって、Form1,2にTObserverを置きます Form1.ObserverのTObservableにClassAのObservableを登録して Updateイベントに通知されたら行う処理を書きます ClassAが変更されたら Observable1.Changed; Observable1.Notify(Self); と書くと登録されているObserverに変更通知が行きます このコンポーネントの利点はFreeNotificationを使ってるのでObserverの生死が自動的に管理されます。 なのでForm1の破棄時にObservableからObserverを削除する必要がありません
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.