|
2017/12/23(Sat) 14:25:13 編集(投稿者)
■No86186 (ちょこじー さん) に返信 > 自分では明示的にアタッチ文を書いていないので、デフォルトの設定で入っていたのでしょうか・・・?
DateTimePicker1_Enter などといったイベントハンドラーをアタッチする場合、 C# の場合はオブジェクトに対してイベントハンドラを += で割り当てる言語仕様ですが、 VB の場合は逆で、イベントハンドラに対してオブジェクトを割り当てる言語仕様です。
具体的には、Visual Basic の場合
Private Sub DateTimePicker1_Enter(sender As Object, _ e As EventArgs) Handles DateTimePicker1.Enter
のように、末尾に『Handles 対象オブジェクト.イベント名』の宣言があり、 これによってイベントのアタッチが行われるということです。
この Handles 句による割り当ては、Visual Studio によって自動的に行われます。
また、たとえばこれを、『Handles DateTimePicker1.Enter, DateTimePicker2.Enter』とすれば DatePicker1 と DatePicker2 の両方のイベントを一か所にまとめることさえできます。
引数の型に互換性があれば、異なる種類のコントロールやイベントをまとめることもできますので Sub Hoge(sender As Object, e As EventArgs) Handles Button1.Click, TextBox1.TextChanged などといったことさえ可能です。
もし、イベント処理を使う必要がなくなった場合は、この Sub 〜 End Sub の処理を Handles 句も含めて丸ごと削除すれば、イベントの割り当ても自動解除されます。
これが C# だと、割り当てや解除を += や -= という演算子で行う言語仕様になっています。 フォームデザイナーからだと、Form1.Desinger.cs ファイル内に自動的に DateTimePicker1.Enter += DateTimePicker1_Enter; に相当するコードが記載されることになります。 左辺の「オブジェクト.イベント」に対して、右辺の「イベントハンドラ」が割り当てられます。
それゆえ C# の場合、void DateTimePicker1_Enter(…) の処理が不要になったからと言って、 不要になったイベントハンドラを不用意に削除してしまうと、.Designer.cs 側での アタッチコードが残ってしまい、「DateTimePicker1_Enter が見つからない!」ということで 不整合を起こしてエラーになってしまうのですが、VB ではその心配が無いですね。
ちなみに VB で Handles 句を使うためには、その変数が Friend WithEvents DateTimePicker1 As DateTimePicker のように、「WithEvents 句」付きで宣言されている必要があるのですが、 フォームにコントロールを張り付けた場合、自動的に WithEvents 句付きの宣言が Form1.Desinger.vb ファイル内に自動生成されるので、普段は意識する必要がありません。
一方、WebSurfer さんが書かれた AddHandler ステートメントですが、これが必要になるのは イベントの割り当てをフォームデザイナーによる自動割り当てに任せることなく、 プログラムから明示的に、アタッチ操作を行いたい場合に限定されます。 なので、AddHandler + AddressOf が必要になるのは、やや特殊なケースですね。 (ちなみにでデタッチは RemoveHandler ステートメントです)
ただし、デザイン時専用プロパティである「GenerateMember プロパティ」を True から False に変更していた場合には、Visual Basic (の 2005 以降) は WithEvents + Handles による標準的な割り当ての代わりに、 AddHandler + AddressOf による割り当てを Form1.designer.vb に記述するようになっています。
|