掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
他のオブジェクトの変更を知りたい (ID:22257)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> TSendHogeで表示を管理する場合どうしてもTGetHogeが増えるたびにTSendHogeの独立性が失われていきます。 > データと表示を分離したかったのでイメージしたものと違いました。 あまりに読み飛ばしすぎ。 TSendHogeは、TGetHogeを実態を知らなくても動作するサンプルが書いてある。 これこそオブジェクト指向の真骨頂。 <Unit1> お互いに密接に関係する、TSendHogeとTGetHoge TGetHogeは、抽象クラス。 <Unit2> uses Unit1 TGetHogeを継承した実際の動作を記述するTGetHogeAとTGetHogeB Unit1のTSendHogeは、TGetHogeAとTGetHogeBを知る必要はない書き方ができる。 まさに表示とデータの分離に他ならないし、独立性も高い。 しかもTSendHogeは、表示管理はしていない。 表示機能を持ったTGetHogeを管理しているだけ。 したがって、Unit1は、Unit2をusesする必要はない。 > ただ、すっきりしないところがあります。 > Form1 > - SendHoge1 > - GetHoge1 > Form2 > - GetHoge2 > があったとすると、From2.pasはForm1.pasに対してusesするのはわかります。 > TSendHogeで表示を管理する場合、Form1.pasはForm2.pasをusesしなくてはいけません。 > TQueryなどの場合Form1->Form2の参照はありません。 TQueryはDBTablesですから、必要ありません。 「SendHoge1が、GetHoge2を知っている」言い換えるなら 「SendHoge1が、GetHoge2のときに条件分岐する記述がある」から、 「Form1.pasはForm2.pasをuses」なのです。 > というのを見て昨日Helpを見ていてTWinControl.Broadcastを見つけました。 > (Application.Components[i] as TControl).Perform(WM_SendMsg, 0, 0); > を > Msg :TMessege; > Msg.Msg = WM_SendMsg; > (Application.Components[i] as TWinControl).Broadcast(Msg); > 見たいに変更したらTGetHogeで変更を検知できました。(Delphiが今使えないので間違っているかもしれません) あながち間違いではありませんが、Application.Components[i] = TComponent であり、 必ずしも TWinControlではありません。 ちなみに、Performは、指定したコントロールに送るものであり、その配下の コントロールにはメッセージを送りません。 なお、Application.Components には、メインフォームと、自動生成される フォームしかなく、フォーム上にあるコンポーネントは含まれていません。 逆に、Broadcastは、Broadcastした相手の配下のコンポーネント全てにも メッセージを送ります。 Application.Componentsにメインフォームが含まれていることから、 メインフォームの全てのコンポーネントにメッセージが通知されるのです。 また、Windows を介したメッセージ処理ではないので、TWinControlのような ウインドウハンドルを保持していないコントロール(TLabel等)でもメッセージ 処理可能なわけです。 TPaintBoxとかTImageとかで、MouseMoveイベントが発生するのも、メッセージ 処理機構をTControlの段階で実装してあるからでしょう。 SendMessage を使うのは、Windowsを介したメッセージ処理であるため、 ウインドウハンドルを持たないコンポーネントは処理してくれません。 ただ、動けばよしということであれば、Broadcastも一つの解決策でしょうね。 個人的には、メッセージは処理の流れが見えない分、不具合が出たときに解決が 難しくなりがちなので、きっちり設計し、保守しやすくしておきたいです。 三日経てば、自分のソースも他人のモノみたいに見える自分が言うのもアレですが。。。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.