หลักโปรแกรมเบื้องต้น (Basic Programming)

ในการเขียนนิพจน์ขึ้นมาไม่ว่าคุณจะเขียนด้วยโปรแกรมภาษาใดก็ตาม ซึ่งอาจเป็น ภาษา C , BASIC  หรือ PASCAL คุณจำเป็นจะต้องเข้าใจและรู้เกี่ยวกับคำสั่งที่ใช้ในการควบคุมการทำงานของโปรแกรม ซึ่งมีอยู่ 2 ชนิด
ได้แก่ นิพจน์คำสั่งที่ใช้ในการทดสอบ   , คำสั่งที่ต้องการให้ทำงานซ้ำๆกัน   ในความคิดผมนั้นถ้าผู้ที่ต้องการจะเป็น หรือเป็นโปรแกรมเมอร์ไม่ทราบคำสั่งประเภทนี้แล้ว  เลิกเป็นโปรแกรมเมอร์แล้วไปขายเต้าฮวยจะดีกว่า

คำสั่งที่เกี่ยวกับการทดสอบ
คำสั่งประเภทนี้จะมีการทดสอบค่าของตัวแปรเพื่อตัดสินใจ (Decision) ว่าจะทำการประมวลผลอะไรต่อไป ซึ่งทางเลือกในการติดสินใจอาจมีได้หลายทางเลือกก็ได้ ใน Visual FoxPro มีคำสั่งประเภทนี้ได้แก่
คำสั่ง IF..ENDIF
IF lExpression
Commands
[ELSE
Commands]
ENDIF

ฟังก์ชั่น IIF()
IIF(lExpression, eExpression1, eExpression2)

คำสั่ง DO CASE … ENDCASE
DO CASE
CASE lExpression1
Commands
[CASE lExpression2
Commands

CASE lExpressionN
Commands]
[OTHERWISE
Commands]
ENDCASE

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

* Program2
#DEFINE myProgram “โปรแกรมแสดงการทดสอบเงื่อนไข”
PRIVATE nVAR
myForm = CREATEOBJECT(“TestForm”)
myForm2 = CREATEOBJECT(“DisplayColor”)
myForm.Show
myForm2.Show
myForm2.BackColor = RGB(255,0,0)
READ EVENTS

DEFINE CLASS TestForm AS FORM
Caption = myProgram
Top = 1
Left = 0
Height = 250
Width = 300

ADD OBJECT MyButton AS CommandButton WITH ;
Top = 180, Left = 36, Height = 37, Width = 73, ;
Caption = “Exit”

ADD OBJECT MyGroup AS OptionGroup WITH ;
AutoSize = .T. , ButtonCount = 5, BackStyle = 1, Value = 1 ,;
Height=108,Left=36,Top=48,Width=78,;
Option1.FontName = “CordiaUPC”, Option1.FontSize = 16,;
Option1.Caption = “สีแดง”,;
Option1.Height = 18, Option1.Left = 5, ;
Option1.Top = 5, Option1.Width = 68, ;
Option2.FontName = “CordiaUPC”, Option2.FontSize = 16, ;
Option2.Caption = “สีเหลือง”, ;
Option2.Height = 18, Option2.Left = 5, ;
Option2.Top = 25, Option2.Width = 68, ;
Option3.FontName = “CordiaUPC”, Option3.FontSize = 16, ;
Option3.Caption = “สีเขียว”, ;
Option3.Height = 18, Option3.Left = 5, ;
Option3.Top = 45, Option3.Width = 68, ;
Option4.FontName = “CordiaUPC”, Option4.FontSize = 16, ;
Option4.Caption = “สีน้ำเงิน”, ;
Option4.Height = 18, Option4.Left = 5, ;
Option4.Top = 65, Option4.Width = 68, ;
Option5.FontName = “CordiaUPC”, Option5.FontSize = 16, ;
Option5.Caption = “สีขาว”, ;
Option5.Height = 18, Option5.Left = 5, ;
Option5.Top = 85, Option5.Width = 68

ADD OBJECT MyCheckBox AS CheckBox WITH ;
Top = 84, Left = 144, Height = 49, Width = 121, ;
FontName = “CordiaUPC”, FontSize = 16, ;
Caption = “แสดงหน้าต่าง”, Value = 1

PROCEDURE myButton.Click
RELEASE THISFORM
CLEAR EVENTS
ENDPROC

PROCEDURE myCheckBox.Click
IF myForm.myCheckBox.Value = 1
myForm2.Show
ELSE
myForm2.Hide
ENDIF
ENDPROC

