ภาษาเบสิก และกรณีศึกษา
เว็บเพจสำรอง (Backup webpages) : thaiall.com | thaiabc.com
ปรับปรุง : 2557-01-16 (ส่วนรายละเอียดของวีบี)
กลับสารบัญ (Back to Content)
ภาษาโปรแกรม (Program Language) # คือ วิธีการมาตรฐานในการสื่อสารสำหรับแสดงคำสั่งไปยังคอมพิวเตอร์ ภาษาโปรแกรมกำหนดไวยากรณ์และการตีความหมายจากโปรแกรมคอมพิวเตอร์ที่เขียนขึ้น ภาษาโปรแกรมทำให้โปรแกรมเมอร์สามารถระบุอย่างชัดเจนถึงข้อมูลที่คอมพิวเตอร์จะทำงาน และวิธีการที่คอมพิวเตอร์จะประมวลผลข้อมูลเหล่านั้น
ภาษาเบสิค (Basic Language) คือ ภาษาคอมพิวเตอร์ที่พัฒนาโดยจอห์น เคมเมนี (John Kemeny) และ ธอมัส เคิรตส์ (Thomas Kurtz) แห่งวิทยาลัยดาร์ทเมิร์ท (Dartmouth College) ในปีค.ศ. 1963
วิชวลเบสิก (Visual Basic) คือ ภาษาคอมพิวเตอร์สำหรับสร้างโปรแกรมประยุกต์ (Application) ที่ใช้งานได้อย่างหลากหลายบนระบบปฏิบัติการวินโดว์ และสามารถเรียกใช้วัตถุที่ตัวแปลภาษาเตรียมไว้ให้บริการ
Programming :: VB :: VB.NET :: ASP.NET :: GWBasic :: ASP ::

ตอนที่ 1 :
ใช้ general component ที่ระบบเตรียมมาให้แต่แรก
Download : chap001.zip
บทที่ 1 : สร้าง form และปุ่ม close
เมื่อเริ่มต้น ผู้เรียนลองสร้างฟอร์มง่าย ๆ ขึ้น 1 ฟอร์ม และสร้างปุ่มขึ้น 1 ปุ่ม โดยปุ่มนั้นได้มาจาก General componets, Command button จากนั้นให้ Double click เหนือปุ่ม Command button จะเข้าสู่ส่วน code ให้ใส่คำสั่งว่า Unload me ซึ่งเป็นคำสั่งปิดฟอร์มปัจจุบัน จากนั้นสั่งจัดเก็บจะได้แฟ้ม chap001.vbp สำหรับการอ้างอิงแฟ้มทั้งหมด ส่วน chap001.frm จะหมายถึงฟอร์มรวมทั้ง code ที่พิมพ์เข้าไปในฟอร์ม ตัวอย่างนี้ได้แฟ้มสำคัญเพียง 2 แฟ้มดังกล่างเท่านั้น
    คำสั่งควรทราบ
    unload me
แบบฝึกหัด
? สร้างฟอร์ม และเพิ่มปุ่มปิดฟอร์มอีกปุ่มหนึ่ง
? สร้าง command button ใหม่โดยใส่คำสั่ง msgbox("x")
? สร้าง command button ใหม่โดยใส่คำสั่ง x = InputBox("abc", "def")

Download : chap002.zip
บทที่ 2 : ปุ่มควบคุมบวก และลบของ textbox
สร้างปุ่ม 2 ปุ่ม เพื่อควบคุมการแสดงผลใน text box โดยปกติแล้ว text box ใช้รอรับค่า เป็นส่วนใหญ่ แต่ในที่นี้ใช้สำหรับการแสดงผลที่เกิดจากการกดปุ่ม บวก หรือลบ โดยทำให้ค่าจำนวนเปลี่ยนแปลงไป
    คำสั่งควรทราบ
    Text1 = Text1 + 1
แบบฝึกหัด
? สร้างปุ่มคูณสอง
? สร้างปุ่มบวกสอง
? สร้าง text box อีก 1 และทำให้การบวก ลบ นำ text box ใหม่มาร่วมใช้

Download : chap003.zip
บทที่ 3 : เปลี่ยนคุณสมบัติของ shape เป็นรูปทรงต่าง ๆ
กำหนดรูปร่างให้กับ Shape ซึ่งเป็น general component หนึ่ง โดยค่าของ shape เป็น 0 = rectangle, 1 = square, 2 = oval, 3 = circle, 4 = rounded rectangle, 5 rounded square โดยการเลือกจากปุ่ม Option button ซึ่งใช้ร่วมกับ frame จะทำให้สามารถเลือกได้ครั้งละ 1 ปุ่ม
    คำสั่งควรทราบ
    Shape1.Shape = 1
    Shape1.Shape = 2
แบบฝึกหัด
? ให้เพิ่ม frame ให้และเลือกกำหนด backcolor หรือ bordercolor หรือ fillcolor
? ให้เพิ่มช่อง สำหรับกำหนดขนาด width และ height ของ shape

Download : chap004.zip
บทที่ 4 : การใช้ menu editor สร้าง menu bar ส่วนตัว
Right click บนพื้นฟอร์ม จะมีตัวเลือก Menu editor ให้เลือกเพื่อสร้างระบบ menu แบบ แบบ pulldown menu ได้โดยง่าย จากนั้นเข้าสู่ฟอร์มอีกครั้ง เมื่อ click ที่ตัวเลือกจะสามารถใส่คำสั่งที่ต้องการให้กับตัวเลือกได้ ตัวอย่างนี้จะเลือกตัวเลือกเพื่อเปลี่ยนขนาดของ Label ที่อยู่ในฟอร์ม
    คำสั่งควรทราบ
    Label1.FontSize = 10
แบบฝึกหัด
? เพิ่ม label และเปลี่ยนขนาดได้ 2 label พร้อมกัน
? เพิ่มตัวเลือก และสั่ง msgbox

Download : chap005.zip
บทที่ 5 : สร้างหลาย form และสั่งเปิดปิดตามต้องการ
สร้างฟอร์ม 3 ฟอร์มให้ project นี้ แต่ละฟอร์มมีปุ่มใช้เปิดฟอร์มใหม่ แต่ฟอร์มที่ 3 ปิดตนเองและฟอร์มที่ 2 แต่เปิดฟอร์ม 1 ขึ้นมา สำหรับ code ของแต่ละฟอร์มจะเก็บอยู่ในฟอร์มนั้น ๆ มิได้แยกเก็บต่างหาก
    คำสั่งควรทราบ
    Unload Me
    Unload Form2
    Form1.Show
