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

Rich Text Box

Rich Text Box

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

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

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

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