Introduction to Windows Form

    ทีแรกผมตั้งใจจะไม่เขียนเรื่อง Windows Form เพราะคิดว่ามันเป็นเรื่องง่ายๆ ใช้ Visual Studio.NET ตัดแปะนิดเดียวก็เป็นโปรแกรมแล้ว แต่ี้ผมเปลี่ยนใจครับ เพราะ Windows Form นั้นถ้าเรามองให้ลึกกว่าการตัดแปะ มันมีเนื้อหาที่น่าสนใจมากครับ โดยเฉพาะอย่างยิ่งเกี่ยวกับ OOP อยู่ไม่น้อย แต่ผมก็ไม่ได้รีบจะเขียนจนกระทั่งวันนี้ ที่เป็นอย่างนั้นเพราะว่า ใน Beta 1 นั้นดูเหมือน Windows Form นั้นยังไม่ค่อยลงตัว น่าจะมีปรับปรุงอีกมาก ผมรอจนกระทั่ง Beta 2 ออก วันนี้มันดูดีขึ้นมากครับ เลยได้ฤกษ์ที่จะเขียนซักที

    Windows Form นั้นก็คือพื้นที่สี่เหลี่ยมที่ภายในบรรจุไปด้วย Controls ต่างๆ นั้นเอง ถ้าคุณเคยใช้ Visual Basic, Delphi หรือภาษาอื่นๆ ที่ใช้แนวคิดที่ชื่อว่า Visual หรือ RAD คุณต้องคุ้นเคยกับ Windows Form ครับ ต่างกันแค่ตรงที่ Windows Form นั้นออกแบบมาใช้กับ .NET Framework เท่านั้นเองครับ และเนื่องจากมันเป็นของรุ่นใหม่มันจึงมีความสามารถเพิ่มขึ้นกว่าเดิมมาก ยิ่งไปกว่านั้นมันยังมีความสัมพันธ์กับ Web Form ซึ่งเป็น Form บน Web อย่างใกล้ชิด การเขียนโปรแกรมจะอยู่ในลักษณะเดียวกัน แต่ Web Form บน ASP.NET ยังเก่งสู้ Windows Form ไม่ได้ แต่ไม่แน่นะครับ ซักวันหนึ่งอาจจะสูสีจนสามารถรวบเป็นตัวเดียวกันได้

 

แนวคิดของ Compiler

    เราอาจจะแบ่ง Compiler แบบ RAD หรือ Visual ออกเป็นได้ 2 ประเภท คือประเภทแรกเป็นแบบ Command Line Compiler และอีกแบบหนึ่งคือ Integrated Compiler แบบแรกเป็นแบบที่เราต้องไปคอมไพล์ ที่ OS Prompt ยกตัวอย่างเช่น ภาษา JAVA เป็นต้น และภาษาบน .NET เช่น C# VB.NET ก็เข้าข่ายนี้ และแบบ Integrated Compiler นั้น ตัว Compiler และตัว IDE นั้นเป็นหนึ่งเดียวกันเช่น Visual Basic 6 และ Delphi เป็นต้น

    ที่ผมแบ่งแบบนี้เพื่อจะให้เข้าใจเหตุและผลของการออกแบบครับ ถ้า Compiler เป็นแบบ Command Line Compiler แล้วภาษาที่อยู่ในกลุ่มนี้จะทำ Code และ Form อยู่ในแฟ้มเดียวกันครับ เพราะฉะนั้นการที่เราแก้ไขตำแหน่งของ Control ต่างๆ เช่นปุ่มที่อยู่ใน Form นั้น จะส่งผลให้มีการแก้ไข Code ที่สั่งให้กำหนดตำแหน่ง เช่น

button1.Location = new Point(100, 100);

    เมื่อเราเลื่อนตำแหน่งของปุ่มเป็นที่อื่น มันจะมีผลทำให้ตัวเลขพิกัด 100, 100 เปลี่ยนไป แต่ถ้าภาษานั้นเป็นแบบ Integrated Compiler นั้น ตัวเลขตำแหน่งนั้นจะไม่ได้เป็นส่วนหนึ่งของ Code ถ้าเราดูใน Code เราจะไม่เห็นว่ามีการระบุตำแหน่งครับ

    เรื่องนี้บอกอะไรเราได้บ้าง มีประเด็นหนึ่งน่าสนใจคือ ภาษาที่ใช้แนวคิดของ Command Line Compiler นั้นไม่จำเป็นต้องผูกตัวเองติดกับ IDE เช่นภาษา JAVA นั้นเราสามารถมี IDE ได้หลายตัว เช่น Forte หรือ JBuilder แต่ละตัวมีความสามารถไม่เป็นรอง Visual Studio ของ Microsoft เท่าไรนัน IDE เหล่านั้นล้วนแล้วแต่มี Editor Debugger และ โปรแกรมที่ใช้วาด Form ด้วยกันทั้งสิ้น ผิดกับ Visual Basic และ Delphi เราไม่สามารถหา IDE ตัวอื่นมาทดแทนได้

    เรื่องนี้กำลังเป็นประเด็นครับ มีข่าวลือมาว่า Microsoft จะแจก .NET Framework ให้ใช้ฟรี แต่จะเก็บเงินสำหรับ Visual Studio .NET แพงขึ้น ถ้าเป็นอย่างนั้นจริงๆ ผมว่างานนี้ Microsoft มีสิทธิ์ขายไม่ออกครับ เพราะ IDE ในท้องตลาดวันนี้เก่งขึ้นเยอะครับ SharpDevelop สามารถซ่อนฟังก์ชันได้เหมือนกับ VS.NET และ Antechinus รุ่นใหม่ก็สามารถทำ IntelliSense ได้แล้ว แต่ตอนนี้ยังไม่มีใครทำโปรแกรมตัววาด Form ออกมาครับ โปรแกรมที่ใช้วาด Form นั้น นอกจาก Visual Studio.NET แล้ว ยังมี WinDES.exe ซึ่งให้มาด้วยกับ .NET Framework Beta 1 ซึ่งจริงๆ แล้ว WinDES.exe คือผลลัพธ์จากการตัด Visual Studio.NET ออกมาเฉพาะส่วนการวาด Form นั่นเอง แต่มาใน ฺBeta 2 ทาง Microsoft รู้ตัวแล้วครับว่าตัวเองทำผิดพลาด เพราะถ้า WinDes.exe ของฟรีเก่งขึ้นเท่าไหร่ ก็คงไม่มีใครซื้อ VS.NET ครับ เลยถอดเอา WinDES.exe เพื่อเป็นการบังคับให้ทุกคนใช้ VS.NET ลองดูกลยุทธ์ของ Microsoft ต่อไปครับ

    ที่พูดมาทั้งหมดนี้อาจพูดกลับไปได้ว่า Windows Form นั้นมีอยู่ใน .NET Framework คุณไม่จำเป็นต้องมี VS.NET หรือ โปรแกรมวาด Form ใดๆ คุณสามารถใช้ Windows Form โดยเขียนโปรแกรมจาก NotePad ได้เลยครับ

