- - PR -
VB6でのイベント発生元オブジェクトの取得
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-09-02 10:11
いつもお世話になっております。
VB.NETやVB2005ではイベントプロシージャの第一引数に Sender という引数があって その Sender がイベント発生元のオブジェクトそのものですが、VB6でも同じように イベントプロシージャ内でそのイベントの発生元オブジェクトを特定することって できるのでしょうか? よろしくお願いします。 | ||||||||||||
|
投稿日時: 2008-09-02 10:35
VB6ではSenderに当たるものはありません。 そもそもイベントプロシージャ自体がオブジェクトと1対1のため、 イベント発生源は常に一つです。ただし、コントロール配列の場合だけは、 同一クラスの複数オブジェクトとイベントプロシージャが関連付けられるため、 indexで識別できるようになっています。 | ||||||||||||
|
投稿日時: 2008-09-02 11:03
よねKENさん、ひろ@yaさん
返答ありがとうございます。 確かにVB.NETやVB2005ではイベントプロシージャの後ろにHandleで 複数のオブジェクトを割り当てる事ができるのに対してVB6では そのようなことができないのでイベントプロシージャとオブジェクト は1対1であることは理解できます。 もう少し具体的に何をしたいのかをご説明します。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Call MessageBox.Show(sender.text) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Call MessageBox.Show(sender.text) End Sub VB.NETやVB2005ではこのような書き方で、それぞれプロシージャ内に書かれている コードは全く同一で、異なる実行結果(Button1のテキスト、Button2のテキストが それぞれ表示される)が得られますがVB6の場合 Private Sub Command1_Click() Call MsgBox(Command1.Caption) End Sub Private Sub Command2_Click() Call MsgBox(Command2.Caption) End Sub 上記のようにイベントプロシージャ内でそれぞれのオブジェクト (Command1、Command2)をコードで指定する必要があると思います。 これをVB.NETやVB2005のように、プロシージャ内に書かれているコードを 全く同一にしたかったのです。 用途としては、似たようなプロシージャが何十個とあって、それぞれの イベントプロシージャ内のコードを同一にする事でヒューマンエラーを 防ぐためです。 分かりにくくてすいません。 | ||||||||||||
|
投稿日時: 2008-09-02 11:11
以下のような感じで該当のオブジェクトを受け取る関数を用意して、 そこで共通の処理を書けばよいかと思います。 呼び出し側では、Command1、Command2などのオブジェクトそのものを 受け渡す処理は必要ですが、それ以外の重複コードはなくなります。
#環境がないので、うろ覚えで書いてます。微妙に間違っている部分があるかもしれませんので、 #その辺は適宜読み替えてください。
まったく同一にはできませんが、上記のようにオブジェクトを引き渡す処理 だけにすることはできます。 | ||||||||||||
|
投稿日時: 2008-09-02 16:47
デコレータみたいなクラスを作れば一応行けますね。 下準備さえしてしまえばイベントに関しては呼び出しを書く必要もありません。 イベント自体が統合されるようなイメージになりますが (実際は違いますが) こちらの方がサンプルを見る限り使い勝手がいいような気も...。
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2008-09-02 17:46
内容にもよりますが、ご提示されているサンプルであればコントロール配列が使用できると思います。
こういうことではないのかな・・・? | ||||||||||||
|
投稿日時: 2008-09-03 10:33
私の提示した方法よりもこちらの方法のほうがスマートでよりよいですね。 ただし、コントロール配列には適用できなかったりと難があったはず(泣) | ||||||||||||
|
投稿日時: 2008-09-03 10:49
その場合は素直にコントロール配列を使えば良いのではないでしょうか? (私は嫌いなのでコンテナ コントロール化します) それかコントロール配列ライクな構造を考えれば良いと思います。(個人的にはコレクション系統の方が好き) コントロール配列についてはよねKENさんご本人が最初に説明をした上で回答していらした (私には 「別解」 という流れに見えていました) ので、コントロール配列以外の方法を求められているのかなと思っていました... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |