วันพฤหัสบดีที่ 6 พฤศจิกายน พ.ศ. 2557

การเรียกใช้เมธอด

    การเรียกใช้เมธอดให้ระบุชื่อเมธอด พร้อมกำหนดค่าที่จะส่งให้แก่พารามิเตอร์ (ถ้าเมธอดนั้นมีพารามิเตอร์) ณ ตำแหน่งที่ต้องการใช้เมธอดนั้น เช่น เมื่อเกิดการคลิกที่ button1 แล้วเราต้องการให้เรียก เมธอด Calculate() หรือไม่ ShowMessage() ตามเงื่อนไข(สมมุติว่าได้สร้างเมธอดเหล่านี้เอาไว้) ก็กำหนดโค้ดดังนี้

 

  เมธอดที่เราได้สร้างไว้แล้วเมื่อเรียกใช้งานจะมีชื่อปรากฏใน IntelliSense ให้เราเลือกเช่นเดียวกับสมาชิกที่เป็นของ .NET เอง ในลักษณะดังนี้


   ในการเรียกใช้เมธอดข้อมูลที่จะส่งไปให้แก่เมธอด เราจะเรียกว่า Actual Parameter หรือเรียกอีกอย่างว่า อาร์กิวเมนต์ (Argument)แต่รูปแบบการรับข้อมูลที่กำหนดไว้ที่เมธอด เราเรียกว่า Formal Parameter หรือเรียกสั้นๆ ว่า พารามิเตอร์ (parameter) ดังรูปต่อไปนี้


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

ตัวอย่างที่ 4.1

    เป็นการทดสอบการสร้างและเรียกใช้งานเมธอดซึ่งหลักการโดยสังเขปมีดังนี้

สร้างเมธอด CheckInput() สำหรับตรวจสอบว่าข้อมูลที่พิมพ์ลงใน TextBox นั้นเป็นตัวเลขหรือไม่

สร้างเมธอด EnabledButton() สำหรับกาหนดสถานะของปุ่มว่าให้สามารถใช้งานได้หรือไม่

    เมื่อมีการเปลี่ยนแปลงข้อมูลที่ TextBox แต่ละอันซึ่งจะเกิดอีเวนต์ TextChaged โดยเราต้องใช้
อีเวนต์นี้ไปเรียกเมธอด CheckInput() เพื่อตรวจสอบว่าข้อมูลที่ใส่นั้นถูกต้องหรือไม่

   หลังการตรวจสอบข้อมูลใน TextBox เราก็จะเรียกเมธอด EnabledButton() มาทางานต่ออีกทีเพื่อกำหนดสถานะของ Buttonให้สัมพันธ์กับข้อมูลที่ใส่


สำหรับรายละเอียดปลีกย่อยอื่นๆ ก็ให้ดูเพิ่มเติมจากขั้นตอนต่อไปนี้

1. ออกแบบและกาหนดพร็อปเพอร์ตี้ดังรูปที่แล้ว

2. เข้าไปในมุมมองโค้ด แล้วสร้างเมธอดขึ้นมาดังนี้



 3. เมื่อเปิดฟอร์มขึ้นมาเราจะตรวจสอบสถานะของปุ่ม ด้วยการเรียกเมธอด EnabledButton() ขึ้นมา
     ทำงาน โดยดับเบิลคลิกที่ฟอร์มแล้วกำหนดโค้ดเพิ่มลงไปดังนี้


4. เมื่อเกิดการเปลี่ยนแปลงใน TextBox ให้ไปเรียกเมธอด CheckInput() ขึ้นมาทำงานพร้อมส่งชื่ออ้าง
    อิงของ TextBox ที่ต้องการตรวจสอบไปด้วยโดยดับเบิลคลิกที่ TextBox แต่ละอันแล้วกำหนดโค้ด
    ลงไปดังนี้


