Visual Basic

Home

Visual Basic Tutorial
Knowledge Developer Database Internet Resource
Class
1. Class
2. Property Procedure
3. คุณสมบัติ
4. ฟังก์ชัน Callback
5. คีย์เวิร์ด
 
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
 

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 ในการประยุกต์จริงที่ต้องติดต่อกับฐานข้อมูล หรือการเชื่อมต่อทางไกล วิธีการดังกล่าว จะช่วยประหยัดเวลาได้

 

  

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