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

Common Dialog

Common Dialog

Common dialog เป็นตัว control ที่ให้วิธีการที่ง่ายและสะดวกในการเกี่ยวข้องกับสี, ฟอนต์, Printer, File Open และ File Save dialog และรวมถึงการแสดงไฟล์ Help ตัว control นี้มีเฉพาะคุณสมบัติและเมธอด แต่ไม่มี event โดยส่วนใหญ่จะไม่มีการตั้งค่าคุณสมบัติ เมื่อเวลาออกแบบเพราะนิยมที่จะกำหนดค่าทั้งหมดในเวลาเรียกใช้ โดยเฉพาะอย่างยิ่งใช้ตัว control ตัวเดียวแสดงไดอะล๊อกบ๊อกซ์ที่แตกต่างกัน ตัว control จะมองไม่เห็นระหว่างการประมวลผล และอยู่ในไฟล์ COMDLG32.OCX ซึ่งต้องกระจายให้กับโปรแกรมประยุกต์ที่ใช้ และต้องมีการโหลดเข้ามา โดยเลือก Microsoft Common Dialog Control 6.0 (SP3) จากรายการในไดอะล๊อกบ๊อกซ์ Component

Common dialog มีการประยุกต์ที่ซับซ้อน เพราะสนับสนุนหลายตัวเลือก บางคุณสมบัติมีหลายความหมาย ขึ้นกับไดอะล๊อกที่ใช้ เช่น คุณสมบัติ Flags เป็นฟิลด์บิต ซึ่งแต่ละบิตมีความหมายแตกต่างกันตามไดอะล๊อก

ไดอะ ล๊อกทั้งหมดของ Common dialog มีคุณสมบัติร่วมกันจำนวนหนึ่งที่สัมพันธ์กับ Help โดยสามารถแสดงปุ่ม Help บนไดอะล๊อกบ๊อกซ์ และบอก Common dialog ควบคุมหน้าของไฟล์ Help ที่ต้องการเปิดเมื่อผู้ใช้คลิกปุ่ม Help คุณสมบัติ HelpFile เป็นชื่อสมบูรณ์ของไฟล์ Help คุณสมบัติ HelpConText เป็น Context ID ของหน้าที่ต้องการ และ HelpCommand เป็นการทำงานเมื่อมีการคลิกปุ่ม Help และต้องมีการตั้งค่าคุณสมบัติ Flags

' แสดงปุ่ม help
CommomDialog1.HelpFile = "C:\Program Files \Microsoft Office\Office\Graph9.hlp"
CommomDialog1.HelpContext = 12
CommomDialog1.HelpCommand = cdlHelpContext
' ค่าของคุณสมบัติ Flag ขึ้นกับ dialog
If ShowColorDialog Then
CommomDialog1.Flag = cdlCCHelpButton
CommomDialog1.ShowColor
ElseIf ShowFontDialog Then
CommomDialog1.Flag = cdlCFHelpButton
CommomDialog1.ShowFont
Else
' คำสั่งอื่นๆ
End If

Common dialog มี 6 เมธอด คือ ShowColor, ShowFont, ShowPrinter, ShowOpen, ShowSave และ ShowHelp แต่ละเมธอดใช้แสดงไดอะล๊อกบ๊อกซ์ แต่ละอย่าง

Color Dialog

Color dialog ให้ผู้ใช้เลือกสี และอนุญาตให้กำหนดสีเองได้ แต่ต้องการให้สิทธิกับผู้ใช้โดยกำหนดค่า 4- cdlCCPreventFullOpen ให้กับคุณสมบัติ Flags มีตัวเลือกในการแสดงส่วนของสีกำหนดเอง เมื่อไดอะล๊อก ปรากฏโดยตั้งค่าเป็นบิต 2-cdlCCFullOpen การ initiate สี ในไดอะล๊อกบ๊อกซ์ ทำได้โดยการส่งผ่านสี RGB ไปที่คุณสมบัติ Color และตั้งค่าบิต 1-cdlCCRGBInit ในคุณสมบัติ Flags

With CommonDialog1
' ป้องกันการแสดงที่เจาะจงเองของ dialog
.Flags = cdlCCPreventFullOpen Or cdlCCRGBInit
.Color = Text1.ForeColor
.CancelError = False
.ShowColor
Text1.ForeColor = .Color
End With

