イベントとは?
「マウスクリック」や「キーボードのキーが押される」等のアクションをイベントと呼びます。
イベントハンドラとは?
イベントが起きることを監視して、イベントに対応した特別なメソッドのことです。
イベントの仕組み
イベントとイベントハンドラの結びつけのためにデリゲートの仕組みを利用しています。
イベントにおける構文
イベントを発生させる側
イベントの定義
1 |
Event イベント名 |
イベントを発生させる
1 |
RaiseEvent イベント名 |
イベントを受け取る側
イベントが発生するクラス宣言
プログラム内で使いたいイベントを最初に定義します。
1 |
WithEvents 変数名 As イベントを持つクラス |
イベントを処理するイベントハンドラの定義
イベントを静的に関連付けたい場合
実際にイベントが発生した際に、実行したい処理を記述します。
メソッドに固定でイベントを紐づけることになるので、静的な紐づけとなります。
1 2 |
[アクセス修飾子] Sub メソッド名 Handles WithEventsで定義した変数名 End Sub |
イベントを動的に関連付けたい場合
この記述であれば、プログラム内で必要に応じてイベントとイベントハンドラを状況に応じて関連づけることができます。
また、一つのイベントに対して、複数のイベントハンドラを関連付けることもできます。
1 |
AddHandler イベント名,AddressOf イベントハンドラ名 |
サンプル
イベント(リトライ用の共通クラスを作ります。)
1 2 3 4 5 6 7 8 9 10 11 12 |
Public Class EventRetry 'イベントの宣言 Public Event targetMethod() Public Sub CommonRetry() '処理をリトライさせる。 For i = 0 To 2 'イベントを発生させる RaiseEvent targetMethod() Next End Sub End Class |
呼び元のクラス(用意したメソッドをリトライさせます。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Module Module1 Sub retry1() Console.WriteLine("リトライテスト1") End Sub Sub retry2() Console.WriteLine("リトライテスト2") End Sub Sub Main() Dim retry As New EventRetry 'targetMethodイベントに、retry1を動的に結びつける AddHandler retry.targetMethod, AddressOf retry1 'TestMethodを実行 retry.CommonRetry() 'targetMethodイベントに結びついている、retry1を削除 RemoveHandler retry.targetMethod, AddressOf retry1 'targetMethodイベントに、retry2を動的に結びつける AddHandler retry.targetMethod, AddressOf retry2 'Testメソッドを実行 retry.CommonRetry() Console.ReadLine() End Sub End Module |
C#でのイベントの実装
同様のことをC#でやる場合は下記のようになります。
サンプル
呼び出し元のクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static void Main(string[] args) { //イベントが定義されているクラスをインスタンス化する。 EventRetry retryClass = new EventRetry(); Program prog = new Program(); //イベントを紐づける。 retryClass.targetMethod += prog.retry1; retryClass.commonRetry(); //イベントを削除 retryClass.targetMethod -= prog.retry1; //イベントを新たに紐づける。 retryClass.targetMethod += prog.retry2; retryClass.commonRetry(); Console.ReadKey(); } void retry1() { Console.WriteLine("リトライテスト1"); } void retry2() { Console.WriteLine("リトライテスト2"); } } } |
イベントを定義するクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class EventRetry { //イベントを定義する(デリゲート) public event Action targetMethod; public void commonRetry() { //リトライ for (int i = 0; i < 2; i++) { //イベントを発生させる targetMethod(); } } } } |
この記事へのコメントはありません。