แบบฝึกหัด
? สร้างฟอร์มที่ 4 ขึ้น แต่มีปุ่มสั่งเปิดปิดฟอร์มอื่น
? สร้างฟอร์มที่ 5 ให้มีคำสั่ง msgbox ประจำปุ่ม

Download : chap006.zip
บทที่ 6 : ควบคุม visible ของแต่ละ object
สร้าง frame และปุ่มควบคุมการเปิดปิด แต่ละ frame โดยปกติแล้ว frame สามารถบรรจุ component ได้มากมาย การสั่งแสดงหรือไม่ จะเป็นการรวบไปถึง component ทั้งหมดใน frame นั้นด้วย
    คำสั่งควรทราบ
    Frame1.Visible = False
    Frame1.Visible = True
แบบฝึกหัด
? สร้าง frame ใหม่ และปุ่มใหม่เป็นปุ่มต่อไป
? สร้าง frame ใหม่ และให้มีปุ่มอยู่ใน frame นั้น

Download : chap007.zip
บทที่ 7 : สุ่มเลข เพื่อทดสอบการควบคุม list box
สุ่มเลขส่งเข้า list box 20 จำนวน แล้วสร้างปุ่ม clear ค่าทั้งหมด ปุ่มลบบางค่า มี text ที่แสดงว่าปัจจุบัน cursor อยู่ใน list บรรทัดที่เท่าใด และมีค่าใด
    คำสั่งควรทราบ
    Randomize (Timer)
    For i = 1 To 20
    List1.AddItem Int(Rnd * 100)
    Next

    List1.Clear

    List1.RemoveItem (Text2)

    Text1 = List1
    Text2 = List1.ListIndex
แบบฝึกหัด
? ให้ทำแบบที่ผมทำนี้ให้ได้
? ให้สุ่มเลขมากกว่า 20 จำนวน และมีค่ามากกว่า 2 หลัก

Download : chap008.zip
บทที่ 8 : สุ่มเลข ส่งเข้า list box และส่งเข้า combo box อีกครั้ง
เพิ่มจากบทที่ 7 แต่สามารถคัดลอกค่าจาก list box ส่งเข้า combo box พร้อมนับจำนวนใน combo box ที่รับเข้ามา
    คำสั่งควรทราบ
    List1.SetFocus
    List1.ListIndex = 5

    Combo1.AddItem List1
    Text1 = Combo1.ListCount
แบบฝึกหัด
? สร้าง combo box มารับค่าอีกตัวหนึ่ง คู่กันกับของเดิม
? หาผลรวมของทุกค่าใน combo box แสดงพร้อมจำนวน

Download : chap009.zip
บทที่ 9 : สุ่มเลขจำนวนมาก ส่งเข้า list box, combo box และตรวจคู่คี่
List box รับจำนวนได้สูงสุด 32736 จำนวน แต่ละบรรทัดมีสองค่าคั่นด้วย , จากนั้นนำทั้ง 2 ค่ามารวมกัน แล้วย้ายค่าไปยัง combo box จากนั้นเปรียบเทียบค่าที่ได้ว่าเป็นเลขคู่(Even) หรือเลขคี่(Odd) เพื่อแสดงผล
    คำสั่งควรทราบ
    y = Split(List1, ",", -1, vbTextCompare)
    z = Int(y(0)) + Int(y(1))
    Combo1.AddItem z
    Combo1.Text = z
    List1.RemoveItem List1.ListIndex
    Text2 = "Even"
    If z Mod 2 = 1 Then Text2 = "Odd"
    Text1 = Combo1.ListCount
    List1.SetFocus
    List1.ListIndex = z
แบบฝึกหัด
? เดิมหาผลรวม 2 ค่าแล้วย้ายไป ให้เปลี่ยนเป็นผลคูณ
? เดิมมี 2 ค่า ในแต่ละบรรทัด ให้เพิ่มเป็น 3

Download : chap010.zip
บทที่ 10 : เพิ่ม ลบ แก้ไขจาก list box โดยคุม visible และ enabled
จำลองการทำงานของแฟ้ม โดยมีปุ่ม สร้างข้อมูลให้ตาราง เพิ่ม ลบ และแก้ไข โดยแต่ละปุ่มทำงานควบคู่กับการสั่งแสดง text box ได้อย่างเหมาะสม ไม่สับสน
    คำสั่งควรทราบ
แบบฝึกหัด
? ให้เพิ่มเขตข้อมูล
? ให้เปลี่ยนเป็นภาษาไทย

Download : chap011.zip
บทที่ 11 : ค้นหาส่วนหนึ่งส่วนใดของระเบียนก็ได้
จำลองการทำงานของแฟ้มเช่นกัน แต่แสดงการทำงานเฉพาะส่วนของ filter เพื่อเลือกข้อมูลที่ต้องการ จากจุดใดก็ตามของแต่ละระเบียน แล้วแสดงระเบียนที่มีอักษรตามที่ต้องการบรรจุอยู่
    คำสั่งควรทราบ
    List1.ListIndex = -1
    For i = 1 To List1.ListCount
    List1.ListIndex = List1.ListIndex + 1
    If InStr(1, List1, Text1, vbTextCompare) > 0 Then
    List2.AddItem List1
    End If
    Next
แบบฝึกหัด
? เพิ่มเขตข้อมูล
? รวมเพิ่ม ลบ แก้ไข เข้ากับโปรแกรมนี้

Download : chap012.zip
บทที่ 12 : ค้นหาข้อมูลแบบเลือกมากกว่า และตาม primary key
จำลองการทำงานของแฟ้มเช่นกัน แต่เป็นการคนหาในอีก 2 วิธี คือเลือกระเบียนที่มีบางเขตข้อมูลมีค่าจำนวนมากกว่าที่กำหนด หรือเลือกแสดงตามเขตข้อมูลที่เป็น primary key
    คำสั่งควรทราบ
    For i = 1 To List1.ListCount
    List1.ListIndex = List1.ListIndex + 1
    y = Split(List1, ",", -1, vbTextCompare)
    If y(0) = Val(Text2) Then
    Text3 = y(1)
    Text4 = y(2)
    End If
    Next

    List1.ListIndex = -1
    For i = 1 To List1.ListCount
    List1.ListIndex = List1.ListIndex + 1
    y = Split(List1, ",", -1, vbTextCompare)
    If y(2) > Val(Text1) Then
    List2.AddItem List1
    End If
    Next