5. เมื่อรันโปรแกรม ถ้าเราใส่ข้อมูลใน TextBox อันใดไม่ใช่ตัวเลขจะมีคำเตือน และปุ่มก็จะไม่สามารถ
    ใช้งานได้ดังรูป แล้วให้ทดสอบดูว่า หากใส่ข้อมูลถูกต้องจะมีคำเตือนและปุ่มสามารถใช้งานได้ดังรูป
    แล้วให้ทดสอบว่าหากใส่ข้อมูลถูกต้อง จะมีคำเตือนและปุ่มสามารถใช้งานได้หรือไม่



วันพฤหัสบดีที่ 11 กันยายน พ.ศ. 2557

การกำหนดพารามิเตอร์เบื้องต้น

      พารามิเตอร์ (Parameter) คือ ข้อมูลที่รับเข้ามาจากภายนอกเพื่อใช้งานในเมธอด ซึ่งพารามิเตอร์นี้จะช่วยให้เมธอดสามารถเปลี่ยนแปลงการทำงานไปตามข้อมูลที่รับเข้า และให้ผลลัพธ์ที่แตกต่างกันออกไป ดังนั้นพารามิเตอร์จึงช่วยให้เมธอดมีความยืดหยุ่นในการทางานมากขึ้น โดยหลักการที่สำคัญเกี่ยวกับพารามิเตอร์มีดังนี้

     เนื่องจากพารามิเตอร์ก็คือตัวแปรอีกลักษณะหนึ่ง ดังนั้น การกำหนดชื่อพารามิเตอร์ก็ใช้หลักการเดียวกันกับการกำหนดตัวแปร พร้อมระบุชนิดข้อมูลให้กับพารามิเตอร์นั้นด้วย เช่น
ถ้าพารามิเตอร์มากกว่า 1 ตัว ก็ให้คั่นแต่ล่ะตัวด้วยเครื่องหมาย , เช่น

      กรณีที่พารามิเตอร์มากกว่า 1 ตัว ที่ข้อมูลเป็นชนิดเดียวกัน เราไม่สามารถนำมาเขียนกันไว้ในข้อมูลชนิดเดียวกันได้เหมือนการประกาศตัวแปร ต้องแยกเขียนทีละตัว เช่น เช่นกรณีต่อไปนี้ ผิด
 ข้อมูลที่รับผ่านพารามิเตอร์เข้ามาในเมธอด ไม่จำเป็นต้องเป็นชนิดข้อมูลพื้นฐาน (เช่น ตัวเลข,สตริง
,บูลีน) แต่สามารถเป็นชนิดของออบเจ็กต์คอลโทรลใดๆ ก็ได้ เช่น กรณีต่อไปนี้รับพารามิเตอร์เป็นออบเจ็กต์ Button และ Text Box

     พารามิเตอร์ที่เรากำหนดก็จะถือว่าเป็นตัวแปรของเมธอด ดังนั้น เราจึงสามารถมาใช้งานภายใน
เมธอดได้เลย เช่น

     นอกจากนี้ยังมีเทคนิคการกำหนดพารามิเตอร์อีกหลายแบบ เช่น พารามิเตอร์แบบ Out, แบบอาร์เรย์ แบบ Reference และอื่นๆ ซึ่งจะกล่าวถึงในลาดับต่อไป

