VB=>Next5

เตรียมการ Drop ตัว Control ต้นทาง 

ระหว่างการ drag ดำเนินอยู่ Visual Basic จะเกิด OLEDragOver สำหรับตัว control ที่เมาส์อยู่บนตัว control นั้น event นี้รับอ๊อบเจค DataObject และค่า Effect ที่ตั้งโดยตัว control ต้นทาง และสารสนเทศ ตำแหน่งเมาส์และสถานของปุ่ม 

Private Sub lstWords_OLEDragOver(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)
   ’ เลือก copy ถ้าทำได้ กรณีอื่นเลือก move
   If Not Data.GetFormat(vbCFText) Then
      ’ source ตัว control ต้นทางไม่ส่งออกเป็นรูปแบบ text
      Effect = 0
   ElseIf Effect And vbDropEffectCopy Then
      Effect = vbDropEffectCopy
   ElseIf Effect And vbDropEffectMove Then
      Effect = vbDropEffectMove
   End If
   ’ เปลี่ยนพื้นหลังของ list box เมื่อเมาส์อยู่เหนือ list box
   If State = vbLeave Then
      ’ เปลี่ยนกลับเมื่อเมาส์ออกไปแล้ว
      lstWords.BackColor = vbWindowBackground
   ElseIf Effect 0 And State = vbEnter Then
      ’ เปลี่ยนสีพื้นหลังเมื่อ entry
      lstWords.BackColor = vbYellow
   End If
End Sub 

event ที่เกิดต่อจาก OLEDragOver event สำหรับตัว control ต้นทางคือ OLEGiveFeedBack event ซึ่ง event ที่ตัว control ต้นทาง จะรับรู้การเลือก Effect จากตัว control ปลายทางและเปลี่ยนเคอร์เซอร์ของเมาส์ 

Private Sub lstWords_OLEGiveFeedback(Effect As Long, DefaultCursors As Boolean)
   If Effect = vbDropEffectCopy Then
      DefaultCursors = False
      Screen.MousePointer = vbCustom
      Screen.MouseIcon = imgCopy.Picture
   Else
      DefaultCursors = True
   End If
End Sub 

พารามิเตอร์ DefaultCursors ควรตั้งค่าเป็น False 

การวางข้อมูล 

เมื่อผู้ใช้ปล่อยปุ่มเมาส์ เหนือตัว control ปลายทาง Visual Basic จะให้เกิด OLEDragDrop event สำหรับตัว control ปลายทาง Event นี้จะรับพารามิเตอร์เหมือนกับ OLEDragOver event 

Private Sub lstWords_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
   ’ เปลี่ยนกลับสีพื้นหลังที่ถูกต้อง
   lstWords.BackColor = vbWindowBackground
   ’ เลือก copy ถ้าทำได้ กรณีอื่นเลือก move
   If Effect And vbDropEffectCopy Then
      Effect = vbDropEffectCopy
   ElseIf Effect And vbDropEffectMove Then
      Effect = vbDropEffectMove
   End If
   ’ ขอข้อมูล – เฉพาะการสนับสนุน plain text
   Dim text As String, w As Variant
   text = Data.GetData(vbCFText)
   ’ เพิ่มช่องว่างท้ายคำเพื่อทำให้มั่นใจว่าคำสุดท้ายได้รับการแยกอย่างถูกต้อง
   text = text & ” “ 

‘ กระจายข้อความและแยกแต่ละคำ
Dim i As Long, start As Long, words As New Collection
On Error Resume Next 

   For i = 1 To Len(text)
      If Mid$(text, i, 1) Like “[!A-Za-z0-9]” Then
         If start Then
            ’ เพิ่มคำใน collection แต่ไม่สนใจคำซ้ำ
            w = Mid$(text, start, i – start)
            words.Add w, w
            start = 0
         End If
      ElseIf start = 0 Then
         ’ ถ้าพบคำใหม่
         start = i
      End If
   Next 

   ’ เพิ่มคำทั้งหมดใน list box
   lstWords.Clear
   For Each w In words
      lstWords.AddItem w
   Next
End Sub 

เมื่อ OLEDragDropevent ได้รับการประมวล Visual Basic จะให้ตัว control ต้นทางเกิด OLECompleteDrag event 

Private Sub rtfText_OLECompleteDrag(Effect As Long)
   If Effect = vbDropEffectMove Then
      ’ การ move ลบข้อความที่ไฮไลต์
      rtfText.SelText = “”
   Else
      ’ การ copy ยกเลิกการเลือก clear the selection
      rtfText.SelLength = 0
   End If
End Sub 

การโหลดข้อมูลตามคำสั่ง 

ถ้าตัว control ต้นทางสนับสนุนข้อมูลหลายรูปแบบ การโหลดข้อมูลไปที่อ๊อบเจค Data ใน OLEStartDrag ไม่ใช่วิธีการที่มีประสิทธิภาพ แต่ Visual Basic สนับสนุนวิธีการอื่น โดยใช้ OLESetData event และเปลี่ยนจากการโหลดข้อมูลให้อ๊อบเจค DataObject เมื่อมีการ drag เป็นการระบุรูปแบบที่สนับสนุน 

