คลาส (Classes)

ใน Visual FoxPro เราถือว่า ฟอร์ม(Forms) , ฟอร์มเซ็ต(Form Set) และคอนโทรล(Control)
ทั้งหมดนี้เป็นวัตถุ(Object) แล้วเราก็นำเอา Object ไปใช้ในโปรแกรมต่างๆที่เราเขียนขึ้นมา
มาถึงตอนนี้เราก็เข้าแก๊บของการเขียนโปรแกรมแบบ OOP อีกแล้วครับท่าน
Object ต่างๆที่เราเขียนขึ้นมานั้นจะประกอบไปด้วย คุณสมบัติ(Properties) , อีเวนต์(Events)
และเมธอต(Methods) เอ้าที่ว่ามามันไม่เห็นจะเกี่ยวกับคลาสตรงไหนเลย เอาละ คลาส กับ Object
มันไม่เกี่ยวกันหรอกเพราะมันไม่มีตะขอเกี่ยว… แต่มันมีความละม้ายใก้ลเคียงกันมากเพราะ
Object มันเกิดมาจากคลาส อ่านมาถึงตรงนี้อย่าเพิ่งงงนะครับ ส่วนผมนะงงไปแล้ว งั้นยกตัวอย่างเลยแล้วกัน
ตัวอย่างก็มีอยู่ว่า ใน Visual FoxPro ได้จัดเตรียม คลาสสำเร็จรูปเตรียมไว้ให้เราซึ่งเรียกว่า เบสคลาส(Base Class)
แล้วเรานำมาเพิ่มคุณสมบัติ ใส่อีเวนต์ เติมเมธอต แล้วเราก็นำมันมาใช้เราเรียกตัวที่นำมาใช้ว่า Object
ถึงตอนนี้เข้าใจบ่ หรือบ่เข้าใจ แต่มีอีกคำหนึ่งอยากจะอะธิบายให้ฟังสักหน่อย คำว่า ซับคาลส(Sub Class)
ลักษณะของ Sub Class ก็เหมือนกับคลาสอีกนั่นแหละแต่ Sub Class จะอยู่ตรงกลางระหว่าง คลาส กับ Object
จุดประสงค์ของ Sub Class ก็มีไวอม…ไม่ใช่  ตัวอย่างเช่นถ้าเราต้องการสร้างฟอร์มแล้วมีปุ่มคำสั่งเราก็นำ เบสคลาส
มาใส่แล้วกำหนด คุณสมบัติ , อีเวนต์  และเมธอต เมื่อเรากำหนดเสร็จก็จะได้เป็น Sub Class แล้วเราก็ทำการเรียก
ใช้งาน เวลาเรนำมาใช้ก็กลายเป็น Object อีกแล้วครับท่าน งงไปก็งงมาอยู่ตรงนี้แหละ

จากที่กล่าวมานั้นท่านก็จะได้ทราบว่า การโปรแกรมเชิงวัตถุ(OOP) นั้นเป็นอย่างไร ที่นี้เราก็ทำดูว่า เบสคลาส
มีอะไรบ้า ตามตารางต่อไปนี้

CheckBox EditBox ListBox Shape
Column Form OLEBoundControl Spinner
CommandButton FormSet OLEContainerControl TextBox
CommandGroup Grid OptionButton Timer
ComboBoxr Header OptionGroup ToolBar
Container Image Page
Control Label PageFrame
Custom Line Separator

คลาสที่เราใช้งานอยู่จะประกอบไปด้วย คอนเทรนเนอร์(Contrainers) และ นอน-คอนเทรนเนอร์(Non-Contrainers)
หรือเรียกอีกอย่างว่า คอนโทลคลาส(Control Class) ตัวคอนเทรนเนอร์นั้นจะยอมให้นำคลาสใดๆมาใส่ไว้ได้
ไม่ว่าจะเป็น คอนเทรนเนอร์คลาส หรือ คอนโทรคลาส เช่น เบสคลาส Form เป็นคอนเทรนเนอร์
มันสามารถนำ ปุ่ม CommandButton มาใส่ไว้ได้เป็นต้น

ตารางแสดง คอนเทรนเนอร์

คอนเทรนเนอร์ คลาสที่สามารถบรรจะในคอนเทรนเนอร์
Command button groups Command buttons
Container Any controls
Control Any controls
Form Sets Forms, toolbars
Forms Page frames, any controls, containers, custom
Grid columns Column headers, any objects except forms, form sets, grid columns, and toolbars
Grids Grid columns
Option button groups Option buttons
Page frames Pages
Pages Any controls. containers, custom
Toolbars Any controls, page fame, container