แบบฝึกหัด
? เพิ่มเขตข้อมูล
? ทำให้มีการค้นหาได้ทั้ง 3 แบบ
? เพิ่มการ เพิ่ม ลบ แก้ไข

Download : chap013.zip
บทที่ 13 : เปิดปิดฟอร์ม และภาพในจุดต่าง ๆ
แสดงการเปิดปิดฟอร์มด้วย form1.show หรือ form1.visible = true และการใส่ภาพใน picture ของพื้น ปุ่ม และ image สำหรับการใส่ภาพในปุ่มต้องกำหนดให้ style เป็นแบบ graphic จึงจะมีภาพออกในปุ่ม ส่วนภาพพื้นจะต้องทำภาพต้นแบบให้กว้างเท่าที่ต้องการก่อนส่ง
    คำสั่งควรทราบ
    form2.visible = true
    '
    form2.show
    '
    end
    '
    unload form1
แบบฝึกหัด
? ทำแบบที่ผมทำ โดยเปลี่ยนภาพ
? ทำ game จับผิดภาพเหมือน ถ้าถูกจึงเปิด form ใหม่

โปรแกรมนี้ง่าย ไม่จำเป็นต้อง Download
บทที่ 14 : นาฬิกา Ditital
โปรแกรมแสดงนาฬิกา เดินเร็วตามต้องการ สามารถนำไปประยุกต์กับโปรแกรมต่าง ๆ ได้ โดยใช้ Timer component ช่วยจัดการด้านเวลา สิ่งที่ต้องทำ คือปรับ properties ของ timer ในส่วนของ interval ให้เป็น 1000 คือ 1 วินาที
    คำสั่งควรทราบ
    Private Sub Timer1_Timer()
    Text1 = Format(Time, "long time")
    End Sub
แบบฝึกหัด
? ทำแบบที่ผมทำ ปรับรูปแบบให้สวยงาม
? เติมปุ่มต่าง ๆ และนำไปประยุกต์ให้ใช้งานตามต้องการ

Download : photoword.zip | photoword.exe
บทที่ 15 : เกมคลิ๊กภาพ
เป็นการควบคุม object ต่าง ๆ ให้เปิดปิดคุณสมบัติ ตามต้องการ เป็นการเขียนที่ง่าย แต่ยากในการวางแผน และการหาภาพ คุณสมบัติที่เกี่ยวข้องเช่น enabled visible transparent width height backstyle caption windowstate
    Source code ที่ใช้งาน
แบบฝึกหัด
? ทำแบบที่ผมทำ ปรับรูปภาพเป็นภาพอื่น
? นำไปทำเกมด้านภาษาก็ได้
? นำไปประยุกต์ทำเกมจับผิดภาพ

Download : ballrun.exe
บทที่ 16 : บอลวิ่งในจอภาพ
โปรแกรมตรวจสอบตำแหน่งของวัตถุที่วิ่งในจอภาพ การใช้ width กับ height ความยาก หรือความต้องการให้ฝึกฝน คือการเรียนรู้การควบคุมวัตถุ ขณะเปลี่ยนแปลงตำแหน่ง ทำให้เคยชินกับการควบคุม width height left top และการแสดงผล
    Source code ที่ใช้งาน
แบบฝึกหัด
? ทำแบบที่ผมทำ ปรับขนาดรูป หรือเปลี่ยนเป็น image
? เพิ่ม object ในการวิ่ง
? ให้ประยุกต์ โดยเปลี่ยนภาพ เพิ่มฟอร์ม และ object ให้ดูดีขึ้น

Download : dif.zip | dif.exe

ตัวอย่างคำสั่งเกี่ยวกับเวลา ที่น่าสนใจ
Text1 = Time - CDate(Form2.Text1)
Text1 = Format(Text1, "long time")
บทที่ 17 : จับผิดภาพเหมือน
โปรแกรมนี้แสดงการควบคุมวัตถุ นำบทที่ 15 มาปรับปรุง แต่เพิ่มการเชื่อมฟอร์มหลายฟอร์ม มีการส่งค่าระหว่างฟอร์ม การใช้คำสั่ง end หยุดโปรแกรม สิ่งที่ยากในการเขียนโปรแกรมนี้คือ การหาภาพที่น่าสนใจ มาสร้างเป็นตัวเลือก ส่วนโปรแกรมก็เน้นการควบคุมวัตถุ และการส่งค่าระหว่างฟอร์มเป็นหลัก
    Source code ที่ใช้งาน
แบบฝึกหัด
? ทำแบบที่ผมทำ เปลี่ยน image และปรับให้ดูดีมากขึ้น
? เพิ่ม level หรือเพิ่มฟอร์มให้มากขึ้น แทนที่จะมีเพียง 3
? ให้ประยุกต์ โดยออกแบบเกมต่าง ๆ ไว้เล่นเอง

Download : numtxt.exe
บทที่ 18 : เปลี่ยนจำนวนเงินเป็นตัวอักษร
โปรแกรมนี้นำ source code มาจากเว็บของ อ.ถนอม คณิตปัญญาเจริญ thanom.net โดยนำตัวเลขจาก text1 มาแปลงเป็นตัวอักษร แล้วเก็บลง text2 โปรแกรมนี้จะเปลี่ยนตัวเลขทันทีเพื่อเปลี่ยน เพราะใช้คุณสมบัติ on change ผู้เรียนสามารถนำไปประยุกต์กับระบบทางธุรกิจได้ทันที และเป็นโปรแกรมแรกที่ผมแสดงการเขียน function ขึ้นใช้งาน ที่ต่างไปจาก sub เพราะ function นี้จะคือค่าจากการประมวลผล
    Source code ที่ใช้งาน
แบบฝึกหัด
? ทำแบบที่ผมทำ เปลี่ยนรูปแบบ และไม่ใช้คุณสมบัติ on change แต่ใช้ command_click แทน
? ลองนำไปใช้ร่วมกับ object ต่าง ๆ ให้ดูมีประโยชน์ขึ้น
? ให้ประยุกต์ โดยสร้างกรณีศึกษาประกอบการใช้ function นี้

