วันจันทร์ที่ 4 มกราคม พ.ศ. 2553

Month View

Month View

Month view เป็นตัว control แบบปฏิทิน ซึ่งมีความสัมพันธ์ที่ใกล้ชิดกับ Date time picker เช่น ใช้ Date time picker ที่ Month view ให้ผู้ใช้เปิดปฏิทินเพื่อเลือกวัน

การตั้งค่าคุณสมบัติเมื่อออกแบบ

เมื่อ วาง Month view ลงบนฟอร์มแล้วให้คลิกเมาส์ปุ่มขวาบนตัว control แล้วเลือกคำสั่ง Properties เพื่อเปิดไดอะล๊อกบ๊อกซ์ Property Pages ภายในแท็บ General คุณสมบัติ Value เป็นวันที่ ที่เลือกไว้ในตัว Control คุณสมบัติ MinDate และ MaxDate ใช้ตั้งค่าช่วงเวลาที่สามารถเลือกได้ใน Month view คุณสมบัติ StartOfWeek ใช้หาวันที่จะให้อยู่คอลัมน์ซ้ายสุด

คุณสมบัติ ที่เป็น Boolean มีผลต่อลักษณะภายนอกและพฤติกรรม ถ้า ShowWeekNumber ตั้งค่าเป็น True จะมีการแสดงหมายเลขของสัปดาห์ใน Month view ตั้งแต่ต้นปี ถ้า MultiSelect เป็น True ผู้ใช้สามารถเลือกช่วงของวันที่ ซึ่งจำนวนวันสูงสุดที่เลือกได้จะเท่ากับค่าของคุณสมบัติ MaxSelCount คุณสมบัติ ShowToday ให้แสดง Today legend
Month view สามารถแสดงได้ถึง 12 เดือน โดยจำนวนเดือนเป็นผลคูณของ MonthRows และ MonthColumns การปรับปรุงค่า ทำได้เมื่อกำหนดค่าคุณสมบัติ ScrollRate ไม่เป็นศูนย์
Month view มีคุณสมบัติเกี่ยวกับสีตามรูป ซึ่งตั้งค่าได้ในแท็บ Color ได้แก่ ForeColor, TitleForeColor, TitleBackColor, MonthBackColor และ TrailingForeColor

เนื่อง จาก Month view เป็นตัว control แบบ data-aware ที่สามารถรวมเข้ากับฟิลด์ที่มีประเภทข้อมูลเป็น Date จาก Data control, Remote Data control และ ADO Data control คุณสมบัติที่เกี่ยวข้องคือ DataSource, DataField, DataMember และ DataFormat

ข้อควรระวัง: ถ้าประยุกต์กับภาษาต่างๆ Month view สามารถปรับตัวอัตโนมัติ รวมการแปลชื่อเดือน และวันแต่ถ้ามีข้อบกพร่องของ Today legend ให้ตั้งค่า ShowToday เป็น False

การทำงานเมื่อเรียกใช้

ผู้ ใช้สามารถทำงานกับ Month view ได้หลายวิธีตามคุณสมบัติที่มีให้ เช่น การเลื่อนเดือนย้อนหลังหรือไปข้างหน้าด้วย การคลิกปุ่มลูกศร ที่ไตเติลของตัว control เลือกวันด้วยการคลิกที่วันที่ต้องการ หรือเลือกเป็นช่วงด้วยคลิกวันพร้อมกดปุ่ม Shift (ถ้า MultiSelect เป็น True) เป็นต้น

การดึงค่าวันปัจจุบัน

Month view มีคุณสมบัติ Value ที่ให้ผู้ใช้กำหนดค่าวันที่ต้องการอ่านหรือถึง แต่ไม่จำเป็นต้องดึงวัน, เดือน หรือปี จาก Value เพราะตัว control มีคุณสมบัติ Day, Month และ Year ที่กำหนดค่าได้สะดวก เช่น การแสดงเดือนก่อนหน้าหรือต่อไป

' mvwMonth As MonthView
Private Sub cmdPrev_Click()
If mvwMonth.Month > 1 Then
mvwMonth.Month = mvwMonth.Month - 1
Else
mvwMonth.Month = 12
mvwMonth.Year = mvwMonth.Year - 1
End If
End Sub

Private Sub cmdNext_Click()
If mvwMonth.Month < 12 Then
mvwMonth.Month = mvwMonth.Month + 1
Else
mvwMonth.Month = 1
mvwMonth.Year = mvwMonth.Year + 1
End If
End Sub

การกำหนดค่าให้คุณสมบัติ DayOfWeek ซึ่งส่งออกหมายเลขวันของวันที่เลือก เช่น การเลือกวันจันทร์ ในสัปดาห์ปัจจุบัน