ถ้า มีการให้สีเริ่มต้นแล้ว ไม่จำเป็นต้องตั้งค่าคุณสมบัติ CancelError เป็น True เพราะถ้าผู้ใช้คลิกปุ่ม Cancel ค่าของคุณสมบัติจะไม่เปลี่ยน

Font Dialog

Font dialog ให้ผู้ใช้เลือกชื่อฟอนต์และคุณลักษณะ สามารถ initiate ค่าที่แสดงในไดอะล๊อกบ๊อกซ์ และพิจารณาปรับปรุงคุณลักษณะ ซึ่งขึ้นอยู่กับการเพิ่มคุณลักษณะใหม่เข้าสู่ตัว control และอ๊อบเจคในโปรแกรมประยุกต์

คุณลักษณะของฟอนต์สามารถ initiate ผ่านกลุ่มคุณสมบัติ คือ FontName, FontSize, FontBold, FontItalic, FontUnderLine, FontStrikeThru และ Color

คำสั่งในการปรับปรุงคุณลักษณะฟอนต์ของตัว control โดยจำขนาดจาก 8 ถึง 80

With CommonDialog1
.Flags = cdlCFScreenFonts Or cdlCFForceFontExist Or cdlCFEffects Or cdlCFLimitSize
.Min = 8
.Max = 80
.FontName = Text1.FontName
.FontSize = Text1.FontSize
.FontBold = Text1.FontBold
.FontItalic = Text1.FontItalic
.FontUnderline = Text1.FontUnderline
.FontStrikethru = Text1.FontStrikethru
.CancelError = False
.ShowFont
Text1.FontName = .FontName
Text1.FontBold = .FontBold
Text1.FontItalic = .FontItalic
Text1.FontSize = .FontSize
Text1.FontUnderline = .FontUnderline
Text1.FontStrikeThru = .FontStrikethru
End With

ใน กรณีนี้ ไม่ต้องการตั้งค่าคุณสมบัติ CancelError เป็น True เพราะผู้ใช้คลิกปุ่ม Cancel ตัว control จะไม่ปรับค่าใดในคุณสมบัติ FontXXXX และค่าคุณสมบัติ FontXXXX สามารถได้รับการกำหนดกลับไปยังตัว control โดยไม่มีผลที่ไม่คาดคิด

คำสั่งในการให้ผู้ใช้ปรับปรุงคุณลักษณะของ Rich text box

' dlgOpen As CommonDialog, rtfShowInfo As RidhTextBox
Private Sub cmdFont_Click()
' ไม่รวม vertical fonts.
Const CF_NOVERTFONTS = &H400000

On Error Resume Next

With dlgOpen
.CancelError = True
.Flags = cdlCFBoth Or cdlCFForceFontExist Or cdlCFEffects Or cdlCFLimitSize
If IsNull(rtfShowInfo.SelFontName) Then
.Flags = .Flags Or cdlCFNoFaceSel
Else
.FontName = rtfShowInfo.SelFontName
End If

If IsNull(rtfShowInfo.SelFontSize) Then
.Flags = .Flags Or cdlCFNoSizeSel
Else
.FontSize = rtfShowInfo.SelFontSize
End If

If IsNull(rtfShowInfo.SelBold) Or IsNull(rtfShowInfo.SelItalic) Then
.Flags = .Flags Or cdlCFNoStyleSel
Else
.FontBold = rtfShowInfo.SelBold
.FontItalic = rtfShowInfo.SelItalic
End If

If Not IsNull(rtfShowInfo.SelColor) Then
.Color = rtfShowInfo.SelColor
End If

.Min = 8
.Max = 80
.ShowFont

If Err = 0 Then
rtfShowInfo.SelFontName = .FontName
rtfShowInfo.SelBold = .FontBold
rtfShowInfo.SelItalic = .FontItalic
If (.Flags And cdlCFNoSizeSel) = 0 Then
rtfShowInfo.SelFontSize = .FontSize
End If
rtfShowInfo.SelUnderline = .FontUnderline
rtfShowInfo.SelStrikeThru = .FontStrikethru
rtfShowInfo.SelColor = .Color
End If
End With

End Sub

Printer Dialog

Common dialog สามารถแสดงไดอะล๊อกได้ 2 กลุ่ม คือ ไดอะล๊อกบ๊อกซ์ Print Setup ที่ยินยอมให้ผู้ใช้เลือกคุณลักษณะเครื่องพิมพ์ และไดอะล๊อกบ๊อกซ์ Print มาตรฐานที่ให้ผู้ใช้เลือกตัวเลือกของงานพิมพ์ เช่น ส่วนเอกสารที่ต้องการพิมพ์ (พิมพ์ทั้งหมด, ช่วงหรือที่เลือกปัจจุบัน), จำนวนของสำเนา เป็นต้น