Private Sub rtfText_OLEStartDrag(Data As RichTextLib.DataObject, AllowedEffects As Long)
   ’ ใช้การเลือกข้อความหรือข้อความทั้งหมดถ้าไม่มีการเลือก
   If chkLoadOnDemand Then
      ’ แจ้งถึงรูปแบบที่ตัว control สนับสนุน
      Data.SetData , vbCFRTF
      Data.SetData , vbCFText
   ElseIf rtfText.SelLength Then
      Data.SetData rtfText.SelRTF, vbCFRTF
      Data.SetData rtfText.SelText, vbCFText
   Else
      Data.SetData rtfText.TextRTF, vbCFRTF
      Data.SetData rtfText.text, vbCFText
   End If
   AllowedEffects = vbDropEffectMove Or vbDropEffectCopy
End Sub 

ถ้าต้องการ drag-and-drop ไม่ได้ถูกยกเลิก ตัว control ปลายทางจะให้เมธอด GetData รับข้อมูลตามรูปแบบที่กำหนด Visual Basic จะทำให้เกิด OLESetData event สำหรับตัว control ต้นทาง 

Private Sub rtfText_OLESetData(Data As RichTextLib.DataObject, DataFormat As Integer)
   ’ event นี้เกิดเฉพาะถ้า chkLoadOnDemand ได้รับการเลือก when
   ’ เมื่อตัว control เป้าหมายใช้ the Data’s GetData method
   If DataFormat = vbCFText Then
      If rtfText.SelLength Then
         Data.SetData rtfText.SelText, vbCFText
      Else
         Data.SetData rtfText.text, vbCFText
      End If
    ElseIf DataFormat = vbCFRTF Then
      If rtfText.SelLength Then
         Data.SetData rtfText.SelRTF, vbCFRTF
      Else
         Data.SetData rtfText.TextRTF, vbCFRTF
      End If
   End If 

End Sub 

Oct 09

MDI Forms

หัวข้อพิเศษไอที, VB 6.0 No Comments »

MDI ย่อมาจาก Multiple Document Interface และเป็นการอินเตอร์เฟซกับผู้ใช้ที่มีการใช้ในโปรแกรมประยุกต์ ในชุด Microsoft Office โปรแกรมประยุกต์จำนวนมากได้ใช้การอินเตอร์เฟซแบบ MDI ถ้าโปรแกรมประยุกต์ที่พัฒนาขึ้นมามีความเกี่ยวข้องกับเอกสารจำนวนมากในเวลาเดียวกัน การอินเตอร์เฟซ MDI จะเป็นการเลือกที่ดี 

โปรแกรมประยุกต์ MDI 

การสร้างโปรแกรมประยุกต์ MDI ทำได้ง่าย ในการเริ่มต้นให้เพิ่มโมดูล MDI Form เข้าไปยัง project ปัจจุบัน ซึ่งโมดูล MDI Form คล้ายกับโมดูลฟอร์มธรรมดา แต่มีข้อแตกต่างเล็กน้อย คือ 

  • โมดูล MDI Form มีเพียง 1 โมดูล ต่อ project 
  • ไม่สามารถวางตัว control ส่วนโดยตรงที่ MDI Form โดยให้สร้างเมนู ตัว control ที่มองไม่เห็น (เช่น timer และ Common Dialog) และตัว control ที่สนับสนุนคุณสมบัติ Align (เช่น Picture box, Tool bar และ Status bar) การแสดงตัว control อื่น ๆ บน MDI Form ให้วางในตัว control ประเภท container ตามปกติ คือ Picture box 
  • ไม่สามารถแสดงข้อความหรือกราฟฟิกบนผิว MDI Form 

MDI child forms 

อ๊อบเจค MDI Form จะเก็บฟอร์มลูก 1 ฟอร์ม หรือมากกว่า การสร้างฟอร์มลูกทำได้โดยการสร้างฟอร์มธรรมดาเข้าไปใน project และตั้งค่าคุณสมบัติ MDIChild เป็น True ไอคอนของฟอร์มใน Window ของ Project Explorer จะเปลี่ยน
ฟอร์มลูก MDI จะไม่แสดงภายนอกฟอร์มแม่ MDI Form ถ้าฟอร์มลูก MDI เป็นฟอร์มเริ่มต้นสำหรับโปรแกรมประยุกต์ ฟอร์มแม่ MDI Form จะได้รับการโหลดโดยอัตโนมัติ และแสดงก่อนที่ฟอร์มลูกจะมองเห็น instance ของ ฟอร์มลูก MDI สร้างด้วยการใช้คีย์เวิร์ด New 

‘ ภายใน โมดูล MDI Form
Private Sub mnuFileNew_Click ( )
   Dim frmDoc As New frmDocument
   frmDoc.Show
End Sub 

 