mvwMonth.DayOfWeek = vbMonday

ข้อควรระวัง: ถ้าตัว control ได้รับโฟกัสและผู้ใช้คลิกที่ตัว Control อีกตัวบนฟอร์มเดียวกันตัว Control ได้รับโฟกัส แต่ไม่ใช่ Click event การแก้ไขให้ใช้ MouseDown event แทนที่ Click event

Dim MousePressed As Boolean

Private Sub cmdTryClick_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
MousePressed = True
DoSomething
End Sub

Private Sub cmdTryClick_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
MousePressed = False
End Sub

Private Sub cmdTryClick_Click()
' event นี้ควรตอบสนองกับ hot key หรือคลิกเมื่อโฟกัสไม่ได้อยู่บน month view
If Not MousePressed Then DoSomething
End Sub

Private Sub DoSomething()
MsgBox "Button has been clicked!"
End Sub

การตอบสนองในการเลือกเป็นช่วง

การ จำกัดช่วงของวันที่สำหรับการเลือก ให้กำหนดที่คุณสมบัติ Min และ Max และให้คุณสมบัติ MultiSelect เป็น True เพื่อยินยอมให้เลือกวันเป็นช่วงได้ การดึงช่วงที่เลือกใช้คุณสมบัติ SelStart และ SelEnd และจำนวนวันมากที่สุดในการเลือกขึ้นอยู่กับค่าของคุณสมบัติ MaxSelCount

แต่ ละครั้งที่ผู้ใช้เลือกวันใหม่ จะเกิด SelChange event ซึ่ง event นี้จะรับค่าวันเริ่มต้นและวันสิ้นสุดของช่วง และยอมให้โปรแกรมยกเลิกการทำงาน

Private Sub mvwMonth_SelChange(ByVal StartDate As Date, ByVal EndDate As Date, Cancel As Boolean)
Dim d As Date
For d = StartDate To EndDate
If Weekday(d) = vbSunday Or Weekday(d) = vbSaturday Then
Cancel = True
Exit For
End If
Next
End Sub

การหาขนาดที่เหมาะสม

การ แสดงปฏิทินเป็นหลายเดือน เช่น 6 เดือน หรือ 8 เดือน ขึ้นอยู่กับคุณสมบัติ MonthRows และ MonthColumns ถ้ามีการเปลี่ยนแปลงคุณสมบัติเหล่านี้ในขณะเรียกใช้อาจจะมีผลต่อขนาดของตัว Control ในการแสดงผล ซึ่งการหาค่าที่เหมาะสมสำหรับคุณสมบัติ MonthRows และ MonthColumns ทำได้โดยใช้เมธอด ComputerControlSize

Private Sub cmdTile_Click()
' หาค่าสำหรับการแสดงเดือนของ month view
Dim rows As Integer, cols As Integer
Dim wi As Single, he As Single
Dim fit As Boolean

For rows = 6 To 1 Step -1
For cols = 12 \ rows To 1 Step -1
mvwMonth.ComputeControlSize rows, cols, wi, he
If wi <= ScaleWidth - mvwMonth.Left And he < ScaleHeight - mvwMonth.Top Then
mvwMonth.MonthRows = rows
mvwMonth.MonthColumns = cols
fit = True
End If
If fit Then Exit For
Next
If fit Then Exit For
Next
End Sub

การไฮไลต์วันที่

Month view ให้มีการแสดงวันที่สนใจหรือวันที่เลือกด้วยการทำให้เป็นตัวหนา โดยใช้ procedure ของ GetDayBold event

Sub mvwMonth_GetDayBold(ByVal StartDate As Date, ByVal Count As Integer, State() As Boolean)

' ออกถ้า check box วันหยุดเลือกไม่ได้
If chkMarkHolidays.Value = vbUnchecked Then Exit Sub

Dim i As Long, d As Date
d = StartDate
For i = 0 To Count - 1
If Weekday(d) = vbSunday Then
' mark วันอาทิตย์
State(i) = True
ElseIf Month(d) = 12 And Day(d) = 25 Then
' คริสต์มาส
State(i) = True
ElseIf Month(d) = 4 And Day(d) = 13 Then
' สงกรานต์
State(i) = True
Else
' กำหนดวันหยุดอื่นๆ
End If
d = d + 1
Next
End Sub

GetDayBold รับพารามิเตอร์ 3 ตัว คือ StartDate สำหรับวันแรกที่จะแสดงออก, Count จำนวนที่ต้องการให้เห็นและ State เป็น Boolean array ที่ค่าเป็นศูนย์ของ Count

ดาวน์โหลดตัวอย่าง (Monview.vbp)

ไม่มีความคิดเห็น:

แสดงความคิดเห็น