มาถึง ณ. จุดนี้คุณก็ทราบแล้วว่าคลาสมันคืออะไร มีไว้ทำอะไร แต่จะนำมันมาใช้ได้อย่างไรล่ะ
เราจะนำคลาสไปใช้งานเราใช้คำสั่ง
DEFINE CLASS ClassName1 AS ParentClass
[[PROTECTED PropertyName1, PropertyName2 …]
PropertyName = eExpression …]
[ADD OBJECT [PROTECTED] ObjectName AS ClassName2 [NOINIT]
[WITH cPropertylist]]…
[[PROTECTED] FUNCTION | PROCEDURE Name
[NODEFAULT]
cStatements
[ENDFUNC | ENDPROC]]…
ENDDEFINE

เช่น    DEFINE CLASS TestForm AS Form
ADD OBJECT cmdExit As CommandButton WITH ;
Caption = “E\<xit”, Top = 100, Left = 140, ;
Height = 29, Width = 94, Visible = .T.

PROCEDURE cmdExit.Click
RELEASE ThisForm
ENDPROC
ENDDEFINE

จำได้หรือไม่ว่าได้พบกับคำสั่งนี้ที่ตัวอย่างโปรแกรมต่างๆข้างต้นมาแล้ว จะสังเกตุได้ว่าเมื่อเราได้
ทำการ DEFINE CLASS ขึ้นมาเป็น Sub Class (TestForm เป็น Sub Class ของ base class FORM)
แล้วเราต้องทำการสร้าง object อีกครั้งหนึ่ง โดยใช้คำสั่ง

CREATEOBJECT(ClassName [, eParameter1, eParameter2, …])

เช่น           myForm = CREATEOBJECT(“TestForm”)

หลังจากที่ทำการ Create Object ขึ้นมาแล้วถ้าเราต้องการให้ Object นั้นปรากฏในหน้าจอเราต้องกำหนด
เมธอตของ Object นั้นให้มีการแสดงชึ้นมา โดยการอ้างชชื่อของ Object ที่ต้องการแล้วใส่เมธอต Show
เข้าไป ดังนี้
myForm.Show

เมื่อก่อนที่ผมจะมาลองหัดเขียนโปรแกรมแบบ Visual ผมเห็นเขาเขียนคำสั่งกำหนดคุณสมบัติต่างๆ ผมงงมาก
ถ้าคุณเป็นมือใหม่ก็คงงงแบบผมเพราะถ้าใน FoxPro รุ่นก่อนๆ ถ้าเราใช้ จุด(.) เป็นตัวคั่นกลางเราก็จะหมายถึง
การอ้างถึงฟิลด์ในแฟ้มข้อมูล หรือ บอกว่าเป็นตัวแปร memvar แต่สำหรับ Visual FoxPro ได้มีการ
เพิ่มให้เป็นการกำหนด คุณสมบัติและเมธอตต่างๆให้กับ Object ทีนี้เรามาดู กันว่าจะอ้างถึง Object ต่างๆ
เพื่อกำหนดค่าคุณสมบัติและเมธอตต่าาๆ ได้อย่างไร
วิธีการอ้างถึง Object นั้นเรามีวิธีการอ้างถึงอยู่ 2 แบบด้วยกันคือ
1. การอ้างถึงแบบสมบูรณ์ (Absolute Referencing)
  2. การอ้างถึงแบบสัมพันธ์(Relative Reference)

การอ้างถึงแบบสมบูรณ์ (Absolute Reference)
การอ้างถึงแบบสมบูรณ์ ก็คือการบอกไปตรงๆว่า Object นั้นๆอยู่ที่ไหนถ้าสังเกตุให้ดีตัวอย่างที่ผมแสดงไว้
ในบทต้นๆนั่นแหละเป็นการอ้างแบบสมบูรณ์ เช่น
myForm2.Show
myForm2 คือชื่อ Sub Class ของ Form ที่เราสร้างขึ้น
Show คือเมธอตที่ให้ทำการแสดง ฟอร์ม myForm2

_SCREEN.ActiveForm.BackColor = RGB(51*ncount,255,255)
_SCREEN คือการอ้างถึงหน้าจอ ส่วน ActiveForm เป็นการอ้างถึง Form ที่ทำการเปิดอยู่ ณ. ขณะนั้น
BackColor คือกำหนดคุณสมบัติให้แสดงสีของพื้นฟอร์ม

myForm.txtDate.ForeColor = RGB(0,0,0)   && black text
myForm.txtDate.BackColor = RGB(192,192,192)    && gray background