PROCEDURE myGroup.Click
DO CASE
CASE myForm.myGroup.Value = 1
myForm2.BackColor = RGB(255,0,0)
CASE myForm.myGroup.Value = 2
myForm2.BackColor = RGB(255,255,0)
CASE myForm.myGroup.Value = 3
myForm2.BackColor = RGB(0,255,0)
CASE myForm.myGroup.Value = 4
myForm2.BackColor = RGB(0,0,128)
CASE myForm.myGroup.Value = 5
myForm2.BackColor = RGB(255,255,255)
OTHERWISE
myForm2.BackColor = RGB(255,255,255)
ENDCASE
myForm2.Refresh
ENDPROC
ENDDEFINE

DEFINE CLASS DisplayColor AS FORM
Caption = myProgram
Top = 1
Left = 320
Height = 250
Width = 300
ENDDEFINE

เมื่อคุณได้เรียกโปรแกรมขึ้นมาแล้วคุณก็จะได้พบกับวิธีการใช้คำสั่ง IF…ENDIF, IIF(), DO CASE…ENDCASE ว่าทำงานอย่างไรแล้วคุณทราบหรือไม่ว่า คำสั่ง IF กับคำสั่ง DO CASE ต่างกันอย่างไร อย่าบอกว่าเขียนต่างกันนะครับ เปล่าครับคำสั่งสองคำสั่งนี้ทำงานเหมือนกัน เอ้าแล้ทำมาทำไมล่ะ? มันต่างกันที่จุดประสงค์ คำสั่ง DO CASE เขาทำขึ้นมาเพื่อคำความสะดวกในการเขียนโปรแกรมแบบที่มีทางเลือกหลายๆ ทาง ส่วน คำสั่ง IF ก็สามารถทำได้ แต่การเขียนโปรแกรมจะยุ่งยากมากกว่าครับ ยังมีอีกย่างนึงในอดีตมันเกี่ยวกับเรื่องของความเร็วในการประมวลผลด้วย แล้วท่านทราบหรือไม่ว่าคำสั่งไหนทำงานเร็วกว่ากัน?

คำสั่งที่ให้ทำงานซ้ำๆกัน
คำสั่งประเภทนี้จะเป็นคำสั่งที่มีการทดสอบเงื่อนไขแล้วถ้าผลของเงื่อนไขนั้นเป็นจริง(True) ก็จะทำงานซ้ำๆกันไปจนกว่าเงื่อนไขจะเป็นเท็จ(False) แล้วก็จะออกจากลูป(Loop) ของคำสั่งนั้นๆ คำสั่งประเภทนี้ได้แก่
คำสั่ง DO WHILE…ENDDO
DO WHILE lExpression
Commands
[LOOP]
[EXIT]
ENDDO

คำสั่ง FOR…ENDFOR
FOR MemVarName = nInitialValue TO nFinalValue [STEP nIncrement]
Commands
[EXIT]
[LOOP]
ENDFOR | NEXT

คำสั่ง SCAN…ENDSCAN
SCAN [NOOPTIMIZE] [Scope] [FOR lExpression1] [WHILE lExpression2]
[Commands]
[LOOP]
[EXIT]
ENDSCAN

ให้คุณทำการสร้างโปรแกรมชื่อ Program3 แล้วพิมพ์คำสั่งตามตัวอย่างด้านล่างแล้วทำการรันโปรแกรมนั้นดู

* Program3
* Test will hold references to 5 forms
PUBLIC ARRAY test(1)
DIMENSION test(5)
STORE 1 TO nCount
DO WHIL nCount <= 20
? ‘Display Loop ====>  ‘ + ALLTRIM(STR(nCount))
nCount = nCount + 1
ENDDO
WAIT WINDOW ‘Press any key to continue.’
* Clear the screen
_SCREEN.CLS
* Fill the array with forms
FOR nCount = 1 TO 5
test(nCount) = CREATEOBJECT(“testform”)
ENDFOR
* Ask the user if they want to see the forms
nAnswer = MESSAGEBOX(“Do you want to see the forms?”, ;
36, “Multiple Instances – Arrays”)
IF nAnswer = 6 && yes
FOR nCount = 1 TO 5
IF TYPE(“test(nCount)”) = “O”   && “O” = Object
test(nCount).Show
test(nCount).Top = 30*nCount
test(nCount).Left = 50*nCount
_SCREEN.ActiveForm.BackColor=RGB(51*ncount,255,255)&&less than or equal to  255
ENDIF
ENDFOR
ENDIF

* Form class testform
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

