2016-03-22

PowerShellでユーザーフォームを作る - サブフォーム編 -

PowerShellでは、ユーザーの好みに合わせて、独自にフォームを作成することができます。

今回は「PowerShellでユーザーフォームを作る - サブフォーム編 -」です。

サブフォームは子フォームと言ったりもしますが、メインフォームとは別に表示させるフォームのことです。

サブフォームは開く方法や閉じる時などにいくつかの注意点があります。
その辺りについても詳しく、かつ分かりやすくご紹介していきたいと思います。

<今回の完成品>


ボタンも何もない方がサブフォームです。
メインフォームの「フォーム表示」ボタンを押すと表示されるようになっています。

それではスクリプトを記述していきます。


# PowerShellでユーザーフォームを作る - サブフォーム編 -

Add-Type -AssemblyName System.Windows.Forms

# メインフォーム
$formA = New-Object System.Windows.Forms.Form
$formA.Size = "200,200"
$formA.StartPosition = "Manual"
$formA.Location = "0,0"
$formA.text = "メインフォーム"
$formA.MinimizeBox = $False
$formA.MaximizeBox = $False

#フォーム表示ボタン
$Button = New-Object System.Windows.Forms.Button
$Button.Location = "50,50"
$Button.size = "100,30"
$Button.text  = "フォーム表示"
$formA.Controls.Add($Button)

# サブフォーム
$formB = New-Object System.Windows.Forms.Form
$formB.Size = "200,300"
$formB.StartPosition = "manual"
$formB.Location = "200,0"
$formB.MaximizeBox = $False
$formB.MinimizeBox = $false
$formB.text = "サブフォーム"
$formB.Owner = $formA

# サブフォームのクロージングイベント
$Close = {
    $_.Cancel = $True
    $formB.Visible = $false
}
$formB.Add_Closing($Close)

#フォーム表示ボタンのクリックイベント
$Click = {
    $formB.Show()
}
$Button.Add_Click($Click)

#閉じるボタン
$CloseButton = New-Object System.Windows.Forms.Button
$CloseButton.Location = "50,100"
$CloseButton.size = "80,30"
$CloseButton.text  = "閉じる"
$CloseButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$formA.Controls.Add($CloseButton)

$FormA.Showdialog()

上記内容をコピーし、PowerShell ISEに貼り付けて実行すると上の画像と同じものが表示されるはずです。

続いて解説をしていきます。

※過去の記事で解説した部分については割愛致します。
 内容をご確認いただきたい場合は【ユーザーフォーム - 基礎編 -】をご覧ください。

*****解説*****************************************************************************
# サブフォーム
$formB = New-Object System.Windows.Forms.Form
$formB.Size = "200,300"
$formB.StartPosition = "manual"
$formB.Location = "200,0"
$formB.MaximizeBox = $False
$formB.MinimizeBox = $false
$formB.text = "サブフォーム"
$formB.Owner = $formA

まず最初にメインフォームとは別のフォームを作成するため、新しいFormクラスを$formBとして宣言します。
さらに各種プロパティを設定しているのですが、ここで大事なのが「Ownerプロパティ」です。

冒頭で触れましたが、サブフォームは別名「子フォーム」です。
つまりサブフォーム=子供であり、メインフォーム=親となります。
子供には必ず保護者が必要で、親がいないと子供は迷子になります。
Ownerプロパティは、「その子供の親はだれなのか?」を設定しています。
もしOwnerプロパティの記述がないと、メインフォームを閉じた時にサブフォームが取り残されて(=迷子になって)しまい、フリーズします。
なので、必ず記述するようにしましょう。

# サブフォームのクロージングイベント
$Close = {
    $_.Cancel = $True
    $formB.Visible = $false
}
$formB.Add_Closing($Close)
続いて、サブフォームのクロージングイベントを設定しています。
その内容は閉じようとしている操作をキャンセルし、かつ不可視状態(=存在はするけど見えない状態)にしています。
つまり、閉じたように見せかけて、実際は隠れただけということです。

なぜこのようなことをするかというと、サブフォームを普通に閉じた場合、もう一度表示させようとするとエラーが発生してしまうからです。
1度しか表示させないのであればこの記述は必要ありませんが、開く・閉じるを繰り返す場合は、この記述を入れましょう。

#フォーム表示ボタンのクリックイベント
$Click = {
    $formB.Show()
}
$Button.Add_Click($Click)
この記述は、メインフォームに設置されたボタンに対するクリックイベントになります。
ここではサブフォームを開いているのですが、「Show()」となっていることにご注目ください。
「ん?Showdialog()じゃないぞ?」と気づいたソコのアナタ!
グラッチェ!笑

フォームを表示させる方法には実はモードレスとモーダルの2種類があります。
モードレスの場合は「Show」を使用し、モーダルの場合は「Showdialog」を使用します。
2つの違いを簡単に説明しますと、次のようになります。

モードレス … フォームを表示させたらそのまま次の処理に移行する。
モーダル … フォームを表示させたら、そのフォームが閉じられるまで待機する。

体験した方が理解も早いと思いますので、実際に実験してみましょう。
まずは上記のサンプルスクリプトをそのまま実行し、サブフォームを表示させてください。(画像の状態)
サブフォームを開いたままで、メインフォームの「閉じる」ボタンを押すと、両フォームが閉じられます。

次に、$formB.Show() の部分を $formB.Showdialog() に変更した上で同じ操作をしてみてください。
閉じるボタンどころか、メインフォームが全然触れないと思います。

これがモードレスとモーダルの違いです。
なんとなくでもわかっていただけたでしょうか。

ここで一つ注意点があります。
それは「メインフォームは必ずShowdialog()とすること」です。
なぜならば、メインフォームをShow()でモードレス表示すると、表示と同時に次の行へ処理が進んでしまい、フリーズしてしまうからです。

以上のことから、メッセージボックスやインプットボックスのように何かしらの反応が必要な場合はモーダルで表示させ、次の処理に進まないようにするのがいいでしょう。
反対に、メインとは別に、常に表示させておきたいフォームがある場合はモードレスで表示させましょう。

*************************************************************************************************

長くなってしまい、申し訳ありません。
最後まで読んでいただき、誠にありがとうございました。

オリジナルのアプリケーション作りが凝ってくると、サブフォームは意外と出番が多くなります。
例えば「設定ボタンを押すと設定フォームが開く」、「バージョンボタンを押すと情報フォームが開く」といった具合です。

メインフォームに様々なアイテム(ボタンやテキストボックスなど)を詰め込んでしまうと、せっかくいいモノができても、ちょっと使いづらくなってしまいます。
使用頻度が低いものなんかはサブフォームに入れるなどして、機能だけでなく、見た目も美しいアプリを作っていきましょう!

=============================================================
本投稿に関する疑問や質問には可能な限りお答えさせていただきます。
お気軽にコメントやメールをお送りください。
(リクエストも歓迎します)
メール:tkk-powershell@gmail.com
また、間違いのご指摘・アドバイス等も歓迎いたします。
=============================================================
Google+、Twitterで更新情報をお届けしています!
ぜひフォローをお願い致します!           
=============================================================
スポンサーリンク


0 件のコメント:

コメントを投稿

疑問・質問・リクエスト お気軽にどうぞ (^O^)/