Download : slide.exe
บทที่ 19 : สไลด์ นำเสนอข้อมูลพร้อมภาพ
โปรแกรมนี้จะเลื่อน slide ต้องกดปุ่ม next หรือ previous โปรแกรมมีการใช้ อาเรย์ ของ image1 เมื่อสร้าง image1 แล้วให้ copy image1 เพื่อสร้าง array อีก 3 object ส่วน text1 ผมพยายามจะเปลี่ยนคุณสมบัติ multiline แต่โปรแกรมบอกว่าเป็น readonly จึงต้องเปลี่ยนแบบ manual ส่วนภาพ ได้ลองเขียนโปรแกรมส่งชื่อภาพเข้าคุณสมบัติ picture แต่ไม่ได้ครับ พอใช้ msgbox ดูคุณสมบัติ ปรากฎว่าเป็นตัวเลข ทำให้ทราบว่าส่งแค่ชื่อ ภาพคงไม่เข้าไปใน image แน่
    Source code ที่ใช้งาน
แบบฝึกหัด
? ทำแบบที่ผมทำ โดยเพิ่มจำนวน slide เปลี่ยนภาพ และเปลี่ยนข้อมูลดูนะครับ
? ลองตั้งเวลาให้ slide เลื่อนเองดู
? ลองเพิ่ม slide ใน 1 form พร้อมกับ เพิ่มฟอร์มไปด้วย ให้มีข้อมูลหลายรูปแบบ

บทที่ 20 : เครื่องคิดเลขอย่างง่ายมีเฉพาะปุ่ม +
สร้าง 1 textbox กับ command1 แบบ array 0 ถึง 13 ให้ปุ่ม 10 คือ + ปุ่ม 11 คือ = ปุ่ม 12 คือ C ปุ่ม 13 คือ Backspace โดยนักศึกษาต้องเติมข้อมูลใน Caption ด้วยตนเองนะครับ แล้วก็จัดตำแหน่งให้สวยงาม เพราะถ้าใช้ code จัดจะเปลืองพื้นที่ source code จากนั้นก็ใช้ source code นี้ได้เลย มีความสามารถตามปุ่มเหมือนเครื่องคิดเลขใน windows ทุกประการ .. (เฉพาะปุ่มที่ผมสร้างนะครับ)
    Source code ที่ใช้งาน
แบบฝึกหัด
? ทำแบบที่ผมทำ มีปุ่ม + ปุ่มเดียว
? เพิ่มปุ่มลบ คูณ หาร
? เพิ่มปุ่มแปลงเลขฐาน

บทที่ 21 :
มาจากตัวอย่าง 18 เปลี่ยนจำนวนเงินเป็นตัวอักษร แต่เพิ่มเสียงอ่านตัวอักษรเข้าไป
    Source code ที่ใช้งาน
แบบฝึกหัด
? ทำแบบที่ผมทำ มีปุ่ม + ปุ่มเดียว
? เปลี่ยนเป็นนับเลขเหมือน Bank

ตอนที่ 2 :
ระบบฐานข้อมูล
ด้วย Data Control
Download : chap101.zip
บทที่ 101 : ใช้ Data control ร่วมกับ Text box
โปรแกรมนี้ใช้ Data control(Data component) ดึงข้อมูลจาก Microsoft Access มาใช้ แล้วให้ Textbox รับข้อมูลจาก Data control อีกครั้งหนึ่ง วิธีนี้สามารถแก้ไขข้อมูลในแฟ้ม Microsoft access ได้โดยตรง .. ตัวอย่างนี้ไม่มีการเรียกใช้ component พิเศษอื่นใด ตัวอย่างนี้ใช้ได้แน่ ถ้าในเครื่องท่านมีแฟ้ม Nwind.mdb ซึ่งเป็นแฟ้มที่มักติดตั้งมาพร้อม Visual Basic
    ขั้นตอน
    1. เปิด VB6.0 แล้วเลือก Standard EXE แล้ว Open
    2. click Textbox จาก Toolbox
    3. เลื่อน mouse ไปที่ form แล้ว click ค้างไว้ พร้อมลากไปทางขวาขนาดพอใส่ข้อมูลได้
    4. ทำตามข้อ 3 สร้าง text2 และ text3 ไว้เตรียมแสดงข้อมูล
    5. click Data หรือ Data control จาก Toolbox แล้วทำคล้ายข้อ 3
    6. สรุปว่าใน form1 จะมี Object อยู่ 4 Object นะครับ
    7. กำหนดคุณสมบัติ หรือ Properties ให้กับ Data1 3 อย่างดังข้อมูลด้านล่าง
    8. กำหนดคุณสมบัติ หรือ Properties ให้กับ Text1 2 อย่างดังข้อมูลด้านล่าง
    9. กำหนดคุณสมบัติ หรือ Properties ให้กับ Text2 2 อย่างดังข้อมูลด้านล่าง
    10. กำหนดคุณสมบัติ หรือ Properties ให้กับ Text3 2 อย่างดังข้อมูลด้านล่าง
    11. แล้วก็ save Project หาห้องเก็บให้เป็นระเบียน .. เวลาเรียกมาอีกจะได้หาเจอ
    12. ผลการจัดเก็บจะได้ 2 แล้วคือ .vbp และ .frm ถ้า save แล้วก็ลองปิด VB
    13. ลองเปิด VB และเปิดแฟ้ม .vbp ขึ้นมาใหม่ดูครับ
    14. ถ้ามีปัญหาการทำตาม ให้ไปดูบทที่ 107 เพราะมีไม้เท้าวิเศษ ช่วยสร้างให้หมดครับ

    ข้อกำหนดใน Properties
    Data1 Properties
    Databasename = C:\Program Files\Microsoft Visual Studio\VB98\Nwind.mdb
    RecordType = Table
    RecordSource = Categories
    Text1 Properties
    Datasource = Data1
    Datafield = CategoryID
    Text2 Properties
    Datasource = Data1
    Datafield = CategoryName
    Text3 Properties
    Datasource = Data1
    Datafield = Description
แบบฝึกหัด
? ให้เปลี่ยนเป็น table อื่น เช่น Customers หรือ Employees เป็นต้น
? ให้สร้างแฟ้ม .mdb ใช้เอง และเรียก table ของตนเอง