การเลือกไดอะล๊อกบ๊อกซ์ ปรากฏโดยการตั้งค่า บิต cdlPDPrintSetup ในคุณสมบัติ Flags รายการของบิตสามารถตั้งในคุณสมบัติ Flags

เมื่อ แสดงไดอะล๊อกบ๊อกซ์เครื่องพิมพ์ คุณสมบัติ Min และ Max จะเป็นค่าน้อยที่สุดและมากที่สุดของค่า ที่มีอยู่สำหรับจำนวนหน้า ในขณะที่ From Page และ To Page เป็นค่าจริงที่แสดงในไดอะล๊อกบ๊อกซ์ ซึ่งค่าทั้งสองตั้งได้ เมื่อมีการตั้งค่าบิต cdlPDPageNums

คุณสมบัติ PrintDefault หาค่าอ๊อบเจคเครื่องพิมพ์ของ Visual Basic และจับคู่โดยอัตโนมัติกับเครื่องพิมพ์ที่เลือกโดยผู้ใช้ และควรตั้งบิตนี้เพื่อทำให้ง่ายในการพิมพ์ตั้งต่อไป ถ้าไม่มีการตั้งค่าบิตนี้ การดึงสารสนเทศเครื่องพิมพ์ต้องทำ โดยใช้การเรียก API ซึ่งมีความยุ่งยาก

ถ้ามีการแสดงไดอะล๊อกบ๊อกซ์ Print ปกติ ควรพิจารณาให้ปุ่ม Option ของ Pages และ Selection สามารถใช้ได้

' dlgOpen As CommonDialog, rtfShowInfo As RidhTextBox
Private Sub cmdPrinter_Click()
Dim saveSelStart As Long, saveSelLength As Long

On Error Resume Next
With dlgOpen
.CancelError = True
.Flags = cdlPDHidePrintToFile Or cdlPDNoPageNums Or cdlPDReturnDC
If rtfShowInfo.SelLength = 0 Then
' ถ้าไม่มีการเลือก ให้ disable ตัวเลือกบนไดอะล๊อก
.Flags = .Flags Or cdlPDNoSelection
Else
' กรณีอื่น ให้ "selection" เป็นตัวเลือกเริ่มต้น
.Flags = .Flags Or cdlPDSelection
End If
.ShowPrinter
If Err = 0 Then
If .Flags And cdlPDSelection Then
' ผู้ใช้ตัดสินใจ พิมพ์การเลือกปัจจุบัน
rtfShowInfo.SelPrint .hDC
Else
' ผู้ใช้ตัดสินใจ เลือกพิมพ์ข้อมูลที่มีอยู่
saveSelStart = rtfShowInfo.SelStart
saveSelLength = rtfShowInfo.SelLength
rtfShowInfo.SelStart = 0
rtfShowInfo.SelLength = 999999
' พิมพ์ด้วยเครื่องพิมพ์ ที่ส่งออกโดย common dialog
rtfShowInfo.SelPrint .hDC
' ฟื้นฟูการเลือกเดิม
rtfShowInfo.SelStart = saveSelStart
rtfShowInfo.SelLength = saveSelLength
End If
End If
End With
End Sub

File Open และ File Save Dialog

File Open dialog และ File Save dialog คล้ายกันมาก ที่สามารถอธิบายร่วมแต่มีหลายสิ่งที่แตกต่างกัน

คุณสมบัติร่วม

วิธี การกำหนดลักษณะภายนอกและพฤติกรรมของไดอะล๊อกบ๊อกซ์ File Open และ File Save ได้หลายวิธี เช่น คุณสมบัติ DialogTitle หาหัวข้อของไดอะล๊อกบ๊อกซ์ และคุณสมบัติ InitDir เป็นไดเรคทอรี่ ที่แสดงเมื่อไดอะล๊อกปรากฏ เมื่อไดอะล๊อกเปิดขึ้น คุณสมบัติ FileName เก็บชื่อของไฟล์ prompt เมื่อปิดไดอะล๊อก จะเก็บชื่อไดฟล์ที่เลือกโดยผู้ใช้ คุณสมบัติ DefaulExt สามารถกำหนดนามสกุลไฟล์ เพื่อทำให้ตัว control ส่งออกชื่อไฟล์สมบูรณ์ ให้คุณสมบัติ FileName ถึงแม้ว่าผู้ใช้จะไม่ได้พิมพ์นามสกุลไฟล์

