none
GUIでカレンダーとテキストボックスを表示させ、テキストボックスに選択日付を表示させたい RRS feed

  • 質問

  • こんにちは、PowerShellのカテゴリと判断してこちらに書き込みます。
    PowerShellで、「カレンダーを表示させ、カレンダーの日付部分をクリックで選んだのちに、Selectボタンを押すと、テキストボックスのエリアにその日付が表示される」というものを作るつもりです。

    やりたいことは二つあって、

    ①Selectボタンを押せば押すほど、テキストボックスのエリアには「追記」されていくようにしたい

    現状、以下に示すコードでは、Selectを押すたびにテキストが上書きされてしまうだけになります。

    ②テキストボックスのエリアに表示されている日付は、最終的には、配列としてまとめてあとから、各行を取り出したい。

    (テキストボックスに入力された文字列を取り出すにはどうしたら良いか)

    よろしくおねがいします

    #Form [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | out-null $CalForm = New-Object Windows.Forms.Form $CalForm.Font = "MS UI Gothic,13" $CalForm.text = "日付選択" $CalForm.Size = New-Object Drawing.Size(500,280) #Calendar $Calendar = New-Object System.Windows.Forms.MonthCalendar $Calendar.MaxSelectionCount = 128 $Calendar.Location = "10,1" $Calendar.SetCalendarDimensions([int]1,[int]1) $CalForm.Controls.Add($Calendar) $CalForm.Controls.Add($button) $CalForm.Add_Shown($CalForm.Activate()) $Calendar.ScrollChange = 1 #Select Button $datePickerButton = New-Object System.Windows.Forms.Button $datePickerButton.Location = "200,160" $datePickerButton.Size = "75,23" $datePickerButton.ForeColor = "DarkBlue" $datePickerButton.BackColor = "White" $datePickerButton.Text = "Select" $datePickerButton.add_Click({ $outputBox.Text = $Calendar.SelectionStart $outputBox.Text = $outputBox.Text.Substring(0,10) + "`r`n"

    }) $CalForm.Controls.Add($datePickerButton) #TextBox $outputBox = New-Object System.Windows.Forms.TextBox $outputBox.Location = New-Object System.Drawing.Size(280,10) $outputBox.Size = New-Object System.Drawing.Size(200,180) $outputBox.MultiLine = $True $outputBox.ScrollBars = "Vertical" $CalForm.Controls.Add($outputBox) #Clear Button $ButtonClose = New-Object System.Windows.Forms.Button $ButtonClose.Location = New-Object System.Drawing.Point(31,200) $ButtonClose.Text = "OK" $ButtonClose.Add_Click({ $outputBox.Clear() }) $CalForm.Controls.Add($ButtonClose) $CalForm.showdialog() | Out-Null $Calendar.Selection


    2015年5月13日 5:03

