遅延バインディングの回避方法
投稿者 shu  (社会人)
投稿日時
2019/2/5 17:36:38
sender.tag
=> DirectCast(sender, CheckBox).tag
など
=> DirectCast(sender, CheckBox).tag
など
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2019/2/6 09:30:11
> AddHandler item(i).MouseClick, AddressOf Item_Click
MouseClick を使っているのは、意図的なものでしょうか。
CheckedChanged を使わないと、キーボードからの選択時に問題がありませんか?
(矢印キー等でカーソル移動して、Space キーで選択された場合など)
> item(i) = new checkbox <--- 意外な感じですが checkbox を使っています
上記の配列が
MouseClick を使っているのは、意図的なものでしょうか。
CheckedChanged を使わないと、キーボードからの選択時に問題がありませんか?
(矢印キー等でカーソル移動して、Space キーで選択された場合など)
> item(i) = new checkbox <--- 意外な感じですが checkbox を使っています
上記の配列が
Private item() As CheckBox
で管理されているのなら、Tag プロパティに頼らずともDim idx As Integer = Array.IndexOf(item, sender)
'Dim chk As CheckBox = item(idx)
'Dim chk As CheckBox = DirectCast(sender, CheckBox)
で処理できそうです。
投稿者 N88-BASIC  (社会人)
投稿日時
2019/2/6 10:59:27
shu さま、ご回答ありがとうございます。
ご案内いただいた方法で無事解決いたしました。
今後ともよろしくお願いいたします。
ご案内いただいた方法で無事解決いたしました。
今後ともよろしくお願いいたします。
投稿者 N88-BASIC  (社会人)
投稿日時
2019/2/6 11:30:18
魔界の仮面弁士 さま、ご連絡ありがとうございます。
>MouseClick を使っているのは、意図的なものでしょうか。
意図的に使用しております。対象チェックボックスの最初のクリックでチェックボックスを選択した状態とし、そのクリックボックス全体の背景色も変更して対象であることを表すだけで、最初のクリックでチェック状態の変更を抑制するためです(最初のクリックでチェック状態が変わらないようにするため)。選択したチェックボックスをもう一度クリックすることでチェック状態を変えるためです。処理目的は時刻表のようなもので目的の時間が近づくとチェックボックスの背景色を変更して注意を喚起します。また、チェックボックスは注意喚起でビープ音を鳴らすかどうかを制御するためです。
>Private item() As CheckBox
実際は item(n,m) as CheckBox とした2次元配列で処理しており、私の知識では2次元配列への対処は実現できておりません。TAGに数値をわりあてて使った方法なので一次元配列に変更して対応できると思いますが、現状では他の部分への影響を考えて SHU さんの方法で実現させていただきます。ただ、一次元配列で実現可能な処理を行うアプリも作成しておりますので導入させていただきたいと思います。
2次元配列にしたのは時刻表のイメージから考えると、上り、下りに分けたためです。
今後ともよろしくお願いいたします。
>MouseClick を使っているのは、意図的なものでしょうか。
意図的に使用しております。対象チェックボックスの最初のクリックでチェックボックスを選択した状態とし、そのクリックボックス全体の背景色も変更して対象であることを表すだけで、最初のクリックでチェック状態の変更を抑制するためです(最初のクリックでチェック状態が変わらないようにするため)。選択したチェックボックスをもう一度クリックすることでチェック状態を変えるためです。処理目的は時刻表のようなもので目的の時間が近づくとチェックボックスの背景色を変更して注意を喚起します。また、チェックボックスは注意喚起でビープ音を鳴らすかどうかを制御するためです。
>Private item() As CheckBox
実際は item(n,m) as CheckBox とした2次元配列で処理しており、私の知識では2次元配列への対処は実現できておりません。TAGに数値をわりあてて使った方法なので一次元配列に変更して対応できると思いますが、現状では他の部分への影響を考えて SHU さんの方法で実現させていただきます。ただ、一次元配列で実現可能な処理を行うアプリも作成しておりますので導入させていただきたいと思います。
2次元配列にしたのは時刻表のイメージから考えると、上り、下りに分けたためです。
今後ともよろしくお願いいたします。
複数のコントロールを同じイベントで処理をしたいと考え、各コントロールの判別をTAGプロパティで行おうとしておりますが、Option Strict On 状態では”遅延バインディングを使用できません”となり、現状、Option Strict Off にて運用しています( On の状態で遅延バインディング以外のエラーをチェック後)
現在の処理の概要は
item(i) = new checkbox <--- 意外な感じですが checkbox を使っています
item(i).tag = i
Me.Controls.Add(item(i))
AddHandler item(i).MouseClick, AddressOf Item_Click
Private Sub Item_Click(sender as Object , e as EventArgs)
Select Cint(sender.tag) <--- ここで遅延バインディングのエラーとなります。
case 0
case 1
End Select
End Sub
Option Strict On 条件下で遅延バインディングを回避する方法もしくは、イベント発生元を判断する方法をご教授いただければ幸いです。