สามารถ กำหนดการกรองไฟล์ให้ผู้ใช้เมื่อมีสำรวจโฟล์เดอร์ โดยการกำหนดคุณสมบัติ FilterCommon Dialog1.Filter = "All Files / *.* / Bitmaps / *.bmp / Meta Files / *.wmf ; *emf"

สามารถใช้คุณสมบัติ FilterIndex
CommonDialog1.FilterIndex = 2

การ ทำงานกับไดอะล๊อกบ๊อกของ File Open หรือ File Save ควรตั้งค่าคุณสมบัติ CancelError เป็น True เพราะต้องการวิธีการหาผู้ใช้ยกเลิกการทำงานกับไฟล์

File Save Dialog

File Save dialog มีวิธีการทำงานที่ง่ายกว่า File Open dialog ตามตัวอย่างฟังก์ชัน SaveTextControl

Function SaveTextControl(txtBox As Control, dlg As CommonDialog, Filename As String) As Boolean
Dim filenum As Integer
On Error GoTo ExitNow

dlg.Filter = "All files (*.*)|*.*|Text files|*.txt"
dlg.FilterIndex = 2
dlg.DefaultExt = "txt"
If TypeName(txtBox) = "RichTextBox" Then
dlg.Filter = dlg.Filter & "|RTF files|*.rtf"
dlg.FilterIndex = 3
dlg.DefaultExt = "rtf"
End If

dlg.Flags = cdlOFNHideReadOnly Or cdlOFNPathMustExist Or _
cdlOFNOverwritePrompt Or cdlOFNNoReadOnlyReturn
dlg.DialogTitle = "Select the destination file "
dlg.Filename = Filename
' ออก ถ้าผู้ใช้กดปุ่ม cancel
dlg.CancelError = True
dlg.ShowSave
Filename = dlg.Filename
' เขียนข้อมูลของตัว control
filenum = FreeFile()

Open Filename For Output As #filenum
If TypeName(txtBox) = "RichTextBox" Then
Print #filenum, txtBox.TextRTF;
Else
Print #filenum, txtBox.Text;
End If
Close #filenum
' แสดงการทำงานสำเร็จ
SaveTextControl = True

ExitNow:

End Function

สามารถใช้คำสั่งจากฟังก์ชัน SaveTextControl

Dim File Name As String
If SaveTextControl (RichTextBox1, CommonDialog1, File Name) Then
MsgBox "ข้อความได้รับการบันทึกไปที่ไฟล์ " & File name
End If

เมื่อ มีการออกจากไดอะล๊อกบ๊อกซ์ของ File Save (และ File Open) สามารถทดสอบบิต cdlFNExtensionDifferent ของคุณสมบัติ Flags ในกรณีที่ต้องการทราบถึงการเลือกไฟล์มีนามสกุลไฟล์ที่แตกต่างจากคุณสมบัติ DefaulText

If CD.Flags and cdlFNextensionDifferent Then
'ประมวลผล นามสกุลไฟล์ที่ไม่อยู่ในมาตรฐาน
End If

การเลือกแบบ Single ใน File Open Dialog

Common dialog สนับสนุนการเลือกของ File Open ทั้งแบบ single และ multiple โดยการเลือกแบบ Single ไม่แตกต่างจาก File Save dialog ยกเว้นการกำหนดบิตของคุณสมบัติ Flags ต่างกัน

Function LoadTextControl(txtBox As Control, dlg As CommonDialog, _
Filename As String) As Boolean
Dim filenum As Integer
On Error GoTo ExitNow

dlg.Filter = "All files (*.*)|*.*|Text files|*.txt"
dlg.FilterIndex = 2
dlg.DefaultExt = "txt"
If TypeName(txtBox) = "RichTextBox" Then
dlg.Filter = dlg.Filter & "|RTF files|*.rtf"
dlg.FilterIndex = 3
dlg.DefaultExt = "rtf"
End If
dlg.Flags = cdlOFNHideReadOnly Or cdlOFNFileMustExist Or _
dlOFNNoReadOnlyReturn
dlg.DialogTitle = "Select the source file "
dlg.Filename = Filename
' ออก ถ้าผู้ใช้กดปุ่ม cancel
dlg.CancelError = True
dlg.ShowOpen
Filename = dlg.Filename