回答

  • こんな?

    #Form
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | out-null 
    $CalForm = New-Object Windows.Forms.Form ; $CalForm.Font = "MS UI Gothic,13" 
    $CalForm.text = "日付選択" 
    $CalForm.Size = New-Object Drawing.Size(500,280)
    #Calendar 
    $Calendar = New-Object System.Windows.Forms.MonthCalendar 
    $Calendar.MaxSelectionCount = 128 #連続した日数が必要?
    $Calendar.Location = "10,1" 
    $Calendar.SetCalendarDimensions([int]1,[int]1) 
    $CalForm.Controls.Add($Calendar) 
    $CalForm.Controls.Add($button) 
    $CalForm.Add_Shown($CalForm.Activate()) 
    $Calendar.ScrollChange = 1 
    #Select Button 
    $datePickerButton = New-Object System.Windows.Forms.Button 
    $datePickerButton.Location = "200,160" 
    $datePickerButton.Size = "75,23" 
    $datePickerButton.ForeColor = "DarkBlue" 
    $datePickerButton.BackColor = "White" 
    $datePickerButton.Text = "Select" 
    $datePickerButton.add_Click({ 
        #文字列を連結していく
        $outputBox.Text += $Calendar.SelectionStart.ToShortDateString() +"`r`n" #環境によって表示の仕方は変わる
    }) 
    $CalForm.Controls.Add($datePickerButton) 
    #TextBox 
    $outputBox = New-Object System.Windows.Forms.TextBox 
    $outputBox.Location = New-Object System.Drawing.Size(280,10) 
    $outputBox.Size = New-Object System.Drawing.Size(200,180) 
    $outputBox.MultiLine = $True 
    $outputBox.ScrollBars = "Vertical" 
    $outputBox.ReadOnly = $true #編集されると困る
    $CalForm.Controls.Add($outputBox) 
    #Clear Button 
    $ButtonClose = New-Object System.Windows.Forms.Button 
    $ButtonClose.Location = New-Object System.Drawing.Point(31,200) 
    $ButtonClose.Text = "OK" 
    $ButtonClose.Add_Click({
         $CalForm.DialogResult = [System.Windows.Forms.DialogResult]::OK
    }) 
    $CalForm.Controls.Add($ButtonClose) 
    $CalForm.showdialog() | Out-Null 
    #$Calendar.Selection 
    
    if($CalForm.DialogResult -eq [System.Windows.Forms.DialogResult]::OK){
        $array=$outputBox.Text.Trim() -split "`r`n" #最後の改行を捨ててから配列に分割
        $dates= $array | % {$_ -as [DateTime]} | Sort -Unique | % {$_.ToShortDateString() } # 日本式のyyyy/MM/ddじゃないと文字では正しく並ばないので、日時型に戻して並べ替え
        Write-Host $array
    }

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 美凪2 2015年5月14日 0:17
    2015年5月13日 9:15
  • 美凪2 さま よろしく。

    Selectを押すたびにテキストが上書きされてしまう とありますが、
    コードを拝見する限り、その様にお書きになっています。

      $outputBox.Text = $Calendar.SelectionStart


    変数等を別途用意し、それに収めて( SelectionStart.ToShortDateString() )、
    $outputBox には = $outputBox + 制御文字列 + 変数 で。

    尚、ご利用のクラスは期間を扱うコントロールですが、それで、宜しいのでしょうか。
    ちょっと、気になったので。

    • 回答としてマーク 美凪2 2015年5月14日 0:15
    2015年5月13日 8:25
  • ご提示のコードは、.NET Frameworkに含まれているWindows Formsと呼ばれるGUIインターフェースを利用していますので、Windows Formsの知識を学ばれると良いのではないでしょうか。

    (Windows Formsはそろそろレガシーな代物にはなってきていますが…)

    また、[System.Windows.Forms.DialogResult] というのはWindows Formsで用いられる列挙体です。

    列挙体とは何か、プロパティとは何か、というのは、.NET Frameworkの知識となってきますので、そちらを理解する必要があるかと思います。.NET Frameworkを学ぶための言語には、C#が資料も多くお勧めです。

    (ただしVisual StudioでWindows Formsを扱う場合、Locationプロパティの指定等はフォームデザイナが自動生成する部分なので、解説書や解説サイトによっては力を入れて解説してない可能性も高いです)

    ただし、PowerShellで.NETのオブジェクトを作成する方法、列挙体を使う方法、プロパティを使う方法、Clickなどイベントを処理する方法等々はPowerShell特有の知識になってくるので、そちらも別途、身に着ける必要があります。

    結論的には、PowerShellでGUIを扱うのには、PowerShell以外にも前提知識が結構たくさん必要ということになるかと思います。


    2015年5月15日 20:21
    モデレータ