Download : chap102.zip
บทที่ 102 : ใช้ Data control ร่วมกับ DBGrid
ถ้าใน Toolbox ไม่มี DBGrid ให้กดปุ่ม Ctrl-T แล้วทำเครื่องหมายถูกหน้าคำว่า Microsoft Data Bound Grid Control 5.0(SP3) (c:\windows\system\dbgrid32.ocx) แล้วกดปุ่ม apply จะทำให้มี Control ใหม่โผ่ขึ้นมาใน Toolbox อีก 1 Object ชื่อว่า DBGrid
เลือก DBGrid จาก Toolbox แล้ว click ลากขนาดประมาณ 80% ของฟอร์มใน form1 สำหรับหน้าที่ของ DBGrid ก็คือนำข้อมูลจาก Data control ไปแสดงตารางได้อย่างง่าย และยังสามารถแก้ไขข้อมูลในตารางได้ทันที ในบทนี้มีแฟ้มเกี่ยวข้อง 3 แฟ้ม คือ .vbp และ .frm ซึ่งมีเป็นปกติ แต่แฟ้ม .frx เกิดขึ้น เพราะการใช้ DBGrid หากลบแฟ้มนี้ DBGrid ที่เคยใส่ไว้ในฟอร์มก็จะหายไปด้วย
    ข้อกำหนดใน Properties
    ส่วนของ Data control กำหนดเหมือน 101
    DBGrid1 Properties
    DataSource = Data1
แบบฝึกหัด
? ให้เปลี่ยนเป็น table อื่น
? ให้สร้างแฟ้ม .mdb ใช้เอง และเรียก table ของตนเอง

