- PR -

オブジェクトが特定のプロパティを持っているか調べる方法

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-10-02 06:11
 フォアグラウンドを塗って(書いて)から、バックグラウンドなんか塗らない(塗れない)。まず、バックグラウンドの塗ってから、フォアグラウンドを描きますよね。
であれば、Drawをオーバーライドして、背景色(ブラシ)を指定するようにすれば?


 線や絵であっても、フォアグラウンドの下に同じ幅のバックグラウンドがある、フォアグラウンドで全く覆われてしまうバックグラウンドがある、と考えれば、トップのオブジェクトにバックグラウンドの指定があってもいいのでは?


 透明色が、下地の色でなければならない、ことはないでしょう。下地としてブラシでグラデーションが描いてあって、その上にかぶせて表示する、とかでもいいのでは?
_____________________________________________________________________________
□ Posted by Jitta on 2005/10/02
じったのノート
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-02 14:05
どうも、私の説明がそうとうへたで、真意が伝わっていないようです。

「バックグラウンドを塗るクラス」の表現は不適切でした。

「バックグラウンドカラーを変更するツール」とでもすれば解りよいでしょうか。

IPaintableなクラスはもちろんすべての描画を自分自身のみで行います。

IPaintableなクラスのコンテナはIPaintableなクラスのコレクションを持ち
(以下簡単のためIPaintableCollectionとします)
多くのツールからの依頼を受けてIPaintableなクラスのプロパティを変更します。

「バックグラウンドカラーを変更するツール」は
PaintableCollectionに対してのみ処理の要求をします。

PaintableCollectionはマウスポジションからIPaintableなクラスにヒットテストを
実行し、IPaintableなクラスがバックグラウンドカラーを設定できるか判断し
バックグラウンドカラーを設定できるクラスであれば、マウスカーソルの形状を変更し
さらにクリックされれば実際にそのクラスのバックグラウンドカラーを変更する

と、こういったイメージで考えていただければと思います。

ツールはバックグラウンドカラーの変更ツールだけでなく多数存在します。

そこで、ヒットテストを実行する場合PaintableCollectionは、
インタフェースを確認することで要求を受け入れるかどうかの判断をするようにしました。


最初はどのクラスを継承しているかでの判断でやっていたわけですが
インタフェースを確認するという方法に切り替えることで
非常に柔軟性を持たせられるようになりました。

ツールはPaintableCollectionに対して、必要なインタフェースのセットをTypeオブジェクトの配列として渡してあげるだけでよくなりました。

それぞれのツールはPaintableCollectionがどんなクラスを持っているかまったく知る必要がなくなりました。

IPaintableはPaintメソッド(Drawでもいいです)だけあればよいという
もっともシンプルな理想形を維持できました。

その解決策は実は先日作成したInterfaceCheckだったのです。

非常によい形で問題解決ができたと喜んでいるところです。

いろいろ、ありがとうございました。

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-02 14:32
引用:

ツールはPaintableCollectionに対して、必要なインタフェースのセットをTypeオブジェクトの配列として渡してあげるだけでよくなりました。


ここが具体的にどうなったのか気になるところですが…^^;
私の方も勉強させて頂きました。
ありがとうございます。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-02 15:15
囚人さん、どうもです。

引用:

ここが具体的にどうなったのか気になるところですが…^^;



えーと、こんな感じです。

まず最初にツールはPaintableCollectionにリクエストを投げます。

私はIBackGroudABleなクラスにサービスを提供したいと。

[code]
PaintableCollection.Request(GetType(IBackGroudABle))
[code]

PaintableCollectionはタイプオブジェクトかまたはタイプオブジェクトの配列を受け付けます。


次にユーザーがマウスを動かすとPaintableCollectionはヒットテストを実施します
その過程で
コード:
  For Each t_Type In Types 
    If t_Type.IsAssignableFrom(obj.GetType) Then 
      Return True 
    End If 
  Next 


を実施します。
For Each t_Type In Types のTypes は先ほどツールから受け取ったタイプオブジェクトの配列です。
(配列でなくタイプオブジェクトそのものを受け取った場合も内部では配列で持っています)

こうすることで、ツールがIPaintableのクラスを知る必要がなくなりました。

ただ、IsAssignableFromって、少し私の持つイメージとは違うんですが
いまのところうまく機能するようです。

Type Of obj Is ○○

の○○を変数化したいだけなので、もっといい方法があるのかもしれません。

ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-02 16:30
またまた舌足らずだったみたいなので補足します。(蛇足かもしれません)

引用:

ただ、IsAssignableFromって、少し私の持つイメージとは違うんですが


たとえば、IBackGroudABleをインプリメントしたクラスを継承した子クラスが
私はIBackGroudABleをサポートしませんよという場合(今の所は起きていないですが)
どんなことになるのかよくわかっていません。

今のところはそういうことはない(ように作っている)ということで
まずは気にしないでおこうと思っていますが
いずれ時間をとれたときにしっかり検証してみようと考えています。

蛇足の説明でした。失礼しました。

[ メッセージ編集済み 編集者: ジブ 編集日時 2005-10-02 16:31 ]

スキルアップ/キャリアアップ(JOB@IT)