PowerShellでWindowsフォームを作ったときのイベント処理について

PowerShellでのイベント定義方法

PowerShellでWindowsフォームを作成してみた。



慣れてくれば結構サクサク作れるので必要に迫られたときに色々と作れるように基本的な画面処理を作りたいなと思う。
その中でやっぱり、キーボードを押下したときに色々と処理を走らせたい・・・
Escapeキーを押したら別画面出したり、F1キー押したら新規画面に遷移したり・・・

っていうことをやっているとClickイベントやKeyDownイベントをうまく処理ができない事象にぶつかってしまった。
まずはPowerShellでFormを継承した独自クラスを作った

# Formクラスを継承して新しいクラスを作成する
Class frmPersonal :System.Windows.Forms.Form{
}

画面上にボタンを頑張って配置して、ボタンをクリックした際のメソッドを作った。

    btnF12_Click([object] $sender, [EventArgs] $e){
        $this.Close()
    }

ボタンをクリックしたときの処理を記述して呼び出すようにすると
        # F12ボタン
        $btnF12Click={
            $sender = $args[0];
            $e = $args[1];
            $this.btnF12_Click($sender,$e);
        }
        $this.btnF12.add_Click($btnF12Click);

***** エラー内容 *****
[System.Windows.Forms.Button] に 'btnF12_Click' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。
発生場所 C:\PowerShell\Projects\WinFormExample\Source\frm.ps1:616 文字:13
+             $this.btnF12_Click($sender,$e);
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) []、RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
*********************

なんかエラー出た・・・・
ずっと悩んでいたけど、デバッグを取りながらよくエラー見てたら「$this」には「btnF12」が格納されている。
たしかに、"[System.Windows.Forms.Button] に 'btnF12_Click' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。"って言われている。

さてどうしようかな、って思って悩んでいたけど、ボタンの親フォームを取ればいいだけじゃないかなってようやく行き着いた。

        # F12ボタン
        $btnF12Click={
            $sender = $args[0];
            $e = $args[1];
            $sender.FindForm().btnF12_Click($sender,$e);
        }
        $this.btnF12.add_Click($btnF12Click);

「$this.FindForm()」でもよかったかもしれないけど、「$sebder」のほうが後から見てわかりやすいかなと思って$senderを定義することにした。

同じ理屈でテキストボックスにカーソルがある状態でEscapeを押下したときに画面を表示するのも同じような処理になった。
        $this.txtAtenaNo.Add_KeyDown({
            $sender = $args[0];
            $e = $args[1];
            # $senderはTextBoxが帰ってくるので、TextBoxの親フォームを
# 取得したうえでメソッドを呼び出す
            if ($_.KeyCode -eq "Escape") {
                $sender.FindForm().ShowForm();
            }
        })

PowerShellでWindowsフォームの開発ができるとPowerShell ISEが入っている標準の環境であってもプログラミングができるので選択肢を増やすためにもいろいろと作ってみようと思う。

メニュー、個別画面、一覧画面、Excel出力が作れれば簡単なシステムが作れるので選択肢が増えるかなと思う。
Excelが入っている時点でVBAでフォーム作ったほうがいい気がするけど、DataGridViewが使いたい。


PowerShellでEdgeを自動化(インストール不要。参考:郵便追跡サービス自動操作)

1.経緯について  RPAのソフトをインストールできないので、これまでVBSでCreateObjectでブラウザの自動操作をすることがたまにあった。 ※いざというときの手札として持っているだけで安心感が段違い  見た目上IEがインストールされていなくても、CreateObject...