การสร้างเมธอดที่ไม่มีการส่งค่ากลับ

     เมธอด (Method) เป็นการสร้างชุดคำสั่งที่ใช้ในการทำงานอย่างใดอย่างหนึ่ง ส่วนมากมักเป็นส่วนที่ต้องทำซ้าบ่อยๆภายในโปรแกรมนั้นโดยหากเราแยกสิ่งทีต้องทำซ้าๆ ดังกล่าวออกมาเป็นชุดคำสั่งย่อยๆ ต่างหาก เพื่อให้สามารถเรียกใช้งานเฉาะส่วนนี้ได้ทันทีเมื่อต้องการ ดังนั้น เมธอดจึงช่วยให้เราไม่ต้องเขียนโปรแกรมที่ต้องทำสิ่งเดียวกันซ้าบ่อยๆ ทำให้ประหยัดเวลา และลดขนาดของโค้ดลงไปได้ ซึ่งก็จะส่งผลให้โปรแกรมทำงานได้เร็วขึ้นด้วย

     เมธอดแบ่งออกเป็น 2 ลักษณะ คือ “เมธอดที่ไม่มีการส่งค่ากลับ” (non-return value method) และ “เมธอดที่มีการส่งค่ากลับออกไป” (return value method) โดยรูปแบบพื้นฐานในการเขียนเมธอดแบบไม่ส่งค่ากลับคือ

      โมดิฟายเออร์ (Modifier) เป็นระดับการควบคุมการเรียกใช้เมธอดจากภายใน เช่น จากคลาสอื่นๆ ทั้งนี้รายละเอียดต่างๆ เกี่ยวกับโมดิฟายเออร์ เราจะได้ศึกษาอีกครั้งในบทที่ 11 สำหรับการสร้างเมธอดเพื่อใช้งานทั่วๆไป ในเบื้องต้นนี้ให้กำหนดโมดิฟายเออร์เป็น Private ไปก่อน

      ชื่อเมธอด มีหลักการคล้ายกับการตั้งชื่อตัวแปรสาหรับใน VC# นิยมเขียนชื่อเมธอดให้ขึ้นด้วยตัวพิมพ์ใหญ่ แล้วถัดไปเป็นตัวพิมพ์เล็ก ถ้าเป็นการนำหลายๆคามาร่วมกันก็ให้เขียนติดกัน และควรเขียนขึ้นต้นแต่ล่ะคำด้วยตัวพิมพ์ใหญ่
เช่น ShowError, GetData , Setvalue, PrintEmployeeInfo, IsCompleteData เป็นต้น

      พารามิเตอร์ คือ การรับข้อมูลจากภายนอกเข้ามา เช่น เมธอดหาพื้นที่วงกลมก็อาจรับค่ารัศมีจากภายนอกเข้ามา เป็นต้น แต่ทั้งนี้พารามิเตอร์อาจจะไม่มีก็ได้ขึ้นอยู่กับความจำเป็นว่า เราต้องใช้ข้อมูลจากภายนอกหรือไม่ ตัวอย่างสร้างเขียนเมธอดแบบไม่มีพารามิเตอร์ เช่น



      สำหรับตำแหน่งการเขียนเมธอดนั้นสามารถวางไว้ก่อนหรือหลังส่วนที่เรียกใช้เมธอดก็ได้ แต่โดยทั่วไปนิยมวางไว้ก่อนส่วนทีเรียกใช้งาน เพื่อค้นหาได้ง่าย

วันพุธที่ 3 กันยายน พ.ศ. 2557

การแปลงข้อมูลชนิดตัวเลข

  เนื่องจาก VC# นั้นเป็นเป็นภาษาที่เข้มงวดใน เรื่องของชนิดข้อมูลเป็นอย่างมากซึ่งปัญหาพื้นฐานอย่างหนึ่งที่ผู้เริ่มเขียน โปรแกรมมักจะพบอยู่เสมอก็คือ

การแปลงข้อมูล

    โดยเฉพาะอย่างยิ่งข้อมูลชนิดตัวเลข ซึ่งจากการที่เราต้องกาหนดชนิดตัวแปรและ ข้อมูลให้สอดคล้อง บางครั้งก็เกิดปัญหา เนื่องจากเราอาจ ไม่ทราบล่วงหน้าว่า ข้อมูลที่จะได้มานั้นเป็นจำนวนจริงหรือ ทศนิยม ด้วยเหตุนี้จึงมีวิธีการเปลี่ยนข้อมูลจากชนิดหนึ่ง เป็นอีกชนิดหนึ่ง (TYPE CONVERSION)

การใช้คำสั่ง Convert.ToXxx

     คำสั่ง Convert.ToXxx() ก็อย่างเช่น Convert.ToInt32(), Convert.ToDouble() เป็นต้น แต่จะแปลงจาก String Number เป็นตัวเลข นอกจากนี้แล้วคลาสต์ Convert ยังมีคาสั่ง (เมธอด) ในการแปลงข้อมูลอีกหลายแบบ