すべての返信

  • 順番を逆に考えればよいのでは?

    $datePickerButton.add_Click でtextboxに表示するのではなく、配列に追加してその配列の内容をtextboxに表示するようにするとか・・・

    2015年5月13日 6:02
  • 美凪2 さま よろしく。

    Selectを押すたびにテキストが上書きされてしまう とありますが、
    コードを拝見する限り、その様にお書きになっています。

      $outputBox.Text = $Calendar.SelectionStart


    変数等を別途用意し、それに収めて( SelectionStart.ToShortDateString() )、
    $outputBox には = $outputBox + 制御文字列 + 変数 で。

    尚、ご利用のクラスは期間を扱うコントロールですが、それで、宜しいのでしょうか。
    ちょっと、気になったので。

    • 回答としてマーク 美凪2 2015年5月14日 0:15
    2015年5月13日 8:25
  • こんな?

    #Form
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | out-null 
    $CalForm = New-Object Windows.Forms.Form ; $CalForm.Font = "MS UI Gothic,13" 
    $CalForm.text = "日付選択" 
    $CalForm.Size = New-Object Drawing.Size(500,280)
    #Calendar 
    $Calendar = New-Object System.Windows.Forms.MonthCalendar 
    $Calendar.MaxSelectionCount = 128 #連続した日数が必要?
    $Calendar.Location = "10,1" 
    $Calendar.SetCalendarDimensions([int]1,[int]1) 
    $CalForm.Controls.Add($Calendar) 
    $CalForm.Controls.Add($button) 
    $CalForm.Add_Shown($CalForm.Activate()) 
    $Calendar.ScrollChange = 1 
    #Select Button 
    $datePickerButton = New-Object System.Windows.Forms.Button 
    $datePickerButton.Location = "200,160" 
    $datePickerButton.Size = "75,23" 
    $datePickerButton.ForeColor = "DarkBlue" 
    $datePickerButton.BackColor = "White" 
    $datePickerButton.Text = "Select" 
    $datePickerButton.add_Click({ 
        #文字列を連結していく
        $outputBox.Text += $Calendar.SelectionStart.ToShortDateString() +"`r`n" #環境によって表示の仕方は変わる
    }) 
    $CalForm.Controls.Add($datePickerButton) 
    #TextBox 
    $outputBox = New-Object System.Windows.Forms.TextBox 
    $outputBox.Location = New-Object System.Drawing.Size(280,10) 
    $outputBox.Size = New-Object System.Drawing.Size(200,180) 
    $outputBox.MultiLine = $True 
    $outputBox.ScrollBars = "Vertical" 
    $outputBox.ReadOnly = $true #編集されると困る
    $CalForm.Controls.Add($outputBox) 
    #Clear Button 
    $ButtonClose = New-Object System.Windows.Forms.Button 
    $ButtonClose.Location = New-Object System.Drawing.Point(31,200) 
    $ButtonClose.Text = "OK" 
    $ButtonClose.Add_Click({
         $CalForm.DialogResult = [System.Windows.Forms.DialogResult]::OK
    }) 
    $CalForm.Controls.Add($ButtonClose) 
    $CalForm.showdialog() | Out-Null 
    #$Calendar.Selection 
    
    if($CalForm.DialogResult -eq [System.Windows.Forms.DialogResult]::OK){
        $array=$outputBox.Text.Trim() -split "`r`n" #最後の改行を捨ててから配列に分割
        $dates= $array | % {$_ -as [DateTime]} | Sort -Unique | % {$_.ToShortDateString() } # 日本式のyyyy/MM/ddじゃないと文字では正しく並ばないので、日時型に戻して並べ替え
        Write-Host $array
    }

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 美凪2 2015年5月14日 0:17
    2015年5月13日 9:15
  • その点も含めて検討します、ありがとうございます。

    2015年5月14日 0:04
  • 解決しました。

    すみません、「期間を扱うコントロール」である必要はありません。今そういうものであることを知りました。そこは調べてなんとかします。ありがとうございます。

    2015年5月14日 0:16
  • 解決しました。また、ReadOnlyである必要もあったので、助かりました。

    $Calendar.MaxSelectionCount も、不要です。いろいろありがとうございます。

    ご覧になっていたらどなたか教えていただきたいのですが、こういう [System.Windows.Forms.DialogResult] とか、

    $Calendar.Location のような 「プロパティ」のような活用のノウハウは、C#を入門から学べば身に付くでしょうか?

    (当方、bashしかわからない中でPowerShellに手を出し始めた者です)

    2015年5月14日 0:21
  • ご提示のコードは、.NET Frameworkに含まれているWindows Formsと呼ばれるGUIインターフェースを利用していますので、Windows Formsの知識を学ばれると良いのではないでしょうか。

    (Windows Formsはそろそろレガシーな代物にはなってきていますが…)

    また、[System.Windows.Forms.DialogResult] というのはWindows Formsで用いられる列挙体です。

    列挙体とは何か、プロパティとは何か、というのは、.NET Frameworkの知識となってきますので、そちらを理解する必要があるかと思います。.NET Frameworkを学ぶための言語には、C#が資料も多くお勧めです。

    (ただしVisual StudioでWindows Formsを扱う場合、Locationプロパティの指定等はフォームデザイナが自動生成する部分なので、解説書や解説サイトによっては力を入れて解説してない可能性も高いです)

    ただし、PowerShellで.NETのオブジェクトを作成する方法、列挙体を使う方法、プロパティを使う方法、Clickなどイベントを処理する方法等々はPowerShell特有の知識になってくるので、そちらも別途、身に着ける必要があります。

    結論的には、PowerShellでGUIを扱うのには、PowerShell以外にも前提知識が結構たくさん必要ということになるかと思います。


    2015年5月15日 20:21
    モデレータ
  • 牟田口さま、ご丁寧にありがとうございます。

    PowerShellはむやみやたらとアプリをインストールできない環境においては非常に助かるので、なんとか、頑張ってみます。ありがとうございます。

    2015年5月19日 7:51