Visual Studioみたいな開発環境をインストールできない環境でアプリを作りたい・・・
色々と考えた結果「HTA」を使ってHTML+JavaScriptでアプリを作ることにして、テキストエディタで頑張って作ったけど、やっぱり使い勝手が悪いのとデザインとかに凝るのがなかなか大変なのでWindowsフォームみたいな画面を作れないかいろいろと調べていた。
※デバッグできないのがつらい・・・。
PowerShellでWindowsフォームを作れるところに行きついたけど、なかなか手が出せなかった。※HTAで十分事足りていたってのもあるけど
ただ、HTAで作ったアプリに改修が入ったのでこの際に作り直そうと頑張った。
色々と調べると別にPowerShellなら外部ファイルも作れるし、別画面も作れるのがわかったのでサンプルを作った。
今のところ気を付けないといけなかったのは下記の二点
1.ファイル内に関数は先に定義しておかないと画面から呼び出せない。
関数の定義前に呼び出すと未定義関数ってエラーが出る
※いつの時代のスクリプト言語なんだろう・・・
2.外部ファイルを読み込むときには変数名や関数名を同じにしない
※イメージ的には複数のファイルを一つにまとめてから実行している??
2.に気づくまでは$FormDetailを$Formと定義していたせいで全然動かせんかった
作成物
・Main.ps1 ・・・大本のファイル。共通変数などはここに定義
・frmMain.ps1 ・・・ 初期画面を定義
・frmDetail.ps1 ・・・ 初期画面を定義
Main.ps1
$CurrentDir = Split-Path $MyInvocation.MyCommand.path
$ScriptName = $MyInvocation.MyCommand.path
$Basename = $MyInvocation.MyCommand.Name
# 外部ファイルを読み込み
$Path = $CurrentDir + "\frmMain.ps1"
.$Path
# frmMain.ps1に定義されている画面呼び出しを呼び出す
OpenMainForm
frmMain.ps1
#アセンブリの読み込み
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
# デバッグ用(Main.ps1で定義済)
# $CurrentDir = Split-Path $MyInvocation.MyCommand.path
# $ScriptName = $MyInvocation.MyCommand.path
# $Basename = $MyInvocation.MyCommand.Name
$Path = $CurrentDir + "\frmDetail.ps1"
.$Path
#フォームの設定
$Form = New-Object System.Windows.Forms.Form
$Form.Size = New-Object System.Drawing.Size(800,600)
$Form.Text = "メイン画面"
#ボタンの設定
$btnShowSubForm = New-Object System.Windows.Forms.Button
$btnShowSubForm.Location = New-Object System.Drawing.Point(100,50)
$btnShowSubForm.Size = New-Object System.Drawing.Size(200,100)
$btnShowSubForm.Text = "詳細画面表示"
$btnShowSubForm.Add_Click({
OpenDetailForm("メイン画面から呼び出し引数")
})
$Form.Controls.Add($btnShowSubForm)
#フォームの表示
$Form.Add_Shown({$Form.Activate()})
function OpenMainForm {
[void] $Form.ShowDialog()
}
frmDetail.ps1
#アセンブリの読み込み
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
#フォームの設定
$FormDetail = New-Object System.Windows.Forms.Form
$FormDetail.Size = New-Object System.Drawing.Size(800,600)
$FormDetail.Text = "詳細画面"
#ボタンの設定
$btnShowSubForm = New-Object System.Windows.Forms.Button
$btnShowSubForm.Location = New-Object System.Drawing.Point(10,50)
$btnShowSubForm.Size = New-Object System.Drawing.Size(100,70)
$btnShowSubForm.Text = "画面を閉じる"
$FormDetail.Controls.Add($btnShowSubForm)
#テキストボックスの設定
$txtHikisu = New-Object System.Windows.Forms.TextBox
$txtHikisu.Location = New-Object System.Drawing.Point(130,50)
$txtHikisu.Size = New-Object System.Drawing.Size(200,100)
$txtHikisu.Text = ""
$FormDetail.Controls.Add($txtHikisu)
#フォームの表示
$FormDetail.Add_Shown({$FormDetail.Activate()})
function OpenDetailForm {
[void] $FormDetail.Show()
}
function OpenDetailForm([String]$strKey) {
$txtHikisu.Text=$strKey
$FormDetail.Show()
}
-------------