掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
他のオブジェクトの変更を知りたい (ID:22254)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
TSendHogeで管理するクラスの例 Fusaさんや、オレ負け犬デス さんのレスを参考に・・・ とりあえずコンパイルは通りますが、実用的にするには、改善が必要 type //forward宣言 TSendHoge=class; TGetHoge = class(TLabel) private FSendHoge: TSendHoge; //管理者 public constructor Create(aOwner: TComponent; aOwnerSendHoge: TSendHoge); reintroduce; virtual; destructor Destroy; override; //これがミソですか? procedure Assign(aPersistent: TPersistent); override; //実装は下位クラスで procedure View; virtual; abstract; protected //TSendHogeが変更されたときに呼び出される //通知受け取りメソッド procedure UpdateSendHoge; virtual; public //外部からは、基本的には参照のみでしょう property Sendhoge: TSendHoge read FSendHoge; end; TSendHoge = class(TControl) private FHogeList: TList; protected FData: String; //値 public constructor Create(aOwner: TComponent); override; destructor Destroy; override; protected //TGetHogeの追加削除 function AddGetHoge(aGetHoge: TGetHoge): Integer; function RemoveGetHoge(aGetHoge: TGetHoge): Boolean; //更新通知 procedure UpdateData; //管理アイテム function GetGetHoge(Index: Integer): TGetHoge; procedure SetGetHoge(Index: Integer; aHoge: TGetHoge); //プロパティ変更 procedure SetData(aData: String); public property Data: String read FData write SetData; property Items[Index: Integer]: TGetHoge read GetGetHoge write SetGetHoge; end; //implementation 部 { TGetHoge } constructor TGetHoge.Create(aOwner: TComponent; aOwnerSendHoge: TSendHoge); begin inherited Create(aOwner); FSendHoge := aOwnerSendHoge; //自身のインスタンスをオーナーTSendHogeに登録 FSendHoge.AddGetHoge(Self); //表示も更新するなら、ここでやるべきかも //View; end; destructor TGetHoge.Destroy; begin //親から参照を解除する if FSendHoge <> nil then FSendHoge.RemoveGetHoge(Self); inherited Destroy; end; //これがミソですか? procedure TGetHoge.Assign(aPersistent: TPersistent); begin inherited Assign(aPersistent); if aPersistent is TGetHoge then begin //特になしだから、メソッドもいらないですね(^^ゞ end; end; //TSendHogeが変更されたときに呼び出される //通知受け取りメソッド procedure TGetHoge.UpdateSendHoge; begin //表示更新のみであれば、これだけでいいのでしょう View; end; { TSendHoge } constructor TSendHoge.Create(aOwner: TComponent); begin inherited Create(aOwner); FHogeList := TList.Create; end; destructor TSendHoge.Destroy; begin FreeAndNil(FHogeList); inherited Destroy; end; //TGetHogeの追加削除 function TSendHoge.AddGetHoge(aGetHoge: TGetHoge): Integer; begin //同一インスタンスの複数追加は行わない Result := FHogeList.IndexOf(aGetHoge); if Result < 0 then begin FHogeList.Add(aGetHoge); Result := FHogeList.Count -1; end; end; function TSendHoge.RemoveGetHoge(aGetHoge: TGetHoge): Boolean; var iii: Integer; begin iii := FHogeList.IndexOf(aGetHoge); if iii >= 0 then begin FHogeList.Delete(iii); Result := True; end else begin Result := False; end; end; //更新通知 procedure TSendHoge.UpdateData; var iii: Integer; begin for iii := 0 to FHogeList.Count -1 do begin TGetHoge(FHogeList[iii]).UpdateSendHoge; end; end; //管理アイテム function TSendHoge.GetGetHoge(Index: Integer): TGetHoge; begin //Index外の例外発生がいやなら、ここでチェックする Result := TGetHoge(FHogeList[Index]); end; procedure TSendHoge.SetGetHoge(Index: Integer; aHoge: TGetHoge); var getHoge: TGetHoge; begin //エラーチェックは必須ですよ getHoge := GetGetHoge(Index); getHoge.Assign(aHoge); end; //プロパティ変更 procedure TSendHoge.SetData(aData: String); begin if FData <> aData then begin {変数値更新} FData := aData; {更新通知} UpdateData; end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.