คำสั่งที่ใช้บ่อย


   ข้อมูลที่นำมาแปลงนั้น หากเรานาตัวเลขทศนิยมมาแปลงเป็นจำนวนเต็ม อาจทาให้ส่วนที่เป็นทศนิยมหายไป ดังนั้น เราควรเลือกใช้เฉพาะกรณีที่ต้องการแค่จำนวนเต็มเท่านั้น เช่น
   แต่สิ่งที่ต้องระวังคือ หากเรากำหนดตัวเลขในแบบสตริง จะไม่สามารถแปลงเลขทศนิยมเป็นจำนวนเต็มได้ เช่น กรณีต่อไปนี้จะเกิดข้อผิดพลาด

การคลาสต์ (Cast)

    การคลาสต์เป็นการเปลี่ยนชนิดข้อมูลจากชนิดหนึ่งไปเป็นอีกชนิดหนึ่ง ซึ่งไม่จำเป็นว่าต้องเป็นชนิดตัวเลขเท่านั้น สามารถใช้กับการแปลงชนิด ออบเจ็กต์ต่างๆ ได้ทั้งหมด แต่นั้นที่นี้จะกล่าวถึงเฉพาะในตัวเลขก่อน คลาสต์ที่ใช้กับตัวเลขอาจใช้เพื่อแปลงจากจำนวนที่มีทศนิยมเป็นจานวนเต็ม โดยผลลัพธ์ที่ได้จะคล้ายกับการใช้ Convert.ToXxx() นั่นเอง สาหรับวิธีการคือ วางชนิดข้อมูลที่ต้องการไว้หน้าจำนวนที่จะแปลง เช่น

การแปลงข้อมูลก่อนการคำนวณ

   การคำนวณใน VC# นั้นผลลัพธ์ที่ได้จะเป็นข้อมูลชนิดใดนั้น ขึ้นกับชนิดข้อมูลของแต่ล่ะจำนวน โดยผลกระทบตรงนี้นับว่าสำคัญมาก และเป็นปัญหาอย่างหนึ่งที่ผู้เริ่มเขียนโปรแกรมมักจะไม่ทราบสาเหตุของปัญหา เช่น ลองดูโค้ดต่อไปนี้ ซึ่งจะเกิดข้อผิดพลาด ทั้งที่ผลลัพธ์ได้เป็น 3 ซึ่งเป็น จำนวนเต็ม
    สำหรับข้อผิดพลาดที่เกิดขึ้นจะเกี่ยวกับการแปลงชนิดข้อมูล ซึ่งผู้เขียนก็จะอธิบายเป็นหลักการแบบง่ายๆ ดังนี้ คือ
- ถ้าเป็นการคานวณระหว่าง จานวนจริง
- (มีทศนิยม) ไม่ว่าจะกับจำนวนเต็มหรือจำนวนจริง ด้วยกันผลลัพธ์ที่ได้จะถูกแปลงเป็น จำนวนจริง โดย
   อัตโนมัติ แม้ว่าผลลัพธ์นั้นจะเป็นจำนวนเต็มก็ตาม และถ้าหากเรากำหนดตัวแปรที่เก็บผลลัพธ์เป็น 
   ประเภท Integer ก็จะเกิดข้อผิดพลาดขึ้น ซึ่งวิธีแก้ปัญหาก็คือ ให้กำหนดตัวแปรที่เก็บผลลัพธ์เป็น
   ประเภท Real เช่น

    ถ้าเป็นการคำนวณระหว่าง จำนวนเต็มกับจำนวนเต็ม ผลลัพธ์ที่ได้จะถูกแปลงเป็น จำนวนเต็ม
โดยอัตโนมัติ แม้ว่าผลลัพธ์ที่จะมีทศนิยมด้วย หรือจะกำหนดตัวแปรที่เก็บผลลัพธ์เป็นประเภท Real
ก็ตาม โดยส่วนมากมักเกิดขึ้นกับการหาร เช่น
ลักษณะดังกล่าวนี้ หากเรานำ ข้อมูลผลลัพธ์ที่ได้ไปใช้งานต่อไป ก็อาจก่อให้เกิดข้อผิดพลาด หรือผิดเพี้ยน
     สำหรับวิธีแก้ปัญหา เราให้กำหนดตัวแปรเก็บผลลัพธ์เป็นประเภท Real (เช่น double) แล้ว
