WindowsXP VB2005 の環境です。
オプションボタン3つの配列がVB6からのコンバートで
optMode As Microsoft.VisualBasic.Compatibility.VB6.RadioButtonArray
_op_1 as System.Windows.Forms.RadioButton
_op_2 as System.Windows.Forms.RadioButton
_op_3 as System.Windows.Forms.RadioButton
があります。
VB2005にコンバート後、同じ動作をするものを
optMode2 As Microsoft.VisualBasic.Compatibility.VB6.RadioButtonArray
_op_1b as System.Windows.Forms.RadioButton
_op_2b as System.Windows.Forms.RadioButton
_op_3b as System.Windows.Forms.RadioButton
として用意しました。
このボタンが押されたときの動作として、
①
Private Sub optMode_CheckedChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles optMode.CheckedChanged, optMode2.CheckedChanged
を用意し、この中に
②
Dim Index As Short = optMode.GetIndex(eventSender)
を設定してインデックス番号を取得しようとしています。
問題は、ある関数からこのoptMode_CheckedChangedをプログラム上で
呼び出す
If intA = 1 Then
loptMode = optMode
Else
loptMode = optMode2
End If
loptMode(intI).Checked = True
このプログラムがあります。(変数の定義はここでは省略)
このうち、loptMode = optModeから①へ来る時は問題ないのですが、
loptMode = optMode2から①へ来ると、②で
「オブジェクトはコントロール配列のメンバではありません」
というエラーが実行時に発生します。
このエラーの意味が上手く理解できていません。
具体的にどういったところに注目してミスやもれを探せばいいのでしょうか。
XXX.Designer.vbの中を見たりしていますが、optMode、optMode間での
違いがありません。
Handles optMode.CheckedChanged, optMode2.CheckedChanged
としても、
Dim Index As Short = optMode.GetIndex(eventSender)
とすれば、optMode2からきた場合、このエラーが出るのですね。
ちなみに(今からすれば当然なのですが)
Dim Index As Short = optMode2.GetIndex(eventSender)
とすれば、当然エラーはありません。
しかし、optMode_CheckedChanged 内で、optModeか、optMode2か
どちらからきているのかを判断する方法がないのでしょうか?
手前でワンクッションおいて、optMode2_CheckedChanged を用意する
方法はありますが、それをしないで・・・
ご教授ください。
目的は、判断した後、Index番号と、そのボタンの背景色を変えたいのです。
たとえば、
optMode(Index).BackColor = Color.Black
です。(これだとoptModeが変わっちゃいますが、optMode2が押されたら
optMode2を変えたいのです)
>しかし、optMode_CheckedChanged 内で、optModeか、optMode2か
>どちらからきているのかを判断する方法がないのでしょうか?
引数の eventSender がイベントを起こしたオブジェクトの参照と
なっていると思います。TypeOf でデータ型を判定してみては?
# それ以前に、コンバートされたコードをそのまま使うのではなくて、
# 自分で RadioButton の配列を用意して作り直したほうが、後々
# 融通が利いて良いと思いますが。
> TypeOf でデータ型を判定してみては?
あ、ごめ。間違い。同じ型だった(汗)
Name で判定になるのかな?。
特攻隊長まるるう様
ご回答ありがとうございます。
これをやってみたのですが、eventSenderはボタンそのものになっており、
配列のどちらか(optModeかoptMode2か)ではなく、_op_1などの情報に
なっています。
どちらの配列から来ているのかがわかりません。
言葉足らずですみません。
>eventSenderはボタンそのものになっており、
なるほど。コントロール配列が廃止になったので、そうやって他のイベント
と歩調を合わせてあるんでしょう。
仕組み(概念)自体が無いので、自分で作るしかないと思います。
>どちらの配列から来ているのかがわかりません。
サンプル通りにコントロールの名前に規則性があるなら、『b』で終わって
いれば optMode2 なのでは?
特攻隊長まるるう様
そうですね、仕組みがなく、言わば無理やりなので、自分でワンクッション
置く方法にするか、ご指摘くださった名前での判断ですね。
ワンクッション置くとわかりづらくなるので、ご指摘頂いた方法で
対応させて頂きます。
ご指導、ありがとうございました。
ツイート | ![]() |