VisualBaiscとPowerShellのイベント処理の比較

過去に紹介したWindowsフォーム関連のサンプルでイベント処理について触れていますが、
複数の記事に分散しているので、整理してみました。

VisualBasicのイベント処理

VisualBasic2005でWindowsアプリケーションのプロジェクトを作成し、フォームにボタンを配置してダブルクリックすると、
Clickイベントのイベントハンドラが自動生成されます。
自動生成されたButton1_Clickが、ボタンクリック時に呼び出されるサブプロシージャです。


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
End Sub

Button1_Clickには引数が2つで、「sender」はイベントソース(イベント発生元オブジェクト)、「e」はイベントデータを格納しています。
ボタンのクリックイベントの場合「sender」はButtonオブジェクト、「e」にMouseEventArgsオブジェクトです。

PowerShellのイベント処理

PowerShellの場合、コントロールの「add_Click」や「add_DoubleClick」などのメソッドを通してイベントハンドラを定義します。
イベントの種類によって引数の型が異なりますが(ClickイベントならEventHandler、KeyDownイベントならKeyEventHandler)、
中カッコで囲んだスクリプトブロックを引数に渡せば、PowerShellランタイムが適切なイベントハンドラの型にキャストしてくれます。

サンプル1:クリックイベントのイベントハンドラを定義する


[Void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$form = New-Object Windows.Forms.Form
$button = New-Object Windows.Forms.Button
$button.Text = "テスト"
$button.Dock = "Fill"
$button_click = {[Windows.Forms.MessageBox]::Show("クリック!")}
$button.add_Click($button_click)
$form.Controls.Add($button)
$form.ShowDialog()

サンプル1は、フォーム上に配置したボタンをクリックするとメッセージボックスを表示します。

イベントソース、イベントデータの取得方法

VisualBasicでは「sender」と「e」によって、イベントソース、イベントデータの取得できました。
PowerShellで「sender」と「e」に相当するのが、「$this」と「$_」です。
この2つの変数はイベントハンドラの中でのみ、イベントソース、イベントデータへの参照を持ちます。

イベント
ソース
イベント
データ
VisualBasic sender e
PowerShell $this $_
サンプル2:イベントソース、イベントデータを取得する


[Void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$form = New-Object Windows.Forms.Form
$button = New-Object Windows.Forms.Button
$button.Text = "テスト"
$button.Dock = "Fill"
$button_click =
{
($sender, $e) = $this, $_
# sender($this)
Write-Host '■イベントソース'
Write-Host $sender.GetType().FullName # 型を表示
Write-Host $($sender | Format-List * | Out-String) # 全てのプロパティを表示
Write-Host
# e($_)
Write-Host '■イベントデータ'
Write-Host $e.GetType().FullName # 型を表示
Write-Host $($e | Format-List * | Out-String) # 全てのプロパティを表示
}
$button.add_Click($button_click)
$form.Controls.Add($button)
$form.ShowDialog()

サンプル2は、フォーム上に配置したボタンをクリックすると、
ボタンのクリックイベントに対する「イベントソース」と「イベントデータ」の情報を表示します。

サンプル2でボタンをクリックした際の実行結果
■イベントソース
System.Windows.Forms.Button


AutoSizeMode                       : GrowOnly
DialogResult                       : None
AutoEllipsis                       : False
AutoSize                           : False
BackColor                          : Color [Control]
FlatStyle                          : Standard
FlatAppearance                     : System.Windows.Forms.FlatButtonAppearance
Image                              :
ImageAlign                         : MiddleCenter
ImageIndex                         : -1
ImageKey                           :
ImageList                          :
ImeMode                            : Disable
Text                               : テスト
TextAlign                          : MiddleCenter
(▼中略)

■イベントデータ
System.Windows.Forms.MouseEventArgs


Button   : Left
Clicks   : 1
X        : 215
Y        : 171
Delta    : 0
Location : {X=215,Y=171}