2010年6月11日金曜日

◆汎用フォームをつくる

スクリプトの途中でちょっとした入力フォームを使いたいことがある。
VisualStudioのようにフォームデザイナがあるわけではないのでコントロール配置がちょっと面倒。
というわけで汎用のコントロール配置関数を作ってみる。
#
#control[0..2]がコントロール配列、control[3]がボタン配列###############
#

Function MSet-Control($control,$form){
    $CWidth,$CHeight = 100,30  #コントロールのサイズ
    $BWidth,$BHeight = 50,30   #ボタンのサイズ
    $XMargin,$YMargin = 10,10  #コントロールマージン
    $ButtonMaxCount = 6        #ボタンの最大数
    #Formサイズの設定
    $maxControlCount = 
        [Math]::Max([Math]::Max($control[0].Count,$control[1].Count),$control[2].Count)
    $formHeight = $maxControlCount * ($CHeight + $XMargin) + ($BHeight + $XMargin)
    $formWidth = ($BWidth + $XMargin) * $ButtonMaxCount
    $size = New-Object System.Drawing.Size $formWidth,$formHeight
    $form.ClientSize = $size
    #Formへコントロールの配置
    0..2 | %{$XPos = $XMargin}{
        $YPos = $XMargin
        foreach($cl in $control[$_]){
            [System.Windows.Forms.Control]$ctrl = $cl
            $ctrl.Left = $XPos
            $ctrl.Top = $YPos ; $YPos += ($CHeight + $XMargin)
            $ctrl.Width = $CWidth
            $ctrl.Height = $CHeight
            $form.Controls.Add($ctrl)
        }
        $XPos += ($CWidth + $XMargin)
    }
    #Formへボタンの配置
    $buttonCount = 1
    foreach($button in $control[3]){
        $button.Top = $size.Height - $BHeight - $YMargin
        $button.Left = $size.Width - ($buttonCount * ($BWidth + $XMargin))
        $button.Width = $BWidth
        $form.Controls.Add($button)
        $buttonCount++
    }
}
$arr = New-Object System.Collections.ArrayList[] 4
0..3 | %{$arr[$_] = New-Object System.Collections.ArrayList}
$test1 = New-Object System.Windows.Forms.Label
$test1.text = "テスト"
[void]$arr[0].Add($test1)
$test2 = New-Object System.Windows.Forms.TextBox
[void]$arr[0].Add($test2)
$test3 = New-Object System.Windows.Forms.TextBox
[void]$arr[0].Add($test3)
$test4 = New-Object System.Windows.Forms.TextBox
[void]$arr[1].Add($test4)
$test5 = New-Object System.Windows.Forms.ComboBox
$test5.Items.AddRange(@("test1","test2","test3"))
[void]$arr[2].Add($test5)
$button1 = New-Object System.Windows.Forms.Button
$button1.Text = "閉じる"
$button1.Add_Click({[void] [System.Windows.Forms.MessageBox]::show("フォームを閉じます");$form.Close()})
[void]$arr[3].Add($button1)
$form = New-Object System.Windows.Forms.Form
MSet-Control $arr $form  #M00Func.ps1の関数(汎用的にフォームにコントロールを配置する)
[void]$form.ShowDialog()
結果はこんな感じ
20100611232706
とりあえずは使い物になりそう・・・・。
微調整が必要な場合は、フォームをShowする前に以下のような感じで。
$test1.Top += 10

<追記>
PowerShell: ◆汎用フォームを作る4

0 件のコメント:

コメントを投稿