ใช้การคลาสต์จำนวนไดจำนวนหนึ่ง หรือทั้งสองจำนวนให้เป็นข้อมูลประเภท Real หรือไม่ก็อาจใช้ Convert.ToDouble() ก็ได้ เช่น

วันเสาร์ที่ 23 สิงหาคม พ.ศ. 2557

บล็อกและขอบเขตของตัวแปรและเทคนิคการป้องกันข้อผิดพลาดในการรับข้อมูลตัวเลข

บล็อกและขอบเขตของตัวแปร

    การประกาศตัวแปรใน vc# นั้นไม่จำเป็นต้องประกาศตัวแปรทุกๆ ตัวที่ต้องใช้ไว้ล่วงหน้าเสมอไป แต่สามารถประกาศไว้ ณ จุดที่ต้องการใช้งานก็ได้ เพราะบางครั้งการที่เราต้องใช้ตัวแปรหรือไม่ อาจขึ้นกับเงื่อนไข เช่น ลักษณะต่อไปนี้ตัวแปร z จะถูกสร้างเฉพาะเมื่อเงื่อนไข y !=0 เป็นจริง


     หากเราประกาศตัวแปรไว้ในลูป หรือภายในเงื่อนไขดังโค้ดที่กล่าวมานี้ สิ่งที่ต้องพิจารณาในลาดับถัดไปคือ หากเรานำตัวแปรไปใช้นอกเงื่อนไขหรือนอกลูป ก็จะเกิดข้อผิดพลาดขึ้น เช่น


    ในโค้ดนี้เกิดข้อผิดพลาด เพราตัวแปร z ประการไว้ในบล็อกของ if ซึ่งเมื่อสิ้นสุดบล็อกนี้ แล้วตัวแปรดังกล่าวจะถูกยกเลิกไป ดั้งนั้น เมื่อเราอ้างถึงที่นอกบล็อก จึงเกิดข้อผิดพลาดดังกล่าว

เทคนิคการป้องกันข้อผิดพลาดในการรับข้อมูลตัวเลข

         บางครั้งข้อมูลที่เราจะนำไปใช้นั้น อาจไม่สามารถกำหนดค่าที่แน่นอนไว้ล่วงหน้าได้ เช่น อาจรับผ่าน TxetBox เป็นต้น ซึ่งข้อมูลที่รับมานั้นอาจไม่ถูกต้องตามรูปแบบก็ได้ เช่น หากเราต้องการข้อมูลที่เป็นตัวเลข แต่ ผู้ใช้อาจใส่เป็นอักขระ หรือไม่ก็ใส่ข้อมูลใดๆ เลยก็ได้ ซึ่งอาจส่งผลไปถึงขั้นตอนที่เราจะนำข้อมูลนี้ไปต่อไป ที่อาจทาให้เกิดข้อผิดพลาดขึ้นได้ ดังลักษณะในรูปต่อไปนี้


    ทั้งนี้เพื่อเป็นการป้องกันข้อผิดพลาดดังกล่าวนี้ เราต้องมีการตรวจสอบข้อมูลก่อนการใช้งานเสมอ โดยเฉพาะอย่างยิ่งข้อมูลชนิดตัวเลข ซึ่งนาไปคำนวณ โดยเทคนิคการตรวจสอบตัวเลขที่เราควรรู้ในเบื้องต้นพอสรุปได้ดั้งนี้