myFormSet.myForm.Show
myFormSet.myForm.cmdButton1.SetFocus

ตัวอย่างทั้งหมดข้างต้นนั้นเป็นการอ้างถึงแบบสมบูรณ์

การอ้างถึงแบบสัมพันธ์ (Relative Reference)
การอ้างถึงแบบสัมพันธ์ ก็คือการบอกแบบอ้างถึงความสัมพันธ์ ซึ่งประกอบไปด้วย keyword ต่อไปนี้

Parent The immediate container of the object.
THIS The object.
THISFORM The form that contains the object.
THISFORMSET The form set that contains the object

ตัวอย่างเช่น
THIS.Caption = ‘OK’        && กำหนดให้แสดงคำว่า OK ใน Object
THIS.Parent.BackColor = RGB(192,0,0)  && กำหนดสีฉากหลังของฟอร์ม
THISFORM.cmd1.Caption = ‘OK’     && กำหนดให้แสดงคำว่า OK ใน object cmd1 ของ Form ปัจจุบัน
THISFORMSET.myForm.cmd1.Caption = ‘OK’

ถึงตอนนี้คุณคงได้ทราบวิธีการอ้างถึง Object ของ Visual FoxPro แล้วว่าทำอย่างไร แต่ยังมีข้อสังเกตุอยู่อย่างหนึ่งก็คือ
ลำดับของการอ้างถึงถ้าคุณสังเกตุให้ดี ลัษณะของลำดับในการอ้างถึงจะเริ่มต้นจากลำดับต่ำสุดก็คือ คุณสมบัติ หรือ เมธอต
ถัดมาจะอ้างถึง object จากนั้นก็มาเป็น ฟอร์ม แล้วสุดท้ายก็จะเป็น ฟอร์มเซ็ต
คุณลองทำความเข้าใจกับ การอ้างนี้ดูTHIS.Paret.BackColor  คำว่า parent มันหมายถึออะไร มันหมายถึงฟอร์ม ใช่หรือไม่

การกำหนดคุณสมบัติ (Setting Properties)
คุณสามารถกำหนดคุณสมบัติ (Properties) ของ Object ได้โดยใช้รูปแบบดังนี้
 Parent.Object.Property = Value
เช่น
myForm.txtDate.Value = DATE()  && display the current date
myForm.txtDate.Enabled = .T.   && the Control is enabled
myForm.txtDate.ForeColor = RGB(0,0,0)   && black text
myForm.txtDate.BackColor = RGB(192,192,192)    && gray background

จะเห็นได้ว่าบางครังการกำหนดคุณสมบัติเราจะทำการกำหนดคุณสมบัติหลายๆอย่างใน Object นั้นๆ
ซึ่งเราไม่จำเป็นต้องเขียน code ตามตัวอย่างข้างบนก็ได้ ใน Visual FoxPro ได้เตรียมคำสั่งสำหรับไว้กำหนด
คุณสมบัติหลายๆคุณสมบัติไว้ภายใน Object เดียวกันโดยใช้คำสั่ง WITH…ENDWITH
WITH ObjectName
[.cStatements]
ENDWITH

จากตัวอย่างก่อนหน้าเราสามารถนำมาเขียนใหม่ได้ดังนี้
WITH myForm.txtDate
.Value = DATE()
.Enabled = .T.
.ForeColor = RGB(0,0,0)
.BackColor = RGB(192,192,192)
ENDWITH

การเรียกเมธอต (Calling Method)
เมื่อคุณได้ทำการสร้าง Object ขึ้นมาแล้ว คุณสามารถทำการเรียก เมธอต ของ Object จากที่ใดก็ได้ในโปรแกรม
โดยเขียน code ดังนี้
Parent.Object.Method
เช่น
myForm.Show
myForm.cmdExit.SetFocus

ในส่วนของความหมายว่า คุณสมบัติและเมธอตแต่ละตัวมีความหมายอย่างไร ใช้งานอย่างไรนั้นผมจะอธิบายไว้ในบทต่อๆไป
ในการอ้างถึงเมธอตนั้น Visual FoxPro ได้เตรียมโอเปเรเตอร์ไว้ให้อีกตัวหนึ่งซึ่งไว้อ้างถึง parent คลาสโดยใช้  :: (Scope Resolution Operator) ในการอ้างถึง เช่น

cmdButton::Click()

มาถึง ณ. จุดนี้คุณก็ได้ทราบคลาสต่างๆ ทราบถึงวิธีการอ้างถึงในรูปแบบต่างๆ ในบทต่อไปก็จะเป็นเรื่องของการสร้างฐานข้อมูล