โมดูล MDI Form สนับสนุนคุณสมบัติ AutoShowChildren ถ้าคุณสมบัตินี้เป็น True ฟอร์มลูกจะปรากฏขึ้นภายในฟอร์มแม่ตลอดเวลาที่มีการโหลดฟอร์มแม่ และไม่สามารถซ่อนได้ ถ้าไม่กำหนดคุณสมบัติเป็น False
ฟอร์มลูก MDI มีลักษณะพิเศษบางประการ เช่น ไม่แสดงแถบเมนู ถ้ามีการเพิ่มเมนูระดับสูงไปที่ฟอร์มฟอร์มลูก เมื่อฟอร์มแอ๊คทีฟ แถบเมนูจะไปแทนที่แถบเมนูของฟอร์มแม่ MDI Form การปรับปรุงเมนูทำได้เฉพาะโมดูล หลักของ MDI Form 

เมื่อคำสั่งเมนูเกี่ยวข้องในโมดูล MDI Form ให้ประยุกต์เข้าไปที่ฟอร์มลูกที่กำลังแอ๊คทีฟ โดยใช้คุณสมบัติ ActiveForm 

Private Sub mnuFileClose_Click ( )
   If Not (ActiveForm Is Nothing) Then Unload ActiveForm
End Sub 

คุณสมบัติ ActiveForm ต้องมีการตรวจอยู่เสมอ เพื่อทำให้ทราบถึงฟอร์มปัจจุบัน 

Private Sub mnuFilePrint_Click ( )
   If TypeOf ActiveForm Is frmDocument Then
      Printer.Print ActiveForm.txtText.Text
      Printer.EndDoc
   Else
      Printer.Print ActiveForm.picBitmap.Picture, 0, 0
      Printer.EndDoc
   End If
End Sub 

เมนู Window 

โมดูล MDI สนับสนุนเมธอด Arrange ซึ่งไม่มีในฟอร์มธรรมดา เมธอดนี้ช่วยในการจัดฟอร์มลูกใน MDI Form โดยสามารถจัดตามแนวนอนหรือแนวตั้ง การจัดแบบ cascading หรือฟอร์ม minimized ให้เรียงลำดับที่ด้านล่างของฟอร์มแม่ MDI Form 

Private Sub mnuWindowArrangeIcons_Click()
   Me.Arrange vbArrangeIcons
End Sub 

Private Sub mnuWindowCascade_Click()
   Me.Arrange vbCascade
End Sub 

Private Sub mnuWindowTileHorizontal_Click()
   Me.Arrange vbTileHorizontal
End Sub 

Private Sub mnuWindowTileVertical_Click()
   Me.Arrange vbTileVertical
End Sub 

Tip: การจัดเรียงด้วยเมธอด Arrange สามารถใช้ตัวเลือก WindowList ใน Menu Editor สำหรับเมนู window 

Polymorphic MDI Containers 

โปรแกรมประยุกต์ MDI ตามตัวอย่างได้กล่าวถึงฟังก์ชันอย่างสมบูรณ์ แต่ไม่ได้เป็นตัวอย่างที่ดี ในการออกแบบสำหรับ Object-Oriented programming ตามความจริง MDI Form ได้ทำลาย encapsulated ของฟอร์มลูก เพราะเข้าถึงคุณสมบัติของ txtEditor โดยตรง แต่สามารถปรับปรุงตามแนวคิด encapsulation ได้กำหนดการอินเตอร์เฟซระหว่างฟอร์มแม่กับลูก
ถ้าไม่ต้องการให้ฟอร์มแม่ MDI Form เข้าถึงฟอร์มลูกโดยตรง สามารถใช้การกำหนดอินเตอร์เฟซให้ติดต่อผ่านอีกฟอร์มหนึ่ง เช่น แทนที่การควบคุมการโหลดและบันทึกข้อความด้วยคุณสมบัติของ txtEditor แต่ให้ฟอร์มแม่ MDI Form ตามฟอร์มลูกในการโหลดหรือบันทึกไฟล์เช่นเดียวกับการตัด คัดลอก และวางข้อมูลด้วยตัว control ชื่อ txtEditor ให้ฟอร์มแม่ MDI Form ปลุกเมธอดในฟอร์มลูกให้ทำงาน ตามตัวอย่าง MDI Notepad ใช้คำสั่ง Save As บนไฟล์เมนูในฟอร์มแม่ MDI 

Private Sub mnuFileSaveAs_Click()
‘ ถาม document เพื่อแสดง common dialog แล้วบันทึกไฟล์ด้วยชื่อที่ผู้ใช้เลือก
On Error Resume Next
   ActiveForm.SaveFile ActiveForm.AskFilename(True)
End Sub 

การเปลี่ยนเครื่องมือฟอร์มลูกข่าย 

เมื่อมีการปรับปรุงให้ฟอร์มแม่ MDI ทำงานกับฟอร์มลูก MDI แบบ encapsulation ทำให้การเปลี่ยนเครื่องมือในฟอร์มลูกข่ายทำได้โดยอิสระ และไม่มีผลกับโปรแกรมประยุกต์ที่เหลือ เช่น การเปลี่ยนโปรแกรม MDI Notepad เป็นโปรแกรมประยุกต์ MDI Image viewer ในกรณีที่ฟอร์มลูก MDI มี picture box และปรับปรุงเครื่องมือของคุณสมบัติและเมธอดทั้งของการอินเตอร์เฟชระหว่างการสื่อสารระหว่างแม่กับลูก เช่น เมธอด PrintDoc ได้เปลี่ยนเป็น 

