Rabu, 20 Oktober 2010

Mengakses Method Suatu Form dari Form lain (SDI Form)

ok, melanjuti postingan blog yang sebelumnya, kalau dipostingan sebelumnya, kondisi Form1 dan Form2 adalah Form1 sebagai MDIContainer dan Form2 sebagai Child Form dari Form1. muncul pertanyaan, gimana jika Form1 dan Form2 sama-sama merupakan SDI Form (Form1 bukan merupakan MDI Container), jika tetap menggunakan pendekatan yang ada dipostingan sebelumnya, ternyata teknik yang diterapkan menjadi tidak sukses alias gagal. untuk menanggulanginya, bisa digunakan Delegate untuk membypass method yang akan diakses dari Form2. lengkap nya bisa dilihat pada bagian bawah ini:

clip_image002

clip_image004

Code Program.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Code Form1.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        // delegate dan method yang akan diassign ke delegate
        public delegate void SetTextDelegate(string s);
        public void OnSetText(string s) { this.Text = s; }

        // delegate dan method yang akan diassign ke delegate
        public delegate string GetTextDelegate();
        public string OnGetText() { return "This Is Text From Form 1"; }

        public Form1()
        {
            InitializeComponent();
        }

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

    }
}

Code Form2.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        // mendelegasikan delegate yang sudah dicreate dari Form1
        Form1.SetTextDelegate setText =
                 new Form1.SetTextDelegate((Form1.ActiveForm as Form1).OnSetText);
        Form1.GetTextDelegate getText =
                 new Form1.GetTextDelegate((Form1.ActiveForm as Form1).OnGetText);

        private void button1_Click(object sender, EventArgs e)
        {
            // mengakses variable  delegate yang sudah dipersiapkan.
            setText("This Text is Set From Form 2");
            this.Text = getText();
        }
    }
}

sedangkan untuk VB.NET, karena defaultnya semua form ada instance staticnya, untuk mengakses method pada Form1 dari Form2 dapat dilakukan dengan lebih mudah, yaitu dengan memanggil static instance defaultnya, seperti yang ditunjukkan pada potongan code di bawah ini

Potongan Code Form2

Me.Text = Form1.GetText()
Form1.SetText(“Hello Form1 Set From Form2”)

Ok, Semoga Bermanfaat

Rgds
Adi

Tidak ada komentar: