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

質問
-
こんにちは、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
回答
-
こんな?
#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
-
美凪2 さま よろしく。
Selectを押すたびにテキストが上書きされてしまう とありますが、
コードを拝見する限り、その様にお書きになっています。
$outputBox.Text = $Calendar.SelectionStart
変数等を別途用意し、それに収めて( SelectionStart.ToShortDateString() )、
$outputBox には = $outputBox + 制御文字列 + 変数 で。
尚、ご利用のクラスは期間を扱うコントロールですが、それで、宜しいのでしょうか。
ちょっと、気になったので。
- 回答としてマーク 美凪2 2015年5月14日 0:15
-
ご提示のコードは、.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以外にも前提知識が結構たくさん必要ということになるかと思います。
- 編集済み 牟田口大介Moderator 2015年5月15日 20:32
- 回答としてマーク 美凪2 2015年5月19日 7:47
すべての返信
-
美凪2 さま よろしく。
Selectを押すたびにテキストが上書きされてしまう とありますが、
コードを拝見する限り、その様にお書きになっています。
$outputBox.Text = $Calendar.SelectionStart
変数等を別途用意し、それに収めて( SelectionStart.ToShortDateString() )、
$outputBox には = $outputBox + 制御文字列 + 変数 で。
尚、ご利用のクラスは期間を扱うコントロールですが、それで、宜しいのでしょうか。
ちょっと、気になったので。
- 回答としてマーク 美凪2 2015年5月14日 0:15
-
こんな?
#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
-
-
ご提示のコードは、.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以外にも前提知識が結構たくさん必要ということになるかと思います。
- 編集済み 牟田口大介Moderator 2015年5月15日 20:32
- 回答としてマーク 美凪2 2015年5月19日 7:47