Download : chap103.zip
บทที่ 103 : เพิ่ม record ใหม่ด้วย Data control และควบคุม visible + enabled
เมื่อเริ่มต้นกำหนดให้ object ต่าง ๆ visible=false หลังกดปุ่ม addnew จึงจะแสดง object ผลของการกดปุ่ม add จะยังไม่มี record เกิดขึ้น จนกว่าจะสั่ง update หลัง update ทุกอย่างกลับมาสู่จุดเริ่มต้นใหม่ ไม่ให้สับสนว่าขณะนี้ต้องทำอะไร และตาราง categories กำหนดว่าต้องมีข้อมูลใน category name ถ้าท่านกดปุ่ม update โดยป้อนค่าให้ จะเกิด error จึงต้องป้องกันจุดนี้ไว้ ด้วยคำสั่ง if
    ข้อกำหนดใน Properties
    ส่วนของ Data control กำหนดเหมือน 101

    คำสั่งควรทราบ
    Data1.Recordset.AddNew

    If Len(Trim((Text2)) > 0 Then
    Data1.Recordset.Update
    Else
    Data1.Recordset.CancelUpdate
    Msgbox "ไม่มีการปรับปรุงค่า"
    End If
แบบฝึกหัด
? ให้เปลี่ยนเป็น table อื่น
? ให้สร้างแฟ้ม .mdb ใช้เอง และเรียก table ของตนเอง

Download : chap104.zip
บทที่ 104 : ลบ record ด้วยการค้นหาจนพบ แล้วจึง update หรือ cancel
เริ่มต้นรับเลข แล้วค้นหา(Seek) ตาม CategoryId หากเจอก็จะแสดงค่าของ record นั้น และรอให้กดปุ่ม update เพื่อลบจริง
- Data1.Recordset.Bookmark = เก็บตำแหน่งที่ชี้ใน Data control
- Data1.Recordset.Index = กำหนดให้เป็น Primary key ที่จะทำงานกับ seek
- Data1.Recordset.Seek = ค้นหาและส่งผลให้ Nomatch ว่าจริงหรือเท็จ
- Data1.Recordset.NoMatch = รับผลจากการ seek
    คำสั่งควรทราบ
    Bookmark = Data1.Recordset.Bookmark
    Data1.Recordset.Index = "PrimaryKey"
    Data1.Recordset.Seek "=", Val(Text4)
    If Data1.Recordset.NoMatch Then
      Data1.Recordset.Bookmark = Bookmark
    Else
      Command2.Enabled = True
      Text1.Visible = True
      Text2.Visible = True
      Text3.Visible = True
    End If

    If MsgBox("Are you sure to delete?", vbYesNo) = vbYes Then
      Data1.Recordset.Delete
      Data1.Refresh
    Else
      MsgBox "ไม่มีการปรับปรุงค่า"
    End If
แบบฝึกหัด
? ให้เปลี่ยนเป็น table อื่น
? ให้สร้างแฟ้ม .mdb ใช้เอง และเรียก table ของตนเอง

Download : chap105.zip
บทที่ 105 : แก้ไขข้อมูล สามารถเลือกทั้ง DBGrid, Data bar และ Seek
การแก้ไขใน Data control ผ่าน text box แทบไม่ต้องใช้คำสั่ง ในส่วนของการ update เพราะการค้นหาแล้วนำมาแสดง หากมีการแก้ไข จะทำการ update ให้ในทันทีอยู่แล้ว ไม่ต้องมีคำสั่ง update อีก แต่การค้นหาโดยระบบ PK เพียงอย่างเดียวใช้งานได้ยุ่งยาก จึงเพิ่ม DBGrid ทำให้เลือกได้ง่ายขึ้น สำหรับข้อควรระวังในการใช้ seek ร่วมกับ Data control คือต้องกำหนด Recordsettype เป็น table มิเช่นนั้นจะเกิด error ในการสั่ง index และการกำหนด Index สำหรับ Primarykey จะกำหนดชื่อ field ไม่ได้ ทราบเรื่องนี้จากการใช้ "C:\Program Files\Microsoft Visual Studio\VB98\VISDATA.EXE" ตรวจสอบแฟ้ม จึงทราบว่าต้องใช้ชื่ออะไร
    คำสั่งควรทราบ
    ให้ Properties of DBGrid,Datasource = data1
    ให้ Properties of DBGrid,AllowUpdate = false
    Bookmark = Data1.Recordset.Bookmark
    Data1.Recordset.Index = "PrimaryKey"
    Data1.Recordset.Seek "=", Val(Text4)
    If Data1.Recordset.NoMatch Then
      Data1.Recordset.Bookmark = Bookmark
    Else
      Text1.Visible = True
      Text2.Visible = True
      Text3.Visible = True
    End If

    Private Sub DBGrid1_click()
    Text4 = DBGrid1.columns(0)
    Text4.Refresh
    End Sub
แบบฝึกหัด
? ให้เปลี่ยนเป็น table อื่น
? ให้สร้างแฟ้ม .mdb ใช้เอง และเรียก table ของตนเอง

Download : chap106.zip
บทที่ 106 : DBGrid ที่เพิ่ม ลบ แก้ไข และการค้นหาจาก Index
ตอน right click ของ DBGrid ผมเลือก retrieve fields ทำให้คุณสมบัติทราบชื่อ field อัตโนมัติ และในคุณสมบัติผมก็เลือก AllowAddNew และ AllowDelete ทำให้สามารถจัดการกับข้อมูลผ่าน DBGrid ได้อย่างสมบูรณ์ ในส่วนของ Layout สามารถกำหนด width ให้แต่ละ column ได้โดยง่าย และแสดงการค้นหาตาม CategoryID หรือ CategoryName ซึ่งแฟ้มนี้กำหนดให้ทั้ง 2 Field นี้เป็น Index อยู่แล้ว
    คำสั่งควรทราบ
    Private Sub Command1_Click()
    Bookmark = Data1.Recordset.Bookmark
    Data1.Recordset.Index = "PrimaryKey"
    Data1.Recordset.Seek "=", Val(InputBox("Get categoryid"))
    If Data1.Recordset.NoMatch Then
      MsgBox ("Not found")
      Data1.Recordset.Bookmark = Bookmark
    End If
    End Sub

    Private Sub Command2_Click()
    Bookmark = Data1.Recordset.Bookmark
    Data1.Recordset.Index = "CategoryName"
    Data1.Recordset.Seek "=", InputBox("Get categoryname")
    If Data1.Recordset.NoMatch Then
      MsgBox ("Not found")
      Data1.Recordset.Bookmark = Bookmark
    End If
    End Sub
แบบฝึกหัด
? ให้เปลี่ยนเป็น table อื่น
? ให้สร้างแฟ้ม .mdb ใช้เอง และเรียก table ของตนเอง

Download : chap107.zip
บทที่ 107 : ใช้ Data form wizard กับ ADO data control สร้าง form อย่างง่าย
ขั้นตอนการสร้าง Data form wizard
1. เลือก Add-Ins จาก menu bar แล้วเลือก Add-In manager, VB 6 Data Form Wizard แล้ว Click ที่ Loaded/Unloaded แล้วกดปุ่ม OK
2. เลือก Data form wizard ด้วยการ Click ที่ Add-Ins, Data Form Wizard..., Next, เลือก Access แล้วกดปุ่ม Next, "C:\Program Files\Microsoft Visual Studio\VB98\Nwind.mdb", Next, Single record และ ADO Data control, Next, ในช่อง Record source เลือก Categories, เลือก 3 fields แรกมาด้านขวา, next, finish จะได้ form ใหม่ขึ้นมาใน project ของเรา จากนั้นอยากให้ฝึกย้ายปุ่ม แล้วลองฝึกย้าย source code จากฟอร์มหนึ่งไปอีกฟอร์มหนึ่ง ซึ่งผมลองย้ายจากที่สร้างมาใหม่ไป form1 ก็ไม่ยากอะไร
    ข้อควรทราบ
    ฟอร์มนี้ไม่ได้เขียน code เลย
    แค่เรียกตารางมาใช้ ไม่ให้ผิดพลาดก็ ok แล้ว


    Source code ที่ Wizard สร้างให้
แบบฝึกหัด
? ให้เปลี่ยนเป็น table อื่น
? ให้สร้างแฟ้ม .mdb ใช้เอง และเรียก table ของตนเอง

บทที่ 111 : สร้าง DSN ชื่อ nwind
สร้าง Data Source Name ชื่อ nwind เพื่อจะนำไปใช้ใน VB แต่ DSN ที่สร้างนี้ สามารถนำไปใช้ในโปรแกรมต่าง ๆ ได้มากมาย ผมเคยใช้ใน PHP และ ASP มาแล้ว และ nwind.mdb มีมากับ Microsoft Access จึงนำฐานข้อมูลนี้มาอธิบาย เพราะออกแบบระบบสั่งซื้อสินค้า ที่นำมาใช้เป็นตัวอย่างในการอธิบายระบบงานได้ง่าย
เมื่อสร้าง nwind ใน ODBC แล้ว ก็จะใช้วิธีการเชื่อมต่อข้อมูลแบบ Microsoft ADO Data Control 6.0 (OLE DB) ซึ่งเป็น Component ที่ท่านต้องเพิ่มเข้าไปใน toolbox ด้วยตนเอง ผลการเพิ่ม component นี้จะทำมี icon ชื่อ Adodc ให้นำไปใช้ได้

บทที่ 112 : เรียกใช้ Adodc และมีปุ่มเลื่อนไประเบียนข้างหน้า
    ขั้นตอน
    - ข้อมูลใน products ของ nwind.mdb มี 10 fields แต่ลองใช้ 3 fields
    - สร้าง 5 control ดังภาพ คือ 3 textbox, command และ adodc
    - เลือก ADODC properties ด้วยการ Right click จาก adodc bar ใน form
    : ส่วน General : เลือก Use ODBC Data Source Name ตามด้วย nwind จาก list
    : ส่วน RecordSource : เลือก SQL แล้วพิมพ์ select * from products
    - คุณสมบัติของ text1 ให้ DataSource=Adodc1 และ DataField=ProductID
    - คุณสมบัติของ text2 ให้ DataSource=Adodc1 และ DataField=ProductName
    - คุณสมบัติของ text3 ให้ DataSource=Adodc1 และ DataField=UnitPrice
    Source code ใน command1
    Private Sub Command1_Click()
    Adodc1.Recordset.MoveNext
    If Adodc1.Recordset.EOF Then
    Adodc1.Recordset.MoveFirst
    End If
    End Sub
    
แบบฝึกหัด
? สร้าง command2 เป็นปุ่มเลือกมาข้างหน้า ด้วยคำสั่ง moveprevious
? สร้าง command3 และ 4 เป็นปุ่ม movefirst และ movelast
? เปลี่ยนตารางจาก products เป็นอื่น ๆ (ตารางไหนก็ได้)

ตอนที่ 3 :
ระบบฐานข้อมูลด้วย DAO
Download : chap201.zip
บทที่ 201 : เรียกระเบียนแรก และกดปุ่มเพื่อแสดงระเบียนถัดไปด้วย DAO + JET
โปรแกรมนี้สั้น และง่าย เพราะต้องการทราบจำนวนระเบียนในฐานข้อมูล จึงสั่งเปิดตารางแบบ DAO แล้วแสดงข้อมูลระเบียนแรกใน Text1 หากกดปุ่มคำสั่ง ก็จะเลื่อนไประเบียนต่อไป
ในการเขียนโปรแกรมหากประกาศตัวแปรแบบ workspace และ database แล้วมีปัญหา แสดงว่าไม่ได้เรียก DAO library ขึ้นมา โดยเลือก Project จาก menu bar แล้วเลือก References จากนั้นทำเครื่องหมายเลือก Microsoft DAO 3.51 Object Library ก็จะทำให้เรียกคำสั่งเกี่ยวกับฐานข้อมูลมาใช้ได้ โดยโปรแกรมนี้จะเรียกข้อมูลมาแสดงทีละระเบียน หากกดปุ่มก็จะแสดงข้อมูลในระเบียนต่อไปขึ้นมา
    ขั้นตอน
    1. click Project, References.. จาก menu bar
    แล้วเพิ่ม Microsoft DAO 3.51 Object Library ด้วยการทำเครื่องหมายถูกใน check box
    2. สร้าง Textbox ชื่อ Text1
    3. สร้าง CommandButton ชื่อ Command1
    4. Copy source code ด้านล่าง ไปใส่ในส่วนของ View code window
    5. Run ได้เลยครับ

    Source code ที่ใช้งาน
แบบฝึกหัด
? ปัจจุบันยังเข้าไปแก้ข้อมูลแต่ไม่มีผล ทำไงจึงห้ามแก้ไข
? ให้นับจำนวนระเบียนในตารางอื่น ๆ ดูบ้าง
? ตัวอย่างนี้มี field เดียวลองเพิ่มเป็น 2 หรือ 3 สิครับ

บทที่ 202 : เพิ่มระเบียนใหม่ต่อท้ายแบบ DAO recordset และแสดงใน msgbox
ปรับปรุงมาจากโปรแกรม 201 เขียนง่ายไม่ซับซ้อน มีการติดต่อแบบ DAO เช่นเดิม แต่มีการตรวจสอบความถูกต้องของข้อมูลมากขึ้น เช่น ป้องกันการพิมพ์ชื่อซ้ำ เพิ่มรหัสระเบียนอัตโนมัติ และสร้างโปรแกรมย่อย loadlast มาใช้งาน เพราะต้องเรียกใช้ 2 จุด เพื่อประโยชน์ในการตรวจสอบ จึงอ่านข้อมูลไปแสดงใน msgbox ให้เห็นผลของการเพิ่มข้อมูล

    ขั้นตอน
    1. click Project, References.. จาก menu bar
    แล้วเพิ่ม Microsoft DAO 3.51 Object Library ด้วยการทำเครื่องหมายถูกใน check box
    2. สร้าง Textbox ชื่อ Text1และ Text2
    3. สร้าง CommandButton ชื่อ Command1 และ Command2
    4. Copy source code ด้านล่าง ไปใส่ในส่วนของ View code window
    5. Run ได้เลยครับ

    Source code ที่ใช้งาน
แบบฝึกหัด
? เปลี่ยนจากตาราง categories เป็นตารางอื่น
? เปลี่ยนการแสดงข้อมูลใน msgbox เป็นใน form ใหม่
? เปลี่ยน หรือเพิ่ม หน้าที่จาก addnew เป็น edit หรือ delete

Download : vbnwind.zip

Program screen



Database screen
บทที่ 203 : เพิ่มระเบียนใหม่ต่อท้ายแบบ Data control + DAO recordset
vbnwind.exe ที่ให้ download จะคลาย zip ลงห้อง c:\program files\vbnwind สามารถเรียก vbnwind.vbp มาทดสอบได้ โดยมี form ทั้งหมด 10 ฟอร์ม แต่ฟอร์มที่น่าสนใจคือ add_cat.frm ส่วนฟอร์มอีก 8 ฟอร์ม ใช้ wizard สร้างขึ้นมาอย่างง่าย ๆ ส่วน main ก็ปรับปรุงให้มีขนาดที่ 800 * 600
    Source code ที่ใช้ใน add_cat.frm
แบบฝึกหัด
? เปลี่ยนจากตาราง categories เป็นตารางอื่น
? เพิ่มฟอร์มปรับปรุงข้อมูล

ตอนที่ 4 :
ใช้ API ของระบบ Windows
ตัวอย่างการดูวิธีประกาศ API เพื่อเรียกใช้ใน VB
ต้องเปิดแฟ้ม WIN32API.TXT สำหรับการเปิดครั้งแรก
Download : chap301.zip
บทที่ 301 : ใช้ GetFreeSpaceA ของ kernel32
เนื่องจากแฟ้ม c:\windows\system\kernel32.dll มีฟังก์ชันต่าง ๆ ที่ถูกเตรียมให้เราเรียกใช้ VB สามารถเรียกฟังก์ชันมาใช้ได้ ตัวอย่างข้างล่างนี้เรียก GetDiskFreeSpaceA มาใช้ (ชื่อฟังก์ชันต้องใหญ่เล็กตามที่กำหนด) ในแต่ละฟังก์ชันมีตัวแปรที่จะนำมาใช้ได้ หากไม่ทราบว่ามีฟังก์ชันอะไร สามารถเรียกโปรแกรม API Text Viewer ของ Microsoft Visual Basic ให้ตรวจสอบแฟ้มต่าง ๆ ว่ามีบริการอะไรบ้าง เมื่อเรียกแฟ้ม File, Load Text File... แล้วเลือกแฟ้ม win32api.txt โปรแกรมจะแสดง Item ให้เลือก เพื่อให้ผู้พัฒนาคัดลอกไปใช้
ตัวอย่างข้างล่างนี้: จะเรียกฟังก์ชันให้ทำงาน เมื่อมีการกดปุ่ม command1 แล้วส่งค่าให้กับ text1 แสดงผลต่อไป
    ตัวอย่าง 1 : ทุกอย่างในฟอร์ม
    Private Declare Function getdiskfreespacea _
    Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal _
      iprootpathname As String, _
      ipsectorspercluster As Long, _
      ipbytespersector As Long, _
      ipnumberoffreeclusters As Long, _
      iptotalnumberofclusters As Long _
    ) As Long

    Private Sub Command1_Click()
    result = getdiskfreespacea("c:\", sectors, bytes, freecluster, totcluster)
    Text1 = Format(sectors * bytes * freecluster, "##,###") & " Bytes"
    Text1 = Text1 & "(" & sectors & "*" & bytes & "*" & freecluster & ")"
    msgbox app.path
    End Sub


    ตัวอย่าง 2 : แยกประกาศในโมดูล และในฟอร์ม
    ' in module1 (if in form will be error)
    Public Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
    End Type
    Public Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)

    ' in form1
    Private Sub Command1_Click()
    Dim x As SYSTEMTIME
    GetSystemTime x
    MsgBox x.wMilliseconds
    End Sub
