DOBON.NET DOBON.NETプログラミング掲示板過去ログ

イベントプロシジャの第一引き数 senderに関して

環境/言語:[XP、Framework 2]
分類:[.NET]

次のようなイベントプロシジャがある場合、
Private Sub Obj_MouseDown(ByVal sender As Object,
ByVal e As System.Windows.Forms.MouseEventArgs)
Handles ObjA.MouseDown, picDownload.MouseDown, ObjB.MouseDown

ObjA、ObjBのどちらのMouseDownイベントかを sender から知る手段は
あるでしょうか?

デザイン時に自動生成されるそれぞれ(ObjAおよびObjB)のイベントプロシジャを
そのまま使えばいいのですが、ObjA、ObjB...のオブジェクトの数がかなり
多いために、できればひとつだけのイベントプロシジャですべてのオブジェクトの
個別イベントを受けたいと思っています。
よろしくお願いします。
> ObjA、ObjBのどちらのMouseDownイベントかを sender から知る手段は
> あるでしょうか?

TypeOf演算子について調べてみてください。
■No17961に返信(まどかさんの記事)
> TypeOf演算子について調べてみてください。

インスタンス比較なので、TypeOf 演算子ではなく Is 演算子だと思います。
> インスタンス比較なので、TypeOf 演算子ではなく Is 演算子だと思います。

今気がついた。。。(大汗
#誰も突っ込んでいないことを祈っていると、、、

というわけでTypeOfは忘れてください。>VINさん
> というわけでTypeOfは忘れてください。>VINさん

はい、完全に忘れました(^^;

じゃんぬねっと様
Is演算子で実装されている複数のオブジェクトとループで
比較すると言うことでしょうか?

実はNameプロパティを使って目的の処理が達成できたのですが、
このNameでオブジェクトを判別するのは不適切でしょうか?
■No17966に返信(VINさんの記事)
> Is演算子で実装されている複数のオブジェクトとループで比較すると言うことでしょうか?

For Each で比較しても別に構いませんが、別にループで比較しなくても良いでしょう。

> 実はNameプロパティを使って目的の処理が達成できたのですが、
> このNameでオブジェクトを判別するのは不適切でしょうか?

はい、不適切です。

Name プロパティは厳密なオブジェクト名ではありません。
実際、プログラムから改変できます。

インスタンスが同一かを比較するのが、もっとも素直です。
>>Is演算子で実装されている複数のオブジェクトとループで比較すると言うことでしょうか?
>
> For Each で比較しても別に構いませんが、別にループで比較しなくても良いでしょう。

senderの判断なので単なる分岐だと思ったが
「ループ」「For Each」が自然に会話されているので謎だ。(^^;

まぁこれだと思うけど。
「コントロールの配列を作る」
http://dobon.net/vb/dotnet/control/buttonarray.html
#これにしろということではありません。
■No17970に返信(まどかさんの記事)
> senderの判断なので単なる分岐だと思ったが
> 「ループ」「For Each」が自然に会話されているので謎だ。(^^;

そういえば、Handles 句に追加されているだけであれば、
動的にコントロールを生成するどうこうじゃないので、ループというのはおかしいですね。

動的に作成して、ControlCollection に入れているのかと思いましたよ。;)
> 動的にコントロールを生成するどうこうじゃないので、ループというのはおかしいですね。

>まどかさん、じゃんぬねっとさん

質問している自分がおかしな方向へ話を持って行ってしまいました(^^;
もうしわけありません。
おっしゃるとおりループの出る幕はないです。

分岐が正しいのですが、
Select Caseで Is演算子を利用するような方法がありましたっけ?

Is演算子は If で使うしか理解していないのですが、できればIfはつかいたくないもので。

ご存じでしたらご教示ください。
よろしくお願いします。
■No17980に返信(VINさんの記事)
> 分岐が正しいのですが、
> Select Caseで Is演算子を利用するような方法がありましたっけ?
> Is演算子は If で使うしか理解していないのですが、できればIfはつかいたくないもので。

別にどちらでも、やっていることは変わりません...

Select Case True
    Case sender Is ObjA
        MessageBox.Show("ObjA")
    Case sender Is ObjB
        MessageBox.Show("ObjB")
    Case sender Is ObjC
        MessageBox.Show("ObjC")
End Select
> Select Case True
> Case sender Is ObjA
> MessageBox.Show("ObjA")
> Case sender Is ObjB
> MessageBox.Show("ObjB")
> Case sender Is ObjC
> MessageBox.Show("ObjC")
> End Select

私はよほどパフォーマンスが関わらない限り、可読性がいいので
Case A > B
Case A < B
Case A = B
と書く人間だったりします。

ループの件ですが、その方法として、>個別の処理を完全に無視して
Dim TargetObjects() As Object = New Object() {ObjA, ObjB, ObjC}
とすればループできます。
こういう見方をちょっと変えるというのは
ピンポイントの部分で可読性が向上したり処理が簡潔になったりするので
表現の選択肢としてすぐに思いつくようになっておくとよいと思います。
#まぁ仕様が極端に隠れるとまずいけど。。。
Select CaseのCaseの書き方、恥ずかしながら使ったことがなくて知りませんでした。
どうもありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板