2015年7月7日火曜日

VB MonthCalendar って何

VB に限らず、フレームワークが提供する機能やコントロールは膨大です。
今迄、 MonthCalendar と言うコントロールは使いませんでした。
でも、ネット上の QA サイトを覗くと、 カレンダーの使用で、 この MonthCalendar の出番が多いみたいですね。
似たものに、DateTimePicker がありますが ... 。


私は、今迄、DateTimePicker は使った事がありましたが、 MonthCalendar は弄りませんでした。
必要に応じてカレンダーがポップアップする DateTimePicker に対して、
最初から、カレンダー表示になる MonthCalendar は便利に見えるのでしょうね。

でも、待って下さい。
元々、用意された背景が異なります。

DateTimePicker は 日付と時刻を、 MonthCalendar は 期間 を、 扱うコントロールです。

その挙動を確かめる為に、 以下のソースを書いて見ました。
   実際に、書いて見るのが一番!。  勿論、動かして見て、その動作を自分の目で確かめましょう。.

使うのは、 Visual Basic 2008 SP1 Express Edition です。  Windows 7 SP1 での表示を例示します。.
基本的には、最新版でも変わらないと思いますが、 実行時のカレンダー部分の表示は OS 任せで異なると思います。.


では、コード部分です。

Form デザイナーで、以下の Control を貼り付けます。
MonthCalendar 1、 Label 6 ( 取得用 4 / 画面用 2)、 NumericUpDown 2、 Button 2 です。
NumericUpDown と Button とは、表示サイズを小さく(狭く)しています。.



コードはこれです。  右枠外に飛び出していますので、スクロールして下さい。.

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Period Default
        Me.NumericUpDown1.Minimum = 1D
        Me.NumericUpDown1.Maximum = 31D
        Me.NumericUpDown1.Value = 7D

        ' Months Default
        Me.NumericUpDown2.Minimum = 1D
        Me.NumericUpDown2.Maximum = 3D
        Me.NumericUpDown2.Value = 1D

        ' Set Controls
        Me.Label1.Text = "SelectionRange.Start"
        Me.Label2.Text = "SelectionRange.End"
        Me.Label3.Text = "SelectionRange"
        Me.Label4.Text = "(Days Incl.Terminals)"
        Me.Label91.Text = "Period  " & Me.MonthCalendar1.MaxSelectionCount.ToString
        Me.Button1.Text = "Set"
        Me.Button1.Width = 40
        Me.Label92.Text = "Months " & Me.MonthCalendar1.CalendarDimensions.ToString
        Me.Button2.Text = "Set"
        Me.Button2.Width = 40

    End Sub


    Private Sub MonthCalendar1_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged
        Me.Label1.Text = "SelectionRange.Start : " & Me.MonthCalendar1.SelectionRange.Start.ToString()
        Me.Label2.Text = "SelectionRange.End   : " & Me.MonthCalendar1.SelectionRange.End.ToString
        Me.Label3.Text = "SelectionRange.      : " & vbCrLf & _
                                                     Me.MonthCalendar1.SelectionRange.ToString
        Me.Label4.Text = "(Days Incl.Terminals) :  " & _
                        (DateDiff(DateInterval.Day, Me.MonthCalendar1.SelectionRange.Start, Me.MonthCalendar1.SelectionRange.End) + 1).ToString

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.MonthCalendar1.MaxSelectionCount = CInt(Me.NumericUpDown1.Value)
        Me.Label91.Text = "Period  " & Me.MonthCalendar1.MaxSelectionCount.ToString
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Me.MonthCalendar1.CalendarDimensions = New Size(CInt(Me.NumericUpDown2.Value), 1)
        Me.Label92.Text = "Months " & Me.MonthCalendar1.CalendarDimensions.ToString
    End Sub

End Class

さて、これを実行すると。


こんな感じの画面が出て来ます。

Piriod が 指定可能な最大日数です。
Months が 画面一斉表示可能な月数です。

各々、MonthCalendar の標準設定の初期値ですね。
piriod に 1 を設定する事で、 期間ではなく1日の選択になります。


あっ、 忘れていました。

Piriod は  Me.MonthCalendar1.MaxSelectionCount 。
Months は Me.MonthCalendar1.CalendarDimensions 。

この ふたつに 値を指定する事で、 動作が変わります。
Button Handler で最初に指定している部分ですね。


このコード例では、横1列で3ヶ月までにしましたが、
実際には、縦横で指定が可能です。  詳しくは、Help 等を。.



では、横に3ヶ月にして見ましょう。  Months 右横の NumericUpDown を操作して 3 に変え、Set ボタンを押します。.
カレンダー部分が横長に延びて、Form を飛び出してしまうので、 ここでは、実行時に手動でフレームを 拡げています。
更に、期間を31日に増やしましたので、7/4 からドラッグして 8/15 まで伸ばすと、ちゃんと、31 日分が選択されます。



但し、この MonthCalendar の 悩ましい 処は、
月の左右の矢印 でカレンダーをスライドさせると、選択した日付が変わってしまう事です。

これは、Control の Property を操作しても、 如何様にも対処が出来ません!。
仕様! の ひと言 で、片付けられてしまう みたいですね。  トホホ。

面白いと言うか、変わった 挙動 を示すので、 是非、興味のある方は、このコードで動かして見て下さい。



0 件のコメント:

コメントを投稿