คำสั่งทั้ง 3 คำสั่งข้างต้นนั้นมีความแตกต่างกันพอสมควร โดยคำสั่ง DO WHILE นั้นจะทำการทดสอบเงื่อนไขได้ทุกประเภทไม่ว่าจะเป็น ตัวเลข ตัวอักษร เมื่อได้ค่าเป็นจริงแล้วก็จะทำงานตามคำสั่งในลูป DO WHILE เป็นคำสั่งดั้งเดิมของ foxbase
ส่วนคำสั่ง FOR…NEXT และ SCAN นั้นเพิ่งจะมีขึ้นในสมัย FoxPro (ก่อน Visual FoxPro) จริงๆแล้วคำสั่ง DO WHILE สามรถทำได้ทุกอย่างหรือเกือบจะทุกอย่างที่ FOR…NEXT และ SCAN ทำได้ แต่เขาทำขึ้นเพื่อความสะดวกในการใช้งานให้มีมากยิ่งขึ้น คำสั่ง FOR…NEXT จะทำการทดสอบเงื่อนไขตัวเลข ส่วนคำสั่ง SCAN ะทำการทดสอบเงื่อนไขที่อยู่ในแฟ้มข้อมูล แต่การใช้งานใน 2 คำสั่งหลังนี้จะมีความง่ายกว่า DO WHILE มากถ้าใช้ในลักษณะเดียวกัน

จากตัวอย่างข้างต้นผมมีคำสั่งหนึ่งที่จะขอแนะนำให้คุณได้ทำความรู้จักไว้
เพราะในการเขียนโปรแกรมคุณจำเป็นจะต้องใช้มันอย่างแน่นนอน แล้วในตัวอย่างต่อๆไปผมจะพยายามแทรกคำสั่ง (command)  และฟังก์ชั่น (function) ต่างๆเท่าที่ผมนึกออกและใช้งานได้จริง
        คำสั่ง (ฟังก์ชั่น) MESSAGEBOX( )
ฟังก์ชั่นนี้จะเป็นการแสดงไดอะลอกบ๊อกซ์ (dialog box) ขึ้นมาเพื่อส่งข่าวสารบางอย่างให้ผู้ใช้งานทราบ
แล้วตอบคำถามตามที่ต้องการ มีรูปแบบการใช้ดังนี้

MESSAGEBOX(cMessageText [, nDialogBoxType [, cTitleBarText]

cMessageText        คือข้อความที่ต้องการให้แสดงในไดอะลอกบ๊อกซ์
nDialogBoxType     คือตัวเลขที่ใช้บอกว่าจะให้มีปุ่มอะไรบ้างเพื่อให้ผู้ใช้งานตอบกลับมา
แล้วจะมีสัญลักษณ์รูปภาพแสดงด้วยหรือไม่ และใช้กำหนดปุ่ม Default
ค่าที่ต้องการให้แสดงปุ่มต่างๆ มีดังนี้
0        ปุ่ม OK
1        ปุ่ม OK และ Cancel
2        ปุ่ม Abort, Retry, และ Ignore
3        ปุ่ม Yes, No, และ Cancel
4        ปุ่ม Yes และ No
5        ปุ่ม Retry และ Cancel
ค่าที่ต้องการให้แสดงสัญลักษณ์รูปภาพ มีดังนี้
16      สัญลักษณ์ Stop
32      สัญลักษณ์ Question mark
48      สัญลักษณ์ Exclamation point
64      สัญลักษณ์ Information (i) icon
ค่าที่ใช้กำหนดปุ่ม Default มีดังนี้
0       ปุ่มแรก
256     ปุ่มที่สอง
512     ปุ่มที่สาม
ในการใช้งานนั้นถ้าเราต้องการให้แสดงปุ่ม Yes, No ,Cancel
และต้องการแสดงสัญลักษณ์ Stop แล้วให้ปุ่ม Default อยู่ที่ปุ่มที่สอง
ก็ให้นำค่าทั้ง 3 ค่านั้นมารวมกัน จะได้ค่าเท่ากับ 3 + 16 + 256 = 275
cMessageText        คือข้อความที่ต้องการให้แสดงส่วนหัวของไดอะลอกบ๊อกซ์
เมื่อผู้ใช้งานตอบคำถามกลับมาก็จะมีค่าตัวเลขส่งกลับมาให้เพื่อที่เราจะได้นำไปประมวลผลต่อไป ซึ่งมีดังนี้
1     เมื่อกดปุ่ม OK
2     เมื่อกดปุ่ม Cancel
3     เมื่อกดปุ่ม Abort
4     เมื่อกดปุ่ม Retry
5     เมื่อกดปุ่ม Ignore
6     เมื่อกดปุ่ม Yes
7     เมื่อกดปุ่ม No
คุณสามารถทดสอบได้โดยการป้อนคำสั่งนี้ที่ Command Windows ได้เลยแล้วดูว่าผลเป็นอย่างไรบ้าง
เช่น     nAnswer = MESSAGEBOX(“Do you want to see the forms?”  36, “Multiple Instances – Arrays”)
? nAnswer
6 (ผลลัพธ์ เมื่อกดปุ่ม Yes)