ต้นแบบของ Windows Form

    Windows Form นั้นไม่ใด้เกิดได้ในวันเดียวนะครับ มันเป็นผลผลิตที่พัฒนามายาวไกล ผมขอเล่าประวัติซักเล็กน้อย ที่มาของ Windows Form นั้นมาจากสายพันธุ์ของสองบริษัทครับ คือ ฺBorland และ ของ Microsoft ซึ่งมีอายุนานพอๆ กัน เริ่มต้นจากของทาง Microsoft ก่อนครับคือเมื่อปี 1991 Form กำเนิดมากับ Visual Basic 1.0 และมีการพัฒนายาวนานมาจนถึง Visual Basic 6.0 ส่วนทาง Borland นั้นเริ่มต้นที่ Delphi ครับในปี 1993 ก็เจ้าเก่าครับคนออกแบบ Form ของ Borland ก็คือ Anders Hejlsberg ซึ่งต่อมา Hejlsberg ถูก Microsoft ซื้อตัวไปทำ Visual J++ แต่เนื่องจาก Form ของ JAVA นั้นความสามารถค่อนข้างต่ำ Hejlsberg จึงออกแบบ Form ตัวใหม่สำหรับ Visual J++ โดยเฉพาะ ตั้งชื่อว่า WFC (Windows Foundation Class) ซึ่งเป็นการนำเอา Form ของ Delphi มาปรับปรุงนั้นเอง Visual J++ ทำให้ Visual J++ เป็น RAD เต็มตัว ถ้าใครเคยใช้ Visual J++ กับ Delphi คงจะมีความรู้สึกว่า Form นั้นมีกลิ่นอายเดียวกันครับ Visual J++ จึงเป็นผลงานที่เยี่ยมยอดมาก เยี่ยมยอดจน Sun ต้องฟ้อง Microsoft เลยทีเดียว พอมาถึง .NET Framework  Hejlsberg ก็ได้รับมอบหมายร่วมกับทีมของ Visual Basic เพื่อรวมเอา Form ของ Visual Basic และ WFC ของ Visual J++ มาเป็นตัวเดียวกันภายใต้ชื่อใหม่ว่า Windows Form และทุกภาษาที่อยู่บน .NET Framework นั้นสามารถใช้ Windows Form ได้ครับ

โปรแกรมแรก

    Windows Form นั้นอยู่ใน Name Space System.Windows.Forms เรามาลองสร้างโปรแกรมตัวแรกกันครับ

first.cs

using System;
using System.Windows.Forms;

class First
{
   public static void Main()
   {
      Form form1 = new Form();
      form1.Text = "Hello, World";
      form1.Show();
   }
}

เวลาเราคอมไพล์โปรแกรมนี้ เราสามารถคอมไพล์ได้เหมือนโปรแกรมปกติครับ ไม่จำเป็นต้อง Reference อะไรกับ Library ทั้งสิ้น อันนี้เฉพาะ Beta 2 นะครับ ถ้าเป็น Beta 1 นั้นต้อง Reference หลายตัวเลย ผมขอแนะนำให้เปลี่ยนมาใช้ Beta 2 ครับ เมื่อ Run Program แล้วจะได้ผลลัพธ์ดังนี้ครับ

 แต่โปรแกรมนี้แสดง Form นี้ให้เราดูแป๊บเดียวครับ Form มันจะปิดตัวเอง ก็เพราะว่าหลังจากที่ Show แล้วไม่ Code อื่นมันจึงหมดโปรแกรมเลยหยุดครับ เรามีวิธีครับที่จะให้ Form นั้นรันค้างอยู่ โดยการเรียกใช้ Object ที่ชื่อว่า Application ครับ ภายในมี Method อยู่ 2 ตัวคือ Run() และ Exit() เราลองมาปรับโปรแกรมกันดูครับ

second.cs

using System;
using System.Windows.Forms;

class Second
{
   public static void Main()
   {
      Form form1 = new Form();
      form1.Text = "Hello, World";
      Application.Run(form1);
   }
}

โปรแกรมนี้จะทำการรันค้างเอาไว้ครับ จนกว่าจะมี Code บรรทัดไหนเรียก Application.Exit() หรือมีใครไปกดปุ่ม x ที่อยู่หัวมุมขวาบนครับ ซึ่งวิธีนี้จะเหมือนพวกโปรแกรม Visual หรือ RAD ทั่วไปแล้วครับ