掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
他のオブジェクトの変更を知りたい (ID:22258)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
頂いたものを少しいじっただけですが動くようになりました。 ありがとうございます。 色々わからないところがあり、調べるのに時間がかかってしまいました。 回答が遅くなり申し訳ありません。 > >TQueryはDBTablesですから、必要ありません。 なぜ、DBTablesは必要ないのか教えていただけないでしょうか。 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; 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; procedure Notification(AComponent: TComponent; Operation: TOperation); override; 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; type TGetHogeA = class(TGetHoge) public procedure View; override; end; type TGetHogeB = class(TGetHoge) public procedure View; override; end; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private 宣言 } FSetHoge: TSendHoge; FGetHoge1: TGetHogeA; FGetHoge2: TGetHogeB; public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} { 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; procedure TGetHoge.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if Operation = opRemove then begin //コンポーネントが破棄される //TComponentから継承されたクラスでないと発生しませんし、 //「THoge.Create(nil)」のように親を指定していない場合、発生しない(はず) if FSendHoge = AComponent then begin //参照解除しておかないと、存在しないインスタンスにアクセスし、 //アクセス違反になります。 FSendHoge := nil; end; end else begin //コンポーネントが生成される //あまり使ったことないです end; 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 //同一インスタンスの複数追加は行わない //IndexOfでAGetHogeの添字取得なければ -1 Result := FHogeList.IndexOf(aGetHoge); if Result < 0 then begin FHogeList.Add(aGetHoge); Result := FHogeList.Count -1; aGetHoge.FreeNotification(Self); 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; procedure TGetHogeA.View; begin if Assigned(FSendHoge) then begin Caption := 'A= ' + FSendHoge.Data; end; end; procedure TGetHogeB.View; begin if Assigned(FSendHoge) then begin Caption := 'B= ' + FSendHoge.Data; end; end; procedure TForm1.FormCreate(Sender: TObject); begin FSetHoge := TSendHoge.Create(Self); FSetHoge.SetData('aa'); FGetHoge1 := TGetHogeA.Create(Self,FSetHoge); FGetHoge2 := TGetHogeB.Create(Self,FSetHoge); FGetHoge1.Parent := Self; FGetHoge1.Top := 10; FGetHoge1.Left := 10; FGetHoge2.Parent := Self; FGetHoge2.Top := 10; FGetHoge2.Left := 100; FSetHoge.AddGetHoge(FGetHoge1); FSetHoge.AddGetHoge(FGetHoge2); end; procedure TForm1.FormDestroy(Sender: TObject); begin FGetHoge2.Free; FGetHoge1.Free; FSetHoge.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin FSetHoge.SetData(Edit1.Text); end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.