PowerShellの日本語情報って地味に少ないんですが、GUI系の情報は特に少ない気がします。
そもそもGUIが必要ならC#やHTML使えって話なんですが、Windows限定とはいえ標準でIDE付属のスクリプトってのは大きな魅力の一つではあるわけで。
ただし、どちらかといえば積極的な利用は想定外なので、.NET Frameworkの内部使用をある程度理解していないと込み入った使い方ができないのです。
使用バージョン
・Windows PowerShell Ver 5.1 (Windows10の標準最新版)
よく見かけるコードがだいたいこんな感じ
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using namespace System.Windows.Forms; Add-Type -AssemblyName System.Windows.Forms; Add-Type -AssemblyName System.Drawing; [Application]::EnableVisualStyles(); $btn = New-Object Button $btn.Text = “OK” $btn.Add_Click({Write-Host “Clicked!”}) $form = New-Object Form $form.Controls.Add($btn) $form.Showdialog |
これの何が問題かというと、部品一個一個を全部インスタンス化して変数に割り当てた設定をしているのでコードがひたすら長くなりがちで、凝ったことをし出すと変数名や処理を何度でも書かされるんですね。
PowerShellはオブジェクト指向言語です。Classのメンバは全部Publicですがオブジェクト指向です。
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 |
using namespace System.Windows.Forms; using namespace System.Drawing; [Application]::EnableVisualStyles(); $form = [Form1]::new(); $form.ShowDialog(); Class Form1 :Form{ $bs = [button]@{ Location = [Point]::new(120,50); Text = “Click Here!”; } Form1(){ $this.Size = [Size]::new(300, 400); $kore = $this; $this.bs.add_Click([Delegate]::CreateDelegate([EventHandler], $this, “Click”)); $this.Controls.add($this.bs); } Click([object] $sender, [EventArgs] $e){ [MessageBox]::Show(“Clicked!”); } } |
人によってはこの方が読みやすいかもしれない。
EventHandlerってのは内部的にはデリゲートなので、CreateDeleagateメソッドでクラスのメソッドを作ってあげればOK。
C#でよく使われる「+=メソッド名」は使えない。引数にデリゲートの型とクラスのインスタンスとメソッドの名前(文字列型)を与えてやらないとダメ。
さて、この記述量だと逆に長くなるので恩恵は受けられないんですが、たとえばボタンが複数あってしかも同じ処理を複数回行うとか言った場合はClassベースで書いた方が多分楽です。
過去に作ったものだと、自分の所属するクラスを辿ってそのメソッドを取得して~みたいな処理をしていますが、案外簡単にできるっぽい。
コメントを残す