Sub PrintDoc()
   Printer.NewPage
   Printer.PaintPicture picBitmap.Picture, 0, 0
   Printer.EndDoc
End Sub 

การปรับปรุงจากโปรแกรมประยุกต์ MDI Document เป็นโปรแกรมประยุกต์ MDI Image viewer เป็นการเปลี่ยนคำสั่งไม่กี่บรรทัด และไม่จำเป็นต้องแก้ไขคำสั่งในโมดูล frmMain ซึ่งเป็นการฟอร์มแบบใช้ใหม่ได้ของฟอร์มแม่ MDI แบบ Polymorphic การปรับปรุงฟอร์มลูก สามารถประยุกต์เป็น container ในการทำงานที่แตกต่างกันได้ 

Application Wizard 

Application Wizard เป็นเครื่องมือในการสร้างฟอร์ม และส่วนประกอบต่าง ๆ ของ Visual Basic มีการแนะนำตั้งแต่ Visual Basic 5 สำหรับการสร้างฟอร์มต่าง ๆ เช่น ฟอร์ม Login ใน Visual Basic 6 ได้เพิ่มการทำงานที่กว้างขวางและการใช้ Toolbar Wizard และ Form Wizard ที่กว้างขวาง
การสร้าง Project ด้วย Application wizard มีขั้นตอน คือ 

1. ที่เมนู File เลือกคำสั่ง New Project 

2. บนหน้าจอจะแสดงไดอะล๊อกบ๊อกซ์ Add Project ให้เลือกไอคอน VB Application Wizard แล้วคลิก OK 

3. บนหน้าจอจะเป็น Wizard ขั้นตอนที่ 1 เป็นการเลือกข้อมูลเดิมถ้ามีการเก็บอยู่ใน Profile แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

4. Wizard ขั้นตอนที่ 2 เป็นการเลือกประเภทของฟอร์ม และตั้งชื่อ Project คลิก Next เพื่อไปขั้นตอนต่อไป 

5. Wizard ขั้นตอนที่ 3 เป็นการเลือกสร้าง เมนูและเมนูย่อย แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

6. Wizard ขั้นตอนที่ 4 เป็นการเลือกสร้างแถบเครื่องมือ แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

7. Wizard ขั้นตอนที่ 5 เป็นการเลือกนำเข้าไฟล์ Resource เข้ามาใช้ในโปรแกรมประยุกต์ ถ้าต้องการให้คลิกที่ปุ่มตัวเลือก Yes แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

8. Wizard ขั้นตอนที่ 6 เป็นการกำหนดการใช้ Browser สำหรับการใช้อินเตอร์เน็ตในโปรแกรม แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

9. Wizard ขั้นตอนที่ 7 เป็นการเลือกฟอร์มมาตรฐานที่มีให้เข้ามาใช้ในโปรแกรม แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

10. Wizard ขั้นตอนที่ 8 สำหรับการประยุกต์ฐานข้อมูล ถ้าไม่มีฟอร์มที่ติดต่อกับฐานข้อมูลสามารถใช้ Wizard นี้ โดยคลิกที่ปุ่ม Create New Form ซึ่งจะพบ Wizard ของ Data Form Wizard แล้วคลิก Next เพื่อไปขั้นตอนต่อไป 

11. Wizard ขั้นตอนที่ 9 การสร้าง Project เสร็จเรียบร้อย ถ้าต้องการเก็บข้อมูลเป็น profile ไว้ให้ตั้งชื่อ แล้วคลิก Finish ยืนยันเสร็จสิ้นการสร้าง 

12. เมื่อเปิดดู Project จะพบฟอร์มต่างที่เลือกพร้อมส่วนการทำงานต่างๆ เช่น ตามตัวอย่าง เลือกประเภทฟอร์ม เป็น MDI เลือกไฟล์มาตรฐาน About

Oct 09

SS Tab

หัวข้อพิเศษไอที, VB 6.0 No Comments »

SS tab เป็นตัว control ที่ยอมให้สร้างไดอะล๊อกบ๊อกซ์ Tab ซึ่งเกือบเหมือนกับ Tab strip แต่มีความแตกต่างที่สำคัญระหว่างตัว control นี้ คือ SS tab เป็น container ทำให้สามารถวางตัว control ลูกได้โดยตรงบนผิว และสามารถเปลี่ยนหน้า Tab ระหว่างการออกแบบ ทำให้งานที่เตรียมตัว control มีความง่ายและสะดวกมากกว่า Tab strip การทำงานกับ SS tab ทำได้ง่ายเพราะตัว control ไม่เก็บอ๊อบเจคที่ขึ้นต่อ และไวยากรณ์ของคุณสมบัติและ event ตรงไปตรงมา 

