Property Procedure
ตามตัวอย่างการตรวจสอบค่าด้วย Is Nothing เพื่อป้องกันความผิดพลาดในการกำหนดค่า วิธีการตรวจสอบสามารถใช้ property procedure ในการกำหนดค่าและตรวจสอบได้
' private members
Private m_CompanyName As String
Private m_CompanyType As String
Property Get CompanyName() As String
CompanyName = m_CompanyName
End Property
Property Let CompanyName(ByVal newValue As String)
' เกิดความผิดพลาดถ้ามีความพยายามกำหนดที่ไม่มีจริง
If newValue = "" Then Err.Raise 5 ' อากิวเมนต์ของ procedure ไม่มีจริง
' หรือเก็บค่าในตัวแปร private member
m_CompanyName = newValue
m_ReverseName = Empty
End Property
การใช้คำสั่งนี้ในการจัดการ CompanyName เมื่อเรียกใช้ ถ้าต้องการติดตามการทำงาน ให้กดปุ่ม F8 เพื่อขั้นตอนการประมวล สำหรับ property procedure ทั้งสอง มีการทำงานโดยทุกครั้งที่ป้อนค่าใหม่ให้คุณสมบัติ Visual Basic ตรวจสอบด้วย Property Let แล้วส่งผ่านค่าใหม่ ถ้ารหัสไม่ถูกต้อง จะเกิดความผิดพลาดและส่งกลับข่าวสารไปยังผู้เรียก เมื่อมีการขอค่าคุณสมบัติ Visual Basic จะประมวลผล procedure Get ให้ส่งออกค่า ตัวแปร private ประเภทข้อมูลของ
Property Let ต้องเหมือนกับ Get
การตรวจสอบค่าที่มีอยู่ (Validation) บางครั้งค่าที่มีอยู่อาจจะเกิดจากภายนอก เช่น รหัสสินค้า ต้องตรวจสอบจากฐานข้อมูลของสินค้า แต่เพื่อทำให้เข้าใจง่ายขึ้น ให้เพิ่มคุณสมบัติ RecordDate และตรวจสอบค่าด้วยวิธีที่มีเหตุผล
Private m_RecordDate As Date
Property Get RecordDate() As Date
RecordDate = m_RecordDate
End Property
Property Let RecordDate(ByVal newValue As Date)
If newValue >= Now Then Err.Raise 1001, , "ไม่สามารถเป็นวันที่ในอนาคต"
m_RecordDate = newValue
End Property
เมธอด
class module สามารถสร้าง sub procedure และฟังก์ชัน ที่อยู่ในฐานะเมธอดของ class ซึ่งความแตกต่าง คือ ฟังก์ชันส่งออกค่า แต่ sub procedure ไม่ส่งออกค่า การสร้าง procedure หรือฟังก์ชันภายใน class จะทำให้สามารถเรียกมาใช้งานในฐานะเมธอด ตัวอย่างเช่น
' clsSupplier class
Function ReverseName() As String
m_ReverseName = CompanyDescr & ", " & CompanyName
End Function
' ที่ฟอร์ม
Print Supplier.ReverseName
การทำงานใน class module ทำให้ไม่จำเป็นต้องใช้ dot syntax ในการอ้างอิงคุณสมบัติของ instance ปัจจุบัน เนื่องจากการดึงชื่อ public property ประมวลผลของ Visual Basic จะประมวลผลคุณสมบัติของ Property Get เช่นเดียวกับการอ้างถึงคุณสมบัติจากภายนอก class
การสร้างฟังก์ชันและ sub procedure ใน class รวมถึง property procedure จะปรากฏในรายการของ Object browser ในฐานะ เมธอด และคุณสมบัติ
Class Initialize event
ในการป้อนข้อมูลลงในฟอร์มที่สร้างขึ้น ตามปกติจะมีฟิลด์บางฟิลด์จะมีข้อมูลส่วนใหญ่เหมือนกัน เช่น ข้อมูลผู้ขาย ฟิลด์สัญชาติ มักจะเป็นไทย ซึ่งค่าที่สามารถกำหนดให้เมื่อเริ่มต้น เรียก class แล้วจึงเปลี่ยนเมื่อเป็นค่าอื่น การกำหนดค่าเริ่มต้น ทำได้โดยใช้ Class_Initialize event เมื่อมีการกำหนดค่าให้กับตัวแปรแล้ว ตัวแปรที่สามารถไปเป็นค่า เริ่มต้นให้กับตัว control อื่น ๆ ได้ เช่น Combo box
Private M_Contact As Boolean
Private Sub Class_Initialize()
M_Contact = True
End Sub
หมายเหตุ: ต้องมี Public Property
procedure Get / Let สำหรับการรับและส่งค่า
การกำหนดค่าเริ่มต้นด้วย Class_Initialize event จะทำให้โปรแกรมดูฉลาดขึ้น
เมื่อมีการกำหนด Class_Initialize event แล้วต้องมี Class_Terminate event
สำหรับการลบ instance เมื่อปิดโปรแกรม
การตรวจสอบความผิดพลาดใน Class Module
การตรวจสอบความผิดพลาดในโมดูลต่าง ๆ รวมถึง class module มีวิธีการที่คล้ายกันและการติดตามการทำงานที่ประกอบด้วยหลายอ๊อบเจค และขั้นตอนการประมวลหลายขั้น การใช้ Local window จะช่วยในการติดตามได้ดี เพราะสามารถมองเห็นการเปลี่ยนแปลง ข้อมูลจากคำสั่งที่เขียนและผลกระทบด้านอื่น ๆ
คีย์เวิร์ด Me
คีย์เวิร์ด Me ใช้ในการอ้างถึงตัว class ในการเขียนคำสั่ง ตามตัวอย่างได้สร้าง procedure ให้ใช้ทั่วไปในโมดูล BAS
Friend Sub Init(CompanyName As String, _
CompanyType As CompanyConstants, _
Optional ID As String, Optional RecordDate As Variant)
Me.CompanyName = CompanyName
Me.CompanyType = CompanyType
If Not IsMissing(ID) Then Me.ID = ID
If Not IsMissing(RecordDate) Then Me.RecordDate = RecordDate
End Sub
ดาวน์โหลดตัวอย่าง (Supplier.vbp)
คุณสมบัติ, เมธอด และ Event
การประยุกต์ คุณสมบัติ, เมธอด และ event ผู้พัฒนาโปรแกรมสามารถกำหนดวิธีการประยุกต์ ให้เหมาะสมกับสภาพแวดล้อมในการทำงาน เพื่อการติดต่อกับผู้ใช้ทำได้สะดวก รวมถึงการควบคุมความผิดพลาดคุณสมบัติ อ่านอย่างเดียวและเขียนอย่างเดียว
คุณสมบัติอ่านอย่างเดียว
การกำหนดคุณสมบัติ Deal ใน class เป็นการคำนวณหาระยะเวลาการติดต่อทางธุรกิจ คุณสมบัตินี้จะขึ้นกับคุณสมบัติ RecordDate เป็นการคำนวณหาระยะเวลาการติดต่อทางธุรกิจ เหมาะสมที่จะให้เป็นแบบเขียนอย่างเดียว ใน Visual Basic การสร้างคุณสมบัติอ่านอย่างเดียว ทำได้โดยการไม่ใช้ Property Let
Property Get Deal() As Integer
Deal = Year(Now) - Year(RecordDate)
End Property
คุณสมบัติเขียนอย่างเดียว
ในบางครั้ง ผู้พัฒนาอาจจำเป็นต้องสร้างคุณสมบัติเขียนอย่างเดียว เช่น คุณสมบัติ Password ตามปกติ ผู้ใช้สามารถป้อนรหัสผ่านในการ login ได้ แต่ไม่ควรอ่านได้เนื่องจากเหตุผลความปลอดภัย ใน Visual Basic การกำหนดคุณสมบัติเขียนอย่างเดียว ทำได้โดยการใช้ Property Let แต่ไม่ใช้ Property Get
Private m_Password As String
Property Let password (ByVal newValue As String)
m_Password = newValue
End Property
คุณสมบัติกับอากิวเมนต์
Visual Basic ให้ผู้เขียนโปรแกรมสามารถสร้าง property procedure ที่ยอมรับอากิวเมนต์ได้หลายค่า เช่นเดียวกับตัว control ของ Visual Basic เช่น คุณสมบัติ List ของ List box
ในคุณสมบัติ Notes ตามตัวอย่าง ได้กำหนดการอ่านอากิวเมนต์ ได้ 2 ค่า คือ index และ new_value และรับค่าแบบ array เพื่อทำให้สามารถสะดวกในการทำงาน จึงต้องกำหนดประเภทข้อมูลเป็น array แต่การกำหนด array ใน class module ไม่สามารถกำหนดเป็น public ได้ ซึ่งจำเป็นต้องสร้างเป็น private array แล้วส่งออกไปข้างนอกด้วย property procedure
Private m_Notes(1 To 10) As String
Property Get Notes(Optional index As Integer = 1) As String
Notes = m_Notes(index)
End Property
Property Let Notes(Optional index As Integer = 1, ByVal newValue As String)
' ตรวจสอบความผิดพลาด subscript out of range
If index < LBound(m_Notes) Or index > UBound(m_Notes) Then Err.Raise 9
m_Notes(index) = newValue
End Property
การประยุกต์ เมธอด
การประยุกต์เมธอดใน class module มีวิธีการที่ควรสนใจ เพื่อทำให้สมรรถนะของโปรแกรมดีขึ้น การประหยัดเวลาในการประมวลผลลัพธ์
การทำงานของฟังก์ชัน ในบางครั้งอาจจะต้องมีการประมวลผลมากเกินไปก่อนแสดงผลลัพธ์ เช่น ฟังก์ชัน ReverseName วิธีการปรับปรุงให้สามารถทำงานได้เร็วขึ้น โดยไม่กระทบกับการติดต่อกับภายนอก สามารถทำได้คือ
Private m_ReverseName As Variant
Property Let CompanyName(ByVal newValue As String)
' เกิดความผิดพลาดถ้ามีความพยายามกำหนดที่ไม่มีจริง
If newValue = "" Then Err.Raise 5 ' อากิวเมนต์ของ procedure ไม่มีจริง
' หรือเก็บค่าในตัวแปร private member
m_CompanyName = newValue
m_ReverseName = Empty
End Property
' reversed name
Function ReverseName() As String
If IsEmpty(m_ReverseName) Then
m_ReverseName = CompanyDescr & ", " & CompanyName
End If
ReverseName = m_ReverseName
End Function
วิธีการที่เป็นการเก็บค่าในตัวแปร private ก่อนส่งค่ากลับไปที่ผู้ใช้และใช้ค่าที่ซ้ำ ถ้ามีการเรียกค่าต่อไปอีก วิธีการนี้ใช้ได้เนื่องจาก CompanyName และ CompanyTypeได้รับการกำหนดใหม่ ตัวแปร private จะว่าง และบังคับให้มีการประเมินค่าครั้งต่อไปในฟังก์ชัน ReverseName ในการประยุกต์จริงที่ต้องติดต่อกับฐานข้อมูล หรือการเชื่อมต่อทางไกล วิธีการดังกล่าว จะช่วยประหยัดเวลาได้
|