[TIPS] เปิดปิดฟอร์มแบบ "มีแนว"

Posted 25/04/2008 00:37
by coreadmin
คะแนนนิยม

แทนที่จะเขียนอะไรยาวๆ กัน (ติดไว้อยู่หลายอย่างเลยเนี่ย) ผมมาเขียนอะไรสั้นๆ บ้างครับ อิอิ

คือว่า ผมเชื่อว่า หลายท่าน อาจมี UI ที่มีปุ่ม ที่เมื่อกดปุ่ม แล้วเปิดฟอร์มใหม่ อะไรแบบนี้

image

แล้วโค๊ดก็อาจจะเป็นคล้ายๆ แบบนี้

private void button1_Click(object sender, EventArgs e)
{
    Form2 f = new Form2();
    f.Show();
}

ซึ่งก็ไม่มีอะไรผิดครับ เปิดฟอร์มได้ เวลาคนใช้กดปิด (กากบาท) ไป ฟอร์มก็หายไป ไม่มีอะไร แต่ลืมอะไรสำคัญไปหรือเปล่าครับ...

กากบาท = Minimize ใน Windows Mobile

เพราะว่า โปรแกรมเนี่ย มันอยู่ใน Flash Memory ซึ่งการอ่านข้อมูล โหลดโปรแกรมใหม่ จาก Flash เนี่ย ทั้งกิน CPU และกินไฟมากกว่าปล่อยเอาไว้ในแรมครับ (ไปกินแรมแทน) ซึ่งโปรแกรมที่ดี ก็จะสามารถรองรับคำสั่ง "Hibernate" ระดับโปรแกรม ที่ Windows Mobile สั่งได้ เวลาแรมเหลือน้อย

สิ่งที่เกิดขึ้น หลังผมเปิดๆ ปิดๆ หลายๆ รอบ ก็คือ

image

Form2 ยังอยู่กันเพียบเลยครับ เพราะเรากด Minimize ไปนั่นเอง ทีนี้ทำยังไงดีละ? เราก็ต้องไม่ให้ Form2 มีมากกว่า 1 ตัว ครับ ซึ่งก็ทำได้ง่ายๆ โดยการสร้างตัวแปรกลางไว้ซักทีหนึ่ง แต่ที่ผมชอบทำ จะใส่ไว้ในคลาส Program และเขียนแบบนี้ครับ

namespace SmartDeviceProject1
{
    static class Program
    {
        private static Form2 _Form2;
        public static Form2 Form2
        {
            get
            {
                if (_Form2 == null)
                {
                    _Form2 = new Form2();
                }
                return _Form2;
            }
        }

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [MTAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
    }
}

จากนั้น ถ้าเราต้องการ Show Form2 ขึ้นมา ก็เขียนโค๊ดแบบนี้

private void button1_Click(object sender, EventArgs e)
{
    // OUTDATED!
    //Form2 f = new Form2();
    //f.Show();

    Program.Form2.Show();
}

มันทำงานยังไง???

ลองดูในคลาส Program นะครับ จะเห็นว่า ผมประกาศ ตัวแปร (และ Property) ไว้เป็น static (shared ใน VB) ซึ่งการประกาศแบบนี้ จะทำให้ ตัวแปร เป็นตัวแปรของคลาส ไม่ใช่ตัวแปรของ Instance เหมือนปกติ ซึ่งถ้าลองนึกย้อนถึง OOP ก็จะพอจะนึกออกว่า คลาส คือ แบบแปลน ในการสร้าง ออบเจ็กต์ ที่เป็น Instance ของคลาสนั้น ใช่มั๊ยละครับ? Smile ดังนั้น ผมจึงสามารถใช้ Program.Form2 ได้เลย แทนที่จะต้อง Program p = new Program() แล้วใช้ p.Form2

และการทำแบบนี้ อาจเรียกได้ว่า คล้ายกับ Singleton Pattern ครับ นั่นคือ ทั้งโปรแกรม จะไม่มี Instance ของคลาสนี้ ได้มากกว่า 1 ตัว (ถ้าทุกคนใช้ Program.Form2 หมด) เช่น คลาสที่ทำหน้าที่จัดการฐานข้อมูล หรือทำหน้าที่คล้าย Module แบบใน VB.NET เป็นต้น ซึ่งถ้าอยากให้เป็น Singleton แบบสมบูรณ์นั้น จะทำในคลาส Program ไม่ได้ครับ ต้องทำใน คลาส Form2 ครับ

 

public partial class Form2 : Form
{
    private static Form2 _Default;
    public static Form2 Default
    {
        get
        {
            if (_Default == null)
            {
                // can instantiate becuase 'we' are
                // form2 and can access 'private' members
                _Default = new Form2();
            }
            return _Default;
        }
    }

    private Form2()
    {
        InitializeComponent();
        
        //Usage
        //Form2.Default.Show();
    }
}

 

ซึ่งแบบนี้ จะเป็นการทำให้คลาสอื่น นอกจากคลาส Form2 ไม่สามารถ new Form2() ขึ้นมาได้เลย ดังนั้น โปรแกรมเมอร์จึงถูกบังคับไปในตัวว่า จะต้องใช้ Form2.Default เท่านั้น ถ้าจะเรียกใช้งาน Member ที่เป็น Instance Member (ไม่ได้ประกาศเป็น Static ไว้) และมีผลต่อเนื่องให้ทั้งโปรแกรม มี Form2 ได้ Instance เดียว ก็คือ _Default ครับ Smile

แล้วจะสังเกตว่า ผมไม่ได้สั่ง _Form2 = new Form2() ไว้เลยตั้งแต่แรก นั่นเพราะว่า ผมทำงานแบบขี้เกียจครับ นั่นคือ รอให้มีคนมาเรียกเอา Program.Form2 ไปใช้ก่อน แล้วจึงค่อย New ที่ต้องทำแบบนี้ เพราะว่า ถ้าเกิด Form2 ผมซับซ้อนมากๆ คนใช้เขาก็จะต้องรอเปิดโปรแกรมนาน เพราะต้องรอ New Form2 ให้เสร็จก่อน...แล้วยิ่งถ้ามีหลายฟอร์มอีก งานเข้าเลยทีนี้ ถ้าทำแบบนี้ คนใช้ เขาก็จะรอแค่ครั้งแรก ครั้งเดียวครับ ครั้งต่อไปมันก็เร็วละ

หวังว่าคงมีประโยชน์นะครับ Smile

 

sukimplee said:

ขอบคุณครับ

April 29, 2008 2:09 PM
(required)  
(optional)
(required)  
Add
Google
คอแหลม
โฆษณาออนไลน์,
				โฆษณา,ออนไลน์,ลงโฆษณา,ประกาศ,online advertising,online
				,advertising,โปรโมทสินค้า,โปรโมทเว็บไซต์,promote website,
				seo,pay per click,ad per click,media,ค้นหาเว็บ,media,
				สื่อ