Visual Basic

Home

Visual Basic Tutorial
Knowledge Developer Database Internet Resource
ActiveX Control
1. ActiveX Control
2. Common Dialog
3. Rich Text Box
4. SS Tab
 
Visual Basic Tutorial
1. Visual Basic 6
2. ฟอร์ม
3. Intrinsic Control
4. ตัวแปรและ Procedure
5. Class
6. Common Control1
7. Common Control2
8. ActiveX Control
9. Interface
10. ฐานข้อมูล
11. Database Control
 
Developer
Visual Basic
Microsoft Access
Microsoft Excel
 

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)

 

  

สงวนลิขสิทธิ (C) widebase