作成日: 2015/12/03, 更新日: 2015/12/03
イベントの仕組みを知って、自分たち専用のイベントを作ってみよう
しょっちゅう使うけど、どうなっているのか実はよく分かっていないイベント
- クライアントアプリケーションを作成する際、画面上に、ボタンやテキストボックス等のコントロールをペタペタ貼り付け、 ボタンクリックした時の処理や、テキスト入力欄に文字を入力した時の禁止文字チェック処理等、各処理を実装していくことになります。 ある程度作成できたところで、デバッグ実行すると、画面が表示されて、ボタンを押すと処理が走りますね。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Console.WriteLine("ボタンが押されました。") End Sub
' ボタンをクリックすることで、以下を表示 ボタンが押されました。
スポンサーリンク
実際に作って、体験してみよう!
- それでは実際に、作ってみます。
' ボタンを真似た、疑似ボタン Class EmulateButton 'Public Delegate Sub ClickDelegate() 'Public Event Click As ClickDelegate Public Event Click() Public Sub PerformClick() RaiseEvent Click() End Sub End Class
Public Class Form1 ' 疑似ボタンのインスタンス生成 Private WithEvents btn As New EmulateButton Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 疑似ボタンの、ボタンクリックのエミュレート btn.PerformClick() End Sub Private Sub btn_Click() Handles btn.Click Console.WriteLine("疑似ボタンのクリックイベントです。") End Sub End Class
' 出力結果 疑似ボタンのクリックイベントです。
Class EmulateButton 'Public Delegate Sub ClickDelegate() 'Public Event Click As ClickDelegate Public Event Click() Public Sub PerformClick() RaiseEvent Click() End Sub End Class
Public Class Form1 ' 疑似ボタンのインスタンス生成 Private WithEvents btn As New EmulateButton Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 疑似ボタンの、ボタンクリックのエミュレート btn.PerformClick() End Sub Private Sub btn_Click() Handles btn.Click Console.WriteLine("疑似ボタンのクリックイベントです。") End Sub End Class
' ボタンを真似た、疑似ボタン Class EmulateButton Public Property Name As String = String.Empty 'Public Delegate Sub ClickDelegate(sender As Object, e As EventArgs) 'Public Event Click As ClickDelegate Public Event Click(sender As Object, e As EventArgs) Public Sub PerformClick() RaiseEvent Click(Me, New EventArgs) End Sub End Class
Public Class Form1 ' 疑似ボタンのインスタンス生成 Private WithEvents btn As New EmulateButton With {.Name = "EmulateButton1"} Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 疑似ボタンの、ボタンクリックのエミュレート btn.PerformClick() End Sub Private Sub btn_Click(sender As Object, e As EventArgs) Handles btn.Click Dim ctrlName As String = CType(sender, EmulateButton).Name Console.WriteLine(ctrlName & " のクリックイベントです。") End Sub End Class
' 出力結果 EmulateButton1 のクリックイベントです。
スポンサーリンク
既存ボタンを、いじってみよう!
- 次に実際のボタンに新機能を付けて、拡張ボタンを作ってみましょう。 ここでは、ボタンクリックイベントの後で発生する、クリック後イベントを作成して、実際に使ってみます。
' イベント発生時に渡す関連情報データについて、専用データを準備します。 Public Class ClickedEventArgs Inherits EventArgs Public Property ElapsedTime As TimeSpan End Class
' ボタンを拡張した独自ボタンを作成します。 Public Class ButtonEx Inherits Button Public Event Clicked(sender As Object, e As ClickedEventArgs) Protected Overrides Sub OnClick(e As EventArgs) Dim stopwatch As New Stopwatch stopwatch.Start() MyBase.OnClick(e) stopwatch.Stop() Dim eData As New ClickedEventArgs eData.ElapsedTime = stopwatch.Elapsed RaiseEvent Clicked(Me, eData) End Sub End Class
' 拡張ボタンを作成した時点で、いったんビルドすることで、拡張ボタンを画面に貼ることができるようになります。 Public Class Form1 Private Sub ButtonEx1_Click(sender As Object, e As EventArgs) Handles ButtonEx1.Click System.Threading.Thread.Sleep(1000) Console.WriteLine("ボタンのクリックイベントです。") End Sub Private Sub ButtonEx1_Clicked(sender As Object, e As ClickedEventArgs) Handles ButtonEx1.Clicked Console.WriteLine("ボタンのクリックイベントが終わったよ。") Console.WriteLine("クリックイベントでかかった時間:{0} 時間 {1} 分 {2} 秒", e.ElapsedTime.Hours, e.ElapsedTime.Minutes, e.ElapsedTime.Seconds) End Sub End Class
' 出力結果 ボタンのクリックイベントです。 ボタンのクリックイベントが終わったよ。 クリックイベントでかかった時間:0 時間 0 分 1 秒
- 続いては、イベントの動的な紐づけ方、外し方についてです。
Class EmulateButton Public Event Click() Public Sub PerformClick() RaiseEvent Click() End Sub End Class
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim btn As New EmulateButton btn.PerformClick() ' 動的に紐づけます。 AddHandler btn.Click, AddressOf Me.MyClick btn.PerformClick() ' 動的に外します。 RemoveHandler btn.Click, AddressOf Me.MyClick btn.PerformClick() End Sub Private Sub MyClick() Console.WriteLine("クリックしました。") End Sub End Class
' 出力結果 クリックしました。
Private Sub RadioButtons_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged Dim radio As RadioButton = CType(sender, RadioButton) If radio.Checked Then Console.WriteLine(radio.Name & " がチェックされました。") End If End Sub
' チェックを切り替えるたびに、出力 RadioButton1 がチェックされました。 RadioButton2 がチェックされました。
Dim btn As New EmulateButton ' 複数のメソッドを紐づけます。 AddHandler btn.Click, AddressOf Me.BeforeClick AddHandler btn.Click, AddressOf Me.AfterClick ' 1回だけクリックします。 btn.PerformClick() Private Sub BeforeClick() Console.WriteLine("クリックします。") End Sub Private Sub AfterClick() Console.WriteLine("クリックしました。") End Sub
' 出力結果 クリックします。 クリックしました。
まとめ
- さて、駆け足での説明でしたが、イベント処理の舞台裏が見えたでしょうか。ほとんど組み込まれたイベントで事足りることが多く、 自前イベントを作成しなければいけないという要求は少ないかと思います。しかし、イベントの仕組みを分かった上で使う方が、楽しいと思いませんか?
- 最後までこの記事を読んでいただき、ありがとうございました。
スポンサーリンク