การใช้คำสั่ง TryParse()

      คำสั่ง (เมธอด) TryParse() ใช้ในการแปลงข้อมูลไปเป็นข้อมูลชนิดตัวเลขพร้อมกันนี้จะตรวจสอบไปด้วยว่า ข้อมูลนั้นสามารถแปลงเป็นตัวเลขได้หรือไม่ ดังนั้น คำสั่งนี้สามารถป้องกันการผิดพลาดจากการแปลงข้อมูลได้ ซึ่งรูปแบบของคำสั่งนี้ คือ


       ชนิดข้อมูล คือ ชนิดข้อมูลที่จะใช้ในการแปลง ทั้งนี้เราต้องดูว่าจะแปลงไปเป็นข้อมูลชนิดใด เช่น หากเป็น 123 ก็อาจเลือกชนิด int หรือหากเป็น 4.56 ก็อาจใช้ชนิด double เป็นต้น

       out ตัวแปรเก็บผลลัพธ์ คำสั่งนี้จะแปลงค่าผลลัพธ์ที่แปลงเสร็จแล้วกลับออกมาด้วย ดังนั้น จึงต้องมีตัวแปรในการเก็บผลลัพธ์นี้ ซึ่งต้องสร้างตัวแปรนี้เอาไว้ล่วงหน้าก่อน โดยต้องเขียนคีย์เวิร์ด out กำกับไว้หน้าตัวแปรเสมอ

     หากสามารถแปลงเป็นชนิดตัวเลขนั้นได้ เมธอดนี้จะคืนค่า ture พร้อมส่งตัวเลขที่ผลลัพธ์ไปเก็บไว้ที่ตัวแปลที่กำหนด แต่หากไม่สาเร็จจะคืนค่า false ดังนั้น คำสั่ง TryParse() เราควรใช้คู่กับการตรวจสอบไปด้วย if จะเหมาะสมที่สุด เช่น หากต้องตรวจสอบว่าแปลงข้อมูลใน textBox1 ไปเป็นชนิดตัวเลข double ได้หรือไม่ ก็กำหนดโค้ดตามลักษณะดังนี้



    หรือการนำเอาไปใช้ในอีกลักษณะอื่นๆ ที่น่าสนใจ เช่น เราเอาตรวจสอบว่า ถ้าไม่ใช้ข้อมูลตัวเลขโดยใช้ โอเปอเรเตอร์ ! ก็หยุดการทำงานในส่วนมี่เหลือด้วยคาสั่ง return เช่น




การตรวจสอบเงื่อนไขของข้อมูล

    ใน vc# หากเรานำข้อมูลที่ไม่ใช่ชนิดเดี๋ยวกันไปเปรียบเทียบกัน ก็จะเกิดข้อผิดพลาด เช่นเดี๋ยวกันดังเช่นกรณีต่อไปนี้

     เนื่องจากข้อมูลที่อ่านได้จากพร็อปเพอร์ตี้ Text นั้นจะเป็นชนิดสตริงไม่ใช่ตัวเลข จึงเป็นการเปรียบเทียบข้อมูลของคนละประเภท เช่น “abe” > 0 ซึ่งเป็นแนวทางการแก้ปัญหาก็ต้องตรวจสอบและแปลงด้วย TryParse() ก่อนแล้วค่อยนำไปเปรียบเทียบ เช่น


ตัวอย่างที่ 3.8    เป็นการคำนวณหาจานวนเงินท่าต้องจ่ายราคา และจำนวนสินค้าที่เรากำหนด ซึ่งเป็นการตัวอย่างจากบทที่แล้วมาแก้ไขใหม่ โดยก่อนที่จะคำนวณต้องมีการตรวจสอบก่อนว่า ข้อมูลที่ผู้ใช้ใส่เข้ามานั้นเป็นตัวเลขจริงหรือไม่เพื่อป้องกันข้อผิดพลาด โดยราคาสินค้าสามารถเป็นตัวเลขทศนิยมได้ ส่วนจำนวนที่ซื้อต้องเป็นจำนวนเต็ม

1. จัดวางคอนโทรล พร้อมกำหนดชื่อที่จำเป็นดังรูป


2. ดับเบิลคลิกที่ปุ่ม คำนวณ แล้วกำหนดโค้ดดังนี้


3.รันโปรแกรม แล้วลองใส่ข้อมูลที่ไม่ใช่ตังเลขดูว่า การตรวจสอบถูกต้องหรือไม่