- PR -

VB6でのイベント発生元オブジェクトの取得

投稿者投稿内容
とし
会議室デビュー日: 2005/09/28
投稿数: 11
投稿日時: 2008-09-02 10:11
いつもお世話になっております。

VB.NETやVB2005ではイベントプロシージャの第一引数に Sender という引数があって
その Sender がイベント発生元のオブジェクトそのものですが、VB6でも同じように
イベントプロシージャ内でそのイベントの発生元オブジェクトを特定することって
できるのでしょうか?

よろしくお願いします。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-09-02 10:35
引用:

としさんの書き込み (2008-09-02 10:11) より:
VB.NETやVB2005ではイベントプロシージャの第一引数に Sender という引数があって
その Sender がイベント発生元のオブジェクトそのものですが、VB6でも同じように
イベントプロシージャ内でそのイベントの発生元オブジェクトを特定することって
できるのでしょうか?



VB6ではSenderに当たるものはありません。
そもそもイベントプロシージャ自体がオブジェクトと1対1のため、
イベント発生源は常に一つです。ただし、コントロール配列の場合だけは、
同一クラスの複数オブジェクトとイベントプロシージャが関連付けられるため、
indexで識別できるようになっています。

とし
会議室デビュー日: 2005/09/28
投稿数: 11
投稿日時: 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のように、プロシージャ内に書かれているコードを
全く同一にしたかったのです。

用途としては、似たようなプロシージャが何十個とあって、それぞれの
イベントプロシージャ内のコードを同一にする事でヒューマンエラーを
防ぐためです。

分かりにくくてすいません。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-09-02 11:11
引用:

としさんの書き込み (2008-09-02 11:03) より:
Private Sub Command1_Click()
Call MsgBox(Command1.Caption)
End Sub

Private Sub Command2_Click()
Call MsgBox(Command2.Caption)
End Sub



以下のような感じで該当のオブジェクトを受け取る関数を用意して、
そこで共通の処理を書けばよいかと思います。
呼び出し側では、Command1、Command2などのオブジェクトそのものを
受け渡す処理は必要ですが、それ以外の重複コードはなくなります。

コード:
Private Sub Command共通処理(objCommand As CommandButton)
    Call MsgBox(objCommand.Caption)
End Sub


#環境がないので、うろ覚えで書いてます。微妙に間違っている部分があるかもしれませんので、
#その辺は適宜読み替えてください。

引用:

これをVB.NETやVB2005のように、プロシージャ内に書かれているコードを
全く同一にしたかったのです。



まったく同一にはできませんが、上記のようにオブジェクトを引き渡す処理
だけにすることはできます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-09-02 16:47
デコレータみたいなクラスを作れば一応行けますね。 下準備さえしてしまえばイベントに関しては呼び出しを書く必要もありません。 イベント自体が統合されるようなイメージになりますが (実際は違いますが) こちらの方がサンプルを見る限り使い勝手がいいような気も...。こういう事例でしか使い道はないと思いますけども。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2008-09-02 17:46
引用:

としさんの書き込み (2008-09-02 11:03) より:
これをVB.NETやVB2005のように、プロシージャ内に書かれているコードを
全く同一にしたかったのです。


内容にもよりますが、ご提示されているサンプルであればコントロール配列が使用できると思います。
コード:
Private Sub Command_Click(Index As Integer)
    Call MsgBox(Command(Index).Caption)
End Sub


こういうことではないのかな・・・?
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-09-03 10:33
引用:

じゃんぬねっとさんの書き込み (2008-09-02 16:47) より:
デコレータみたいなクラスを作れば一応行けますね。



私の提示した方法よりもこちらの方法のほうがスマートでよりよいですね。
ただし、コントロール配列には適用できなかったりと難があったはず(泣)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-09-03 10:49
引用:

よねKENさんの書き込み (2008-09-03 10:33) より:

私の提示した方法よりもこちらの方法のほうがスマートでよりよいですね。
ただし、コントロール配列には適用できなかったりと難があったはず(泣)


その場合は素直にコントロール配列を使えば良いのではないでしょうか? (私は嫌いなのでコンテナ コントロール化します) それかコントロール配列ライクな構造を考えれば良いと思います。(個人的にはコレクション系統の方が好き)

コントロール配列についてはよねKENさんご本人が最初に説明をした上で回答していらした (私には 「別解」 という流れに見えていました) ので、コントロール配列以外の方法を求められているのかなと思っていました...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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