แบบฝึกหัด
? ให้เปลี่ยนเป็น drive อื่น เพราะปัจจุบันมักมีหลาย Drive กันแล้ว
? ให้เรียก GetSystemInfo จาก kernel32
? แสดง Current Directory ด้วย app.path ใน text box
? ลองเรียกใช้ API ตัวอื่นดูสิครับ

Download : chap302.zip และ tping.exe
บทที่ 302 : ใช้ icmp.dll ช่วย ping เพื่อตรวจสอบ host ในเครือข่าย class C
เนื่องจากแฟ้ม c:\windows\system\icmp.dll มีฟังก์ชันต่าง ๆ ที่ถูกเตรียมให้เราเรียกใช้ VB สามารถเรียกฟังก์ชันมาใช้ได้ ตัวอย่างข้างล่างนี้ เพื่อตรวจสอบเลข IP ในเครือข่าย โปรแกรมมี option เรื่องความเร็วในช่อง speed หาต้องการให้เร็วขึ้นให้เปลี่ยน 1000 เป็น 100 และถ้าไม่เปลี่ยนช่อง IP ending จะ ping เพียงเลขเดียวคือเลขที่กำหนด แต่ถ้าแก้ IP ending จะต้องแก้ให้เลขสูงไว้ เพราะโปรแกรมจะ ping ตั้งแต่เลขที่กำหนดไปถึงเลขที่ระบุ หากพบจะแสดงในหน้าต่างด้านบน เลขที่ไม่พบ จะแสดงในหน้าต่างด้านล่าง แต่การแสดงผลของโปรแกรมยังมีปัญหาอยู่บ้าง แต่มิใช่เรื่องใหญ่จึงไม่ได้ปรับ code อีกครั้ง
    คำสั่งควรทราบ
    List2.Clear
    List3.Clear
    If List1.ListCount > 255 Then j = List1.ListCount - 255 Else j = 1
    For i = List1.ListCount To j Step -1
      List1.ListIndex = i - 1
      If (Mid(List1, 1, 1) = "[") Then 
        List2.AddItem List1 
      Else 
        List3.AddItem List1
      End if
    Next
    .
    .
    If Command1.Caption = "START &PING" Then
      checkip
      Timer1.Interval = Text6
      Command1.Caption = "STOP &PING"
    Else
      Command1.Caption = "START &PING"
      Timer1.Interval = 0
    End If
    
