掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
他のオブジェクトの変更を知りたい (ID:22252)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
こちらも長文失礼。 > そこでTQueryを考えるとTDBGridで表示している内容をTQueryでは管理していないので > 何らかの方法でTQueryの更新をTDBGridで検知している考えました。 うろ覚えですが、TDataLink、TFieldDataLinkあたりのあまり表に出てこないクラスが、 各列のTFieldをリストだったか動的配列だったかで保持していて、イベントやら なにやらで通知を受け取っています。 お互いを取り持つ、中間管理職クラスががんばっておるのですよ。 > データを管理しているクラス(TSendHoge)があり、そのデータを表示するクラス (TGetHoge)を作る。 > TSendHogeで値の変更があれば、TGetHogeではそれを検知して表示を更新する。 > (略) > TSendHoge(1)-(*)TGetHogeの関係のクラスを作成したいと思っていました。 こうなると、TSendHogeとTGetHogeは、お互い結びつきが強いクラス関係ですね。 > 提示していただいたサンプルではTSendHoge側でTGetHogeを管理しないといけないため、 > TGetHogeのようなものを追加するたびにTSendHogeを修正しなくてはいけないと思いました。 オブジェクト指向で設計することで、このようなことはほとんどなくなると思います。 Fusaさんのレスにもありますが、TSendHoge側でTListやTObjectListにより、複数の TGetHogeを管理できるようにしておきます。 共通の親クラスTGetHogeから、 (1)グラフを表示するTGetHogeA (2)個人別のデータを表示するTGetHogeB を派生 TGetHoge.Update; virtual; abstract; TGetHogeA.Update; override; TGetHogeB.Update; override; 仮に、TListを使ってTGetHogeAやTGetHogeBを管理するとしても、 TGetHoge(List[i]).Update; と記述するだけで、派生したクラスがどんな動作をする クラスであっても、 その正しい動作をしてくれます。 TSendHogeが、TGetHogeAやTGetHogeBの中身を知る必要はありません。 (1)では、グラフの表示を変更するような動作を行い、 (2)では、データ表示しているGridやEditの内容を更新する動作を行う。 TQueryやTDBGridのような、中間管理職クラスをつくったとしても、変更を通知するため、 中間管理職クラスが、TGetHogeAやTGetHogeBを管理する必要があるでしょう。 TSendHoge(1)-(*)TGetHogeの関係のクラスである以上、誰か1のTSendHogeの変更を検出し 多のTGetHogeへ通知する必要があるんですから。 それなら、「検出する」ことと「通知する」ことは、TSendHogeにまかせてしまったほうが 楽でしょう? > >>procedure SetSendHoge(AValue: TSendHoge); > >>begin > >> //通常、このメソッドを継承し、必要なプロパティをコピります。 > >> //procedure Assign(Source: TPersistent); override; > >> SendHoge.Assign(AValue); > >> //Assignを継承しない場合は、プロパティ個別に更新 > >> SendHoge.Data := AValue.Data; > >>end; > > ここの部分でエラーが出てうまくいきませんでした。 > このメソッドを継承し、必要なプロパティをコピります。 > は何を指すのでしょうか くどくど説明してもあかんから、サンプル 自分が持っている変数をコピーすることね。 TSendHoge=class(TPersistent) //class(TObject)やclassのみでなければ、なんでもよし protected FData: String; public procedure Assign(Source: TPersistent); override; end; procedure TSendHoge.Assign(Source: TPersistent); begin inherited Assign(Source); //Source が TSendHogeか、継承先のクラスか判定 if Source is TSendHoge then begin //TSendHogeが持っている情報のみを複写 FData := TSendHoge(Source).FData; end; end; TSendHogeNext=class(TSendHoge) protected FDataOne: Integer; FDataTwo: Boolean; public procedure Assign(Source: TPersistent); override; end; procedure TSendHogeNext.Assign(Source: TPersistent); begin inherited Assign(Source); //Source が TSendHogeNextか、継承先のクラスか判定 if Source is TSendHogeNext then begin //TSendHogeNextが持っている情報のみを複写 FDataOne := TSendHogeNext(Source).FDataOne; FDataTwo := TSendHogeNext(Source).FDataTwo; end; end; こんなのを用意しておけば、Assignメソッド一発で済むって話。 procedure T〜〜.Copy(aXXX: TSendHoge); var sendHoge: TSendHoge; begin sendHoge := aXXX; //NG //コトある毎に、値を複写するためのコードを書かないといけない。 semdHoge.FData := aXXX.FData; end; ちなみに、エラーになったのは、「SendHoge」のインスタンスを Createしていないという、基本的なとこでしょうね。 > (宣言等細かいコトは省略) と明示しているのだから、そのまま使えるとはどこにも書いていないし。 だからクラスと通常の変数をきっちり分けて理解しておかないと、 エラーになった原因がわからなくなること請け合いです。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.