SS tab อยู่ในไฟล์ TABCTL32.OCX ซึ่งต้องกระจายไปกับโปรแกรมประยุกต์ที่ใช้ตัว control นี้ และต้องมีการโหลดเข้ามา โดยเลือก Microsoft Tabbed Dialog Control 6.0 จากรายการในไดอะล๊อกบ๊อกซ์ Component ส่วน tool บน Toolbox คือ 

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

เมื่อมีการวางตัว control ลงบนฟอร์มแล้ว ที่แท็บ General คุณสมบัติ Style เป็นคุณสมบัติแรกที่ควรเปลี่ยนจากค่าเริ่มต้น 0-ssStyleTabbedDialog เป็นรูปที่ทันสมัยกว่าด้วยค่า 1-ssStylePropertyPage แต่จะไม่สามารถเปลี่ยนค่าเริ่มต้นได้ ถ้าตั้งค่าคุณสมบัติ TabOrientation 

การเพิ่มหรือลบหน้าแท็บใช้การเปลี่ยนค่าในฟิลด์ TabCount และสร้างแถวแท็บเป็นแบบหลายแถว ด้วยการตั้งค่าที่เหมาะสมสำหรับคุณสมบัติ TabsPerRow การย้ายระหว่างแท็บ สามารถใช้ปุ่ม spin และปรับปรุงคุณสมบัติ Caption (คุณสมบัติจะแสดงฟิลด์ เฉพาะแท็บปัจจุบัน) และสามารถใช้ตัวอักษร & เพื่อกำหนดเป็น hot key
คุณสมบัติ TabHeight เป็นความสูงในหน่วย twips ของแท็บทั้งหมดในตัว control คุณสมบัติ TabMaxWidth มีความกว้างมากที่สุด คุณสมบัติ WordWrap ควรตั้งเป็น True เพื่อล้อม caption ถ้าคุณสมบัติ ShowFocusRect เป็น True โฟกัสรูปสี่เหลี่ยมจะปรากฏบนแท็บที่ได้รับโฟกัส
ที่แท็บ Picture สามารถกำหนดภาพขนาดเล็กด้วยการคลิกบนคุณสมบัติ Picture ที่ซ้ายสุดของ List box และเลือกบิตแม็บหรือไอคอนที่ต้องการกำหนดให้กับแท็บปัจจุบัน ภาพที่ใช้สามารถอ้างถึงในคำสั่งด้วยคุณสมบัติ TabPicture 

ข้อควรระวัง: ตัว control ที่วางลงไปทั้งหมดอยู่ใน container เดียวของ SS tab ไม่ขึ้นกับหน้าแท็บ ทำให้ตัว control เช่น Option button ถ้ามี 2 กลุ่มในหน้าแท็บที่ต่างกับ 2 หน้า ควรวางแต่ละกลุ่มให้อยู่คนละ frame หรือคนละ container 

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

คุณสมบัติหลักของ SS tab คือแท็บซึ่งส่งค่าดัชนีของแท็บปัจจุบันที่เลือกโดยผู้ใช้ ซึ่งสามารถตั้งค่าเพื่อเปลี่ยนไปแท็บอื่นโดยใช้คำสั่ง โดยแท็บแรกที่ค่าดัชนีที่เป็น 0 

การเปลี่ยนคุณลักษณะของแท็บ 

การเปลี่ยนคุณลักษณะของแท็บไม่จำเป็นต้องทำที่แท็บปัจจุบันเพราะคุณสมบัติ ที่ต้องการ คือ ดัชนี 