แบบฝึกหัด
? ถ้านำไปใช้จะพบปัญหา ให้แก้ปัญหาเรื่องการแสดงผล
? ให้ปรับโปรแกรมกำหนด IP ยืดหยุ่นมากขึ้น ถ้าใช้ในองค์การใหญ่
? ท่านเข้าใจตัวอย่าง code ข้างล่างนี้ว่าอย่างไร
 Dim buff As String
 Open "c:\test.txt" For Input As #1
 filestr = ""
   Do Until EOF(1)
     Line Input #1, TempStr
     filestr = filestr & TempStr & Chr$(13) & Chr$(10)
   Loop
 Close #1
 Text1.Text = filestr
 ' Open App.Path & "\output.txt" For Output As #2
 ' Print #2, s_Student, s_Grade
 

บทที่ 303 : ฟอร์มโปร่งแสง และเชื่อมต่อกับ server ผ่าน Hidden IE
โปรแกรมนี้ได้มาจาก http://juicystudio.com เพียงนำ code นี้ไปใส่ form ก็ทำให้เป็น transparent form พอสร้างปุ่มสักปุ่มหนึ่ง แล้วใส่คำว่า unload me ในปุ่ม ก็จะเห็นปุ่มลอยอยู่กลางจอเฉย ๆ (ปุ่มชื่อ cmdExit) เพราะไม่มี background มาเป็นข้อจำกัดไงครับ เป็นการใช้ api ที่ windows เตรียมไว้ให้ใช้
ต่อมาก็นำโปรแกรมนี้มาเพิ่มส่วนของ Microsoft Internet Control เพื่อสั่งเปิดเว็บ และส่งค่าผ่าน URL เป็นหมายเลข Address ของเครื่อง Server แล้วก็เก็บข้อมูลการเปิดเครื่องในเครือข่ายเพื่อนำไปวิเคราะห์ และพัฒนาบริการให้ดีขึ้น ในส่วนของ form_load คือส่วนที่เพิ่มจากการซ่อนฟอร์มครับ
    Source code ที่ใช้งาน
    ตัวอย่าง open.php
    <?
    $f = fopen("log.txt","a");
    fputs($f, $_GET["q"].",".$_GET["n"]."\n");
    fclose($f);
    ?>
    ตัวอย่าง list.php
    <?
    $ar = file("log.txt");
    foreach ($ar as $v) echo $v."<br>"; 
    ?>
    
แบบฝึกหัด
? ทำแบบที่ผมทำ อย่าแปลกใจ เพราะโปรแกรมนี้แทบไม่เห็นผล
? สร้างปุ่ม close form มา 1 ปุ่ม
? ทำ ball วิ่งเต็มจอ นำมาจากบทที่ 16 ได้เลย
? แก้ไขให้ open.php และ list.php ทำงานร่วมกับ .MDB หรือ MySQL


แนะนำเว็บใหม่ : ผลการจัดอันดับ
รักลำปาง : thcity.com : korattown.com : topsiam.com : มหาวิทยาลัยโยนก
ศูนย์สอบ : รวมบทความ : ไอทีในชีวิตประจำวัน : ดาวน์โหลด : yourname@thaiall.com
ติดต่อ ทีมงาน ชาวลำปาง มีฝันเพื่อการศึกษา Tel.08-1992-7223