' อ่านข้อมูลของไฟล์ไปที่ตัว control
filenum = FreeFile()
Open Filename For Input As #filenum
If TypeName(txtBox) = "RichTextBox" Then
txtBox.TextRTF = Input$(LOF(filenum), filenum)
Else
txtBox.Text = Input$(LOF(filenum), filenum)
End If
Close #filenum
' แสดงการทำงานสำเร็จ
LoadTextControl = True

ExitNow:

End Function

ถ้า ไม่มีการระบุบิต cdlOFNHideReadyOnly ในคุณสมบัติ Flags ไดอะล๊อกบ๊อกซ์จะแสดง Check box ของ Read-Only เพื่อค้นหาการคลิก Check box ของผู้ใช้ให้ทดสอบคุณสมบัติ Flags

If CD.Flags And cdlOFNReadOnly Then
' ไฟล์ได้รับการเปิดในโหมดอ่านอย่างเดียว (read-only)
' ( เช่น ไม่ให้ใช้คำสั่ง File Save)
End If

การเลือกแบบ Multiple ใน File Open Dialog

การ เลือกแบบ multiple ของ File Open dialog มีความซับซ้อนกว่าแบบ single ต้องมีการระบุการเปิดไดอะล๊อกบ๊อกซ์ การเลือกไฟล์แบบ multiple ด้วยตั้งค่าบิต cdlOFNAllowMultiSelect ของคุณสมบัติ Flags เพื่อทำให้ไฟล์ทั้งหมดที่ผู้ใช้เลือกได้รับการต่อเป็นข้อความเดียวและส่งไป ให้คุณสมบัติ FileName

ตามปกติ File Open dialog ทำงานกับข้อความไม่เกิน 256 ตัวอักษร ถ้าชื่อไฟล์ที่เลือกยาวกว่าข้อจำกัดจะเกิดความผิดพลาด การแก้ไขผิดพลาดนี้สามารถกำหนดค่าคุณสมบัติ MaxFileSize ให้สูงขึ้น เช่น ให้เป็น 10 KB

CommonDialog.MaxFileSize = 10240

Function SelectMultipleFiles(dlg As CommonDialog, Filter As String, _
Filenames() As String) As Boolean
On Error GoTo ExitNow

dlg.Filter = "All files (*.*)|*.*|" & Filter
dlg.FilterIndex = 1
dlg.Flags = cdlOFNAllowMultiselect Or cdlOFNFileMustExist Or cdlOFNExplorer
dlg.DialogTitle = "Select one or more files"
dlg.MaxFileSize = 10240
dlg.Filename = ""
' ออก ถ้าผู้ใช้กดปุ่ม cancel
dlg.CancelError = True
dlg.ShowOpen
' กระจายผลลัพธ์เพื่อดึงชื่อไฟล์
Filenames() = Split(dlg.Filename, vbNullChar)
' แสดงการทำงานสำเร็จ
SelectMultipleFiles = True

ExitNow:

End Function

Help Windows

Common dialog สามารถนำมาใช้ในการแสดงสารสนเทศของไฟล์ Help ได้ ในกรณีนี้จะไม่มีไดอะล๊อกบ๊อกซ์ปรากฏ และมีคุณสมบัติที่ใช้เพียงเล็กน้อย ให้กำหนดคุณสมบัติ HelpFile ด้วยชื่อไฟล์ และพาร์ทตั้งค่าของคุณสมบัติ HelpCommand

การแสดงไฟล์ Help

With CommonDialog1
' ตำแหน่งไฟล์ขึ้นกับตำแหน่งจริง
.HelpFile = "C:\Program Files\Common Files\Microsoft Shared\Dao\Dao35.hlp"
.HelpCommand = cdlHelpContents
.ShowHelp
End With

ถ้าต้องการแสดงเพจที่สัมพันธ์กับคีย์เวิร์ด และคีย์เวิร์ดของคุณสมบัติ HelpKey ไม่ตรงกับเพจที่มีอยู่

With CommonDialog1
' ตำแหน่งไฟล์ขึ้นกับตำแหน่งจริง
.HelpFile = "C:\Program Files\Common Files\Microsoft Shared\Dao\Dao35.hlp"
.HelpCommand = cdlHelpKey
.HelpKey = "BOF property"
.ShowHelp
End With

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

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

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