SSTab1.TabCaption(0) = “เข้าสู่ระบบ”
picFile = (”C:\ Microsoft Visual Studio\Common\Graphics\Bitmaps\Asserted\ballon.bmp”
SSTab1.TabPicture(1) = LoadPicture(picFile)
SSTab1.TabVisible(2) = False 

คุณสมบัติ Tabs ส่งออกจำนวนของแท็บที่มีอยู่ 

‘ ไม่ให้ใช้แท็บทั้งหมดยกเว้นแท็บปัจจุบัน
For i = 0 to SSTab1.Tabs -1
SSTab1.TabEnabled (i) = (I = SSTab1.Tab}
Next 

การสร้างแท็บใหม่ 

การสร้างแท็บใหม่ เมื่อเวลาเรียกใช้สร้างด้วยการเพิ่มค่าของคุณสมบัติ Tabs และสามารถต่อแท็บใหม่ในที่เฉพาะได้ 

SSTab1.Tabs = SSTab1.Tabs+1
SSTab1.TabCaption (SSTab1.Tabs-1) = “รายงานสรุป” 

การเพิ่มตัว control ให้กับแท็บที่สร้างใหม่ สามารถทำด้วยการสร้างตัว control แบบ dynamic แล้วเปลี่ยนคุณสมบัติ Container 

Dim txt As TextBox
Set txt = Controls.Add (”VB.Text Box”, “txt”)
SSTab1.Tab = SSTab1.Tab -1
txt.Move 400, 800, 1200, 350
txt.Visible = True 

Oct 09

Rich Text Box

หัวข้อพิเศษไอที, VB 6.0 No Comments »

Rich text box เป็นตัว control ที่มีความสามารถสูงของ Visual Basic ลักษณะภาย Rich text box เป็น Text box ที่แสดงข้อความในรูปแบบ Rich text format (RTF) ซึ่งเป็นรูปแบบมาตรฐานที่โปรแกรมประมวลคำรวมถึง Microsoft Word Pad รู้จัก ตัว control ที่สนับสนุน multiple font และสี มาร์จิน ซ้ายและขวาเป็นต้น
Rich text box มีคำสั่งที่สอดคล้องกับ Text box แบบหลายบรรทัด ทำให้สามารถนำคำสั่งที่ใช้กับ Text box มาใช้ Rich text box ได้ แต่ Rich text box ไม่มีจำกัดในด้านจำนวนบรรทัดที่สามารถเก็บได้ 

Rich text box อยู่ในไฟล์ RICHTX32.OCX ที่ต้องกระจายไปกับโปรแกรมที่ใช้ตัว control นี้ และต้องมีการโหลดเข้ามา โดยเลือก Microsoft Rich Textbox Control 6.0 จากรายการในไดอะล๊อกบ๊อกซ์ Component ส่วน tool บน Toolbox 

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

การตั้งค่าคุณสมบัติที่ใช้งานแท็บ General ของไดอะล๊อกบ๊อกซ์ Property Pages ได้แก่ การกำหนดชื่อไฟล์ TXT หรือ RTF ที่ต้องการโหลดในคุณสมบัติ FileName คุณสมบัติ RightMargin เสนอระหว่างห่างเป็น twips ของมาร์จินด้านขวาจากขอบด้ายซ้ายของตัว control คุณสมบัติ BalletIndent เป็นจำนวน twips ของการย่อหน้าเมื่อคุณสมบัติ SetBullet เป็นจริง คุณสมบัติ AutoVerbMenu ใช้สำหรับป้องกันแก้ไขของเมนู pop-up จากการคลิกเมาส์ปุ่มขวา ถ้าต้องการใช้เมนู pop-up ให้ตั้งค่าคุณสมบัตินี้เป็น False และคุณสมบัติทั้งหมดในแท็บ General โดย Text box 

Rich Text box เป็นตัว control แบบ data-aware ดังนั้น จึงมีคุณสมบัติ DataXXXX เพื่อใช้ในการรวมตัว control กับแหล่งข้อมูล 

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

Rich text box มีหลายคุณสมบัติ และเมธอดที่สามารถจัดแบ่งเป็นกลุ่มการทำงานได้ 

การโหลดและบันทึกไฟล์ 

การโหลดไฟล์ข้อความไปยังตัว control ใช้เมธอด LoadFile และ อากิวเมนต์ระบุรูปแบบโดยไฟล์ RTF (0-rtfRTF และเป็นค่าเริ่มต้น) หรือ TXT (1-rtfText) 

RichTextBox1.LoadFile “C:\Docs\tryMe.rtf”, rtfRTF 

ชื่อไฟล์เมื่อได้รับการโหลดแล้ว จะปรากฏในคุณสมบัติ FileName การโหลดไฟล์อาจจะใช้วิธีทางอ้อมโดยการกำหนดชื่อให้คุณสมบัติ FileName แต่ไม่สามารถระบุรูปแบบ 

การบันทึกไฟล์ปัจจุบันในตัว control สามารถใช้เมธอด SaveFile ในไวยากรณ์ แบบนี้ได้ 

RichTextBox1.SaveFile RichTextBox1.FileName, rtfRTF 

ถ้าต้องการเพิ่มข้อมูลในตัว control ให้กับไฟล์ที่มีอยู่หรือเก็บข้อมูลเพิ่มในไฟล์เดิม สามารถใช้คุณสมบัติ TextRTF 

‘ สมมติให้ Rich text box ทั้งสองอยู่ในไฟล์เดียวกัน
Dim tmp As Variant
Open “c:\test.rtf” For Binary As #1 

‘ ใช้ตัวแปรสำหรับความสะดวกในการทำงาน
tmp = RichTextBox1.TextRTF: Put #1, , tmp
tmp = RichTextBox2.TextRTF: Put #1, , tmp
Close #1 

‘ อ่านข้อมูลกลับยังตัว control
Open “c:\test.rtf” For Binary As #1
Get #1, , tmp: RichTextBox1.TextRTF = tmp
Get #1, , tmp: RichTextBox2.TextRTF = tmp
Close #1 

การเปลี่ยนคุณลักษณะตัวอักษร 

Rich text box มีหลายคุณสมบัติที่มีผลต่อคุณลักษณะของตัวอักษรในข้อความที่เลือก ได้แก่ SelFontName, SelFontSize, SelColor, SelBold, SelItalic, SelUnderline และ SelStrikeThru และตัว control ที่มีคุณสมบัติ FontXXXX แต่คุณสมบัตินี้มีผลเฉพาะคุณลักษณะของเมื่อโหลดตัว control 

‘ การเปลี่ยน ชื่อและขนาดฟอนต์
RichTextBox1.SelStart = 0
RichTextBox1.SelLength = Len(RichTextBox1.Text)
RichTextBox1.SelFontName = “Microsoft Sans Serif”
RichTextBox1.SelFontSize = 12
‘ การยกเลิกการเลือก
RichTextBox1.SelLength = 0 

เมื่อมีการอ่านค่าด้วยคุณสมบัติ SelXXXX จะเห็นว่ามีการส่งค่าคุณลักษณะของข้อความที่เลือกแต่สามารถส่งค่าเป็น Null ถ้าตัวอักษรมีคุณลักษณะที่ต่างกัน 

Private Sub cmdToggleBold_Click()
   If IsNull(RichTextBox1.SelBold) Then
      RichTextBox1.SelBold = True
   Else
      RichTextBox1.SelBold = Not RichTextBox1.SelBold
   End If
End Sub 

ปัญหานี้มีผลกับการใช้แถบเครื่องมือ ซึ่งต้องใช้คุณสมบัติ MixedState ในอ๊อบเจคแถบเครื่องมือ 

‘ rtfText As RichTextBox, fMainForm As Form, tbToolBar As ToolBar
Private Sub rtfText_SelChange() 

   If IsNull(rtfText.SelBold) Then
      fMainForm.tbToolBar.Buttons(”Bold”).MixedState = True
   Else
      fMainForm.tbToolBar.Buttons(”Bold”).MixedState = False
      fMainForm.tbToolBar.Buttons(”Bold”).Value = IIf(rtfText.SelBold, tbrPressed, tbrUnpressed)
   End If 

   ’ คำสั่งอื่นๆ
End Sub 

คุณสมบัติ SelProtect ใช้ป้องกันข้อความที่เลือกจากการแก้ไข แต่ถ้าไม่ต้องการให้มีการแก้ไขทั้งเอกสารหรือทั้งไฟล์ ให้ตั้งค่าคุณสมบัติ Locked เป็น True 

การเปลี่ยนคุณลักษณะการย่อหน้า 

การควบคุมรูปแบบการย่อหน้า ทั้งหมดทำได้ในการเลือกปัจจุบัน โดยคุณสมบัติ SelIndent และ SelHangingIndent ทำงานด้วยกับในการกำหนดการย่อหน้าซ้ายของบรรทัดแรก และบรรทัดที่ตามมาของย่อหน้า ซึ่งมีวิธีการทำงานคือ คุณสมบัติ SelIndent กำหนดย่อหน้าของบรรทัดแรก ส่วนคุณสมบัติ SelHangingIndent กำหนดการย่อหน้าของบรรทัดต่อมาโดยสัมพันธ์กับบรรทัดแรก เช่น การย่อหน้าทั้งหมดเป็น 400 twips และบรรทัดแรกเพิ่มขึ้นอีก 200 twips 

RichTextBox1.SelIndent = 600
RichTextBox1.SelHangingIndent = -200 

คุณสมบัติ SelRightIndent เป็นระยะห่างย่อหน้าจากมาร์จินทางขวา หรือตำแหน่งขึ้นกับคุณสมบัติ RightMargin เช่น กำหนดมาร์จินทางขวาไว้ 300 twips และตั้งค่าการย่อหน้าขวาของย่อหน้า ที่ 100 twips 

RichTextBox.RightMargin = RichTextBox.Width – 300
RichTextBox.SelRightIndent = 100 

การจัดแนวของย่อหน้าใช้คุณสมบัติ SelAlignment ส่งออกค่าว่างถ้ามีการจัดแนวหลายแบบ ส่วนคุณสมบัติ SelCharOffset ใช้สำหรับการสร้างข้อความ superscript (ตัวยก) และ subscript (ตัวห้อย) โดยใช้ค่าบวกกับ superscript และค่าลบกับ subscript และศูนย์สำหรับการฟื้นฟูข้อความปกติ และใน Rich text box ไม่มีการจัดระยะอัตโนมัติ 

‘ ทำการเลือกข้อความ superscript
RichTextBox1.SelCharOffset = 40
‘ ลดขนาดตัวอักษร
RichTextBox1.SelFontSize = RichTextBox1.SelFontSize \ 2 

คุณสมบัติ SelBullet เป็นค่า Boolean สำหรับการตั้งค่าในการเปลี่ยนการย่อหน้าธรรมดา เป็นการย่อหน้าด้วยสัญลักษณ์ SelBullet ส่งออกค่าคุณลักษณะของย่อหน้าที่เลือกหรือค่าว่างถ้าการย่อหน้าที่หลายคุณลักษณะ 

Private Sub cmdToggleBullet_Click()
   If IsNull(RichTextBox1.SelBold) Then
      RichTextBox1.SelBullet = True
   Else
      RichTextBox1.SelBullet = Not RichTextBox1.SelBullet
   End If
End Sub 

การจัดการแท็บ 

Rich text box มีความสามารถในการจัดตำแหน่งของแท็บในลักษณะย่อหน้าต่อย่อหน้า การจัดแท็บทำได้ด้วยคุณสมบัติ SelTabCount และ SelTabs ซึ่งคุณสมบัติ SelTabCount ตั้งจำนวนตำแหน่งของแท็บในย่อหน้า ส่วนคุณสมบัติ SelTabs ให้ค่าของแต่ละตำแหน่ง Tab 

RichTextBox.SelTabCount = 3
RichTextBox.SelTabs (0) = 300
RichTextBox.SelTabs (1) = 600
RichTextBox.SelTabs (2) = 1200 

ปุ่มแท็บจะเพิ่มตัวอักษร Tab เมื่อไม่มีตัว control บนฟอร์มตั้งค่าคุณสมบัติ TabStop เป็น True ในกรณีอื่น การเพิ่มตัวอักษร Tab ในเอกสารใช้ปุ่ม Ctrl + Tab 

การแก้ไขปัญหานี้ทำได้โดยการตั้งค่าคุณสมบัติ TabStop ของทุกตัว control เป็น False เมื่อ Rich text box ได้รับโฟกัส และตั้งค่าใหม่เป็น True เมื่อ Rich text box ไม่ได้รับโฟกัส 

‘ ในโมดูล BAS
Sub SetTabStops(frm As Form, value As Boolean)
Dim ctrl As Control
On Error Resume Next
   For Each ctrl In frm.Controls
      Ctrl.TabStop = value
   Next
End Sub 

‘ ในโมดูลฟอร์ม
Private Sub RichTextBox1_GotFocus()
   SetTabStops Me, False
End Sub 

Private Sub RichTextBox1_LostFocus()
   SetTabStops Me, True
End Sub 

การพิมพ์เอกสารปัจจุบัน 

Rich text box สนับสนุนการพิมพ์โดยตรงด้วยเมธอด SelPrint ซึ่งพิมพ์การเลือกปัจจุบัน หรือเอกสารทั้งหมดถ้าไม่มีการเลือกข้อความ และมีไวยากรณ์ 

SelPrint hDC, [Start Doc] 

hDC เป็นอุปกรณ์ที่ใช้พิมพ์
Start Doc เป็นค่า Boolean ที่หาเมธอดส่งคำสั่ง StartDoc และ EndDoc 

การพิมพ์เอกสารปัจจุบันทั้งหมด 

RichTextBox1.SelLength = 0
RichTextBox1.SelPrint Printer.hDC 

Oct 09

Common Dialog

หัวข้อพิเศษไอที, VB 6.0 No Comments »

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 

Oct 09

ActiveX Control

หัวข้อพิเศษไอที, VB 6.0 No Comments »

โปรแกรมประยุกต์ Visual Basic สามารถใช้ตัว ActiveX control ที่มากับผลิตภัณฑ์ และซื้อจากผู้ผลิตรายอื่น รวมถึงการสร้างตัว ActiveX control เอง สำหรับในตอนนี้เป็นการแนะนำถึงตัว control ที่มีอยู่ในแพ็คเกจของ Visual Basic

ชื่อ control
ชื่อ class
ชื่อไฟล์
คำอธิบาย
Common Dialog CommonDialog COMDLG32.OCX Common dialog เป็นตัว control ที่ให้วิธีการที่ง่ายและสะดวกในการเกี่ยวข้องกับสี, ฟอนต์, Printer, File Open และ File Save dialog และรวมถึงการแสดงไฟล์ Help
Mask ed box MaskEdBox MSMASK32.OCX Mask ed box เป็นตัว control ที่คล้ายกับ Text box ที่มีส่วนเพิ่มที่เป็นประโยชน์ สำหรับการสร้างความสามารถของขั้นตอนการป้อนข้อมูล
MS Chart MSChart MSCHART20.OCX MS Chart เป็นตัว control ภายนอกของ ActiveX ที่ให้ผู้ใช้เพิ่มความสามารถทำแผนภูมิในโปรแกรมประยุกต์
Rich text box RichTextBox RICHTX32.OCX Rich text box เป็นตัว control ที่มีความสามารถสูงของ Visual Basic ลักษณะภาย Rich text box เป็น Text box ที่แสดงข้อความในรูปแบบ Rich text format (RTF)
SysInfo SysInfo SYSINFO.OCX SysInfo เป็นตัว control ที่ช่วยในการสร้างโปรแกรมประยุกต์ที่ยินยอมด้วยโปรแกรม Window Logo ความต้องการเบื้องต้นสำหรับการประยุกต์แบบนี้ คือ ความสามารถในการตอบสนอง event ของระบบ เช่น การเปลี่ยนความละเอียดของจอภาพ หรือ เมื่ออุปกรณ์ plug-and-play ต่อเชื่อมหรือยกเลิกการต่อเชื่อมกับระบบ
Tab dialog หรือ SS tab SSTab TABCTL32.OCX SS tab เป็นตัว control ที่ยอมให้สร้างไดอะล๊อกบ๊อกซ์ Tab ซึ่งเกือบเหมือนกับ Tab strip แต่มีความแตกต่างที่สำคัญระหว่างตัว control นี้ คือ SS tab เป็น container ทำให้สามารถวางตัว control ลูกได้โดยตรงบนผิว และสามารถเปลี่ยนหน้า Tab